Coverage report: 93%

Files Functions Classes

coverage.py v7.16.0, created at 2026-09-06 15:42 +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% 23 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% 30 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   100% 10 0   100%
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   98% 41 1 0   93% 14 1   96%
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% 16 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% 6 0 0   100% 0 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/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% 24 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% 3 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/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._valid_unique_indices   100% 10 0 0   100% 8 0   100%
src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py CrossEngineFilter.filter_results   100% 48 0 0   100% 22 0   100%
src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py (no function)   100% 9 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._valid_unique_indices   93% 14 1 0   92% 12 1   92%
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% 8 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py _is_likely_conference   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py _sanitize_name   83% 6 1 0   50% 2 1   75%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py _format_affiliations   13% 15 13 0   8% 12 1   11%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py _start_background_journal_fetch   0% 11 11 0   0% 4 0   0%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py _start_background_journal_fetch._run   0% 7 7 0   100% 0 0   0%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__init__   100% 25 0 0   100% 12 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__searxng_failures   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__reset_searxng_failures   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__bump_searxng_failures   100% 3 0 0   100% 0 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._should_skip_journal_fetch_for_scope   86% 14 2 0   100% 2 0   88%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.create_default   100% 15 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__db_session   100% 6 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__clean_journal_name   100% 9 0 0   100% 4 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__regex_clean_journal_name   100% 26 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__llm_clean_journal_name   64% 11 4 0   50% 2 1   62%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__analyze_journal_reputation   89% 27 3 0   75% 12 3   85%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__save_llm_score_to_db   43% 7 4 0   50% 2 1   44%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter._save_journal_to_db_inner   0% 41 41 0   0% 4 0   0%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__score_journal   84% 89 14 0   67% 46 9   79%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.filter_results   70% 77 23 0   62% 32 4   68%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.filter_results._handle_no_venue   50% 12 6 0   50% 6 1   50%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py (no function)   100% 53 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 3 0   95% 60 3   97%
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   94% 17 1 0   75% 4 1   90%
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/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% 11 0 0   100% 10 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/parallel_search.py run_parallel_searches   100% 9 0 0   100% 4 0   100%
src/local_deep_research/advanced_search_system/parallel_search.py run_parallel_searches._worker   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/parallel_search.py (no function)   100% 6 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/questions/__init__.py (no function)   100% 7 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% 13 0 0   100% 8 0   100%
src/local_deep_research/advanced_search_system/questions/atomic_fact_question.py AtomicFactQuestionGenerator._generate_gap_filling_questions   100% 14 0 0   100% 10 0   100%
src/local_deep_research/advanced_search_system/questions/atomic_fact_question.py (no function)   100% 8 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% 14 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   95% 81 4 0   88% 58 7   92%
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% 9 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% 5 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% 12 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/questions/standard_question.py StandardQuestionGenerator.generate_sub_questions   100% 16 0 0   83% 6 1   95%
src/local_deep_research/advanced_search_system/questions/standard_question.py (no function)   100% 8 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/repositories/__init__.py (no function)   100% 2 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/base.py BaseSummarizer.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/base.py BaseSummarizer.summarize   100% 10 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/summarization/base.py BaseSummarizer._build_prompt   100% 0 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/base.py BaseSummarizer._truncate   100% 3 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/summarization/base.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/focused.py FocusedSummarizer.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/focused.py FocusedSummarizer._build_prompt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/summarization/focused.py (no function)   100% 5 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/advanced_search_system/tools/fetch/__init__.py _scrub_tool_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _register_in_collector   100% 16 0 0   88% 8 1   96%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _enforce_url_policy   100% 6 0 0   100% 4 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _denial_reason   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _try_resolve_url   100% 28 0 0   100% 22 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _fetch_raw_content   100% 18 0 0   100% 8 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_full_fetch_tool   100% 4 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_full_fetch_tool.fetch_content   100% 18 0 0   100% 4 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_summary_fetch_tool   100% 6 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_summary_fetch_tool.fetch_content   87% 38 5 0   92% 12 1   88%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py build_fetch_tool   100% 13 0 0   100% 12 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py (no function)   100% 27 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py _decode_segment   75% 4 1 0   50% 2 1   67%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py _parse_library_reference   96% 28 1 0   95% 20 1   96%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py parse_library_url   100% 4 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py is_citation_reference   100% 6 0 0   100% 4 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py resolve_library_document   98% 41 1 0   94% 18 1   97%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py make_library_resolver   100% 3 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py make_library_resolver._resolve   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py resolve_citation_reference   89% 9 1 0   83% 6 1   87%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py (no function)   100% 26 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/prompts.py (no function)   100% 4 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   84% 31 5 0   94% 16 1   87%
src/local_deep_research/api/research_functions.py quick_summary   98% 49 1 0   96% 26 1   97%
src/local_deep_research/api/research_functions.py generate_report   93% 45 3 0   83% 24 4   90%
src/local_deep_research/api/research_functions.py detailed_research   97% 29 1 0   86% 14 2   93%
src/local_deep_research/api/research_functions.py analyze_documents   98% 46 1 0   92% 12 1   97%
src/local_deep_research/api/research_functions.py (no function)   100% 22 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   78% 18 4 0   90% 10 1   82%
src/local_deep_research/api/settings_utils.py InMemorySettingsManager.get_setting   100% 9 0 0   100% 6 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% 10 0 0   100% 8 0   100%
src/local_deep_research/api/settings_utils.py InMemorySettingsManager.load_from_defaults_file   100% 7 0 0   100% 4 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% 25 0 0   100% 16 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% 6 0 0   100% 4 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 _ensure_plotting_loaded   100% 4 0 0   100% 2 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% 24 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/comparison/evaluator.py _create_metric_comparison_chart   100% 31 0 0   100% 14 0   100%
src/local_deep_research/benchmarks/comparison/evaluator.py _create_spider_chart   100% 38 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% 43 0 0   100% 14 0   100%
src/local_deep_research/benchmarks/comparison/evaluator.py (no function)   100% 23 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   100% 37 0 0   100% 14 0   100%
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   100% 2 0 0   100% 0 0   100%
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% 10 0 0   100% 4 0   100%
src/local_deep_research/benchmarks/datasets/xbench_deepsearch.py XBenchDeepSearchDataset.load_data   94% 31 2 0   83% 6 1   92%
src/local_deep_research/benchmarks/datasets/xbench_deepsearch.py XBenchDeepSearchDataset._load_from_url   92% 25 2 0   83% 6 1   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 (no function)   87% 23 3 0   100% 0 0   87%
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% 4 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/metrics/calculation.py calculate_metrics   100% 46 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   96% 55 2 0   90% 30 3   94%
src/local_deep_research/benchmarks/metrics/reporting.py (no function)   100% 5 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/metrics/statistics.py normal_quantile   100% 17 0 0   100% 6 0   100%
src/local_deep_research/benchmarks/metrics/statistics.py wilson_score_interval   100% 13 0 0   100% 4 0   100%
src/local_deep_research/benchmarks/metrics/statistics.py proportion_std_error   100% 5 0 0   100% 4 0   100%
src/local_deep_research/benchmarks/metrics/statistics.py sample_size_for_difference   100% 13 0 0   100% 10 0   100%
src/local_deep_research/benchmarks/metrics/statistics.py (no function)   100% 5 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/models/__init__.py (no function)   100% 2 0 0   100% 0 0   100%
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 (no function)   100% 7 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 _ensure_plotting_loaded   100% 5 0 0   100% 2 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% 13 0 0   100% 4 0   100%
src/local_deep_research/benchmarks/optimization/optuna_optimizer.py OptunaOptimizer._create_quick_visualizations   100% 11 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/optimization/optuna_optimizer.py OptunaOptimizer._create_optuna_visualizations   69% 32 10 0   75% 8 2   70%
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)   98% 43 1 0   50% 2 1   96%
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% 2 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py SocketIOService.emit_to_subscribers   100% 2 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py SocketIOService.emit_to_room   100% 2 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py _required_persistence_fields   67% 6 2 0   50% 4 2   60%
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% 5 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.start_benchmark   98% 46 1 0   88% 8 1   96%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService._run_benchmark_thread   97% 71 2 0   73% 22 6   91%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService._create_task_queue   100% 11 0 0   100% 6 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._persist_unsaved_results   100% 21 0 0   100% 6 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService._run_key   100% 1 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService._run_owner   67% 3 1 0   50% 2 1   60%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService.sync_pending_results   100% 25 0 0   88% 8 1   97%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService.get_result_persistence_error   100% 4 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService._sync_results_to_database   100% 40 0 0   94% 16 1   98%
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   100% 8 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService.get_benchmark_status   100% 47 0 0   94% 16 1   98%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService.cancel_benchmark   100% 10 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/web_api/benchmark_service.py (no function)   100% 60 0 0   100% 0 0   100%
src/local_deep_research/chat/__init__.py (no function)   100% 2 0 0   100% 0 0   100%
src/local_deep_research/chat/context.py ChatContextManager.__init__   100% 6 0 0   100% 2 0   100%
src/local_deep_research/chat/context.py ChatContextManager.build_research_context   100% 4 0 0   100% 0 0   100%
src/local_deep_research/chat/context.py ChatContextManager._select_prior_findings   100% 16 0 0   100% 12 0   100%
src/local_deep_research/chat/context.py ChatContextManager._build_conversation_text   90% 21 2 0   83% 12 2   88%
src/local_deep_research/chat/context.py ChatContextManager._summarize_prior_work   91% 11 1 0   50% 2 1   85%
src/local_deep_research/chat/context.py ChatContextManager._extract_findings_from_history   100% 12 0 0   88% 8 1   95%
src/local_deep_research/chat/context.py ChatContextManager._get_key_entities   100% 2 0 0   100% 0 0   100%
src/local_deep_research/chat/context.py ChatContextManager._get_topics   100% 2 0 0   100% 0 0   100%
src/local_deep_research/chat/context.py ChatContextManager.extract_context_updates   100% 1 0 0   100% 0 0   100%
src/local_deep_research/chat/context.py ChatContextManager._create_summary   92% 12 1 0   90% 10 1   91%
src/local_deep_research/chat/context.py (no function)   100% 19 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py _serialize_dt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py ChatService.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py ChatService._atomic_increment   100% 2 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py ChatService.create_session   100% 12 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py ChatService.regenerate_title_with_llm   94% 16 1 0   83% 6 1   91%
src/local_deep_research/chat/service.py ChatService.add_message   100% 10 0 0   100% 2 0   100%
src/local_deep_research/chat/service.py ChatService.insert_message_in_db   96% 23 1 0   83% 6 1   93%
src/local_deep_research/chat/service.py ChatService.add_progress_step   100% 16 0 0   100% 4 0   100%
src/local_deep_research/chat/service.py ChatService.get_session   75% 12 3 0   100% 2 0   79%
src/local_deep_research/chat/service.py ChatService.get_session_messages   100% 29 0 0   100% 8 0   100%
src/local_deep_research/chat/service.py ChatService.get_in_progress_research_id   100% 7 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py ChatService.list_sessions   70% 10 3 0   100% 2 0   75%
src/local_deep_research/chat/service.py ChatService.update_session_title   73% 11 3 0   100% 2 0   77%
src/local_deep_research/chat/service.py ChatService.reactivate_session   75% 12 3 0   100% 2 0   79%
src/local_deep_research/chat/service.py ChatService.archive_session   82% 17 3 0   100% 4 0   86%
src/local_deep_research/chat/service.py ChatService.delete_session   80% 15 3 0   100% 4 0   84%
src/local_deep_research/chat/service.py ChatService.delete_attempt   85% 41 6 0   81% 16 3   84%
src/local_deep_research/chat/service.py ChatService.get_original_attempt_query   84% 25 4 0   75% 12 3   81%
src/local_deep_research/chat/service.py ChatService.update_accumulated_context   88% 25 3 0   100% 8 0   91%
src/local_deep_research/chat/service.py ChatService._fallback_title   100% 5 0 0   100% 4 0   100%
src/local_deep_research/chat/service.py ChatService._generate_title   100% 24 0 0   100% 8 0   100%
src/local_deep_research/chat/service.py (no function)   100% 41 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.set_stream_callback   100% 2 0 0   50% 2 1   75%
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% 9 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% 4 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler.set_stream_callback   100% 1 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._invoke_with_streaming   94% 18 1 0   100% 8 0   96%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._invoke_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler.get_setting   100% 3 0 0   100% 2 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._no_sources_response   100% 3 0 0   100% 0 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% 21 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/forced_answer_citation_handler.py ForcedAnswerCitationHandler.analyze_initial   100% 9 0 0   100% 2 0   100%
src/local_deep_research/citation_handlers/forced_answer_citation_handler.py ForcedAnswerCitationHandler.analyze_followup   100% 14 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% 9 0 0   100% 2 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% 9 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/precision_extraction_handler.py PrecisionExtractionHandler.analyze_followup   100% 10 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% 30 0 0   75% 20 5   90%
src/local_deep_research/citation_handlers/precision_extraction_handler.py PrecisionExtractionHandler._extract_single_answer   100% 12 0 0   100% 2 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% 12 0 0   100% 4 0   100%
src/local_deep_research/citation_handlers/precision_extraction_handler.py PrecisionExtractionHandler._extract_temporal   100% 15 0 0   100% 6 0   100%
src/local_deep_research/citation_handlers/precision_extraction_handler.py PrecisionExtractionHandler._extract_number   100% 12 0 0   100% 4 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% 13 0 0   100% 4 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% 4 0 0   100% 0 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% 2 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py get_llm   97% 74 2 0   93% 46 3   96%
src/local_deep_research/config/llm_config.py _log_llm_error   100% 2 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._normalize_response   100% 6 0 0   100% 6 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._log_llm_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.invoke   100% 6 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.ainvoke   50% 6 3 0   100% 0 0   50%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.__getattr__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.close   100% 5 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.bind_tools   100% 2 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py wrap_llm_without_think_tags   100% 26 0 0   100% 20 0   100%
src/local_deep_research/config/llm_config.py (no function)   100% 26 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_data_directory   100% 13 0 0   100% 6 0   100%
src/local_deep_research/config/paths.py _ensure_dir   100% 5 0 0   100% 2 0   100%
src/local_deep_research/config/paths.py get_research_outputs_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_journal_data_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_cache_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_logs_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_encrypted_database_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_user_database_filename   100% 4 0 0   100% 2 0   100%
src/local_deep_research/config/paths.py get_library_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_config_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_models_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_backup_directory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py get_user_backup_directory   100% 8 0 0   100% 2 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% 19 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% 37 0 0   100% 26 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 _get_optional_setting   91% 11 1 0   88% 8 1   89%
src/local_deep_research/config/thread_settings.py (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/constants.py get_available_strategies   100% 1 0 0   100% 0 0   100%
src/local_deep_research/constants.py (no function)   100% 63 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/__init__.py __getattr__   100% 5 0 0   100% 2 0   100%
src/local_deep_research/content_fetcher/__init__.py __dir__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/__init__.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.__init__   100% 5 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher._get_downloader   94% 49 3 0   100% 18 0   96%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher._apply_egress_policy_to_downloader   100% 11 0 3   100% 8 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.fetch   100% 54 0 0   96% 28 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   100% 3 0 0   100% 2 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.__enter__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.__exit__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/fetcher.py (no function)   100% 19 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   92% 12 1 0   90% 10 1   91%
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   85% 13 2 0   50% 2 1   80%
src/local_deep_research/database/alembic_runner.py _drop_orphan_alembic_temp_tables   100% 7 0 0   100% 4 0   100%
src/local_deep_research/database/alembic_runner.py _disable_fk_for_migration   100% 6 0 0   100% 2 0   100%
src/local_deep_research/database/alembic_runner.py _restore_fk_after_migration   79% 19 4 0   100% 2 0   81%
src/local_deep_research/database/alembic_runner.py run_migrations   95% 56 3 0   85% 20 1   92%
src/local_deep_research/database/alembic_runner.py (no function)   100% 22 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% 11 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% 6 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor.__new__   100% 5 0 0   75% 4 1   89%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor.__init__   100% 8 0 0   100% 2 0   100%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor.submit_backup   100% 9 0 0   100% 2 0   100%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor._run_backup   100% 10 0 0   100% 2 0   100%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor._backup_completed   100% 6 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor.shutdown   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_executor.py BackupExecutor.get_pending_count   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_executor.py get_backup_executor   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_executor.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 is_safe_glob_result   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py pop_user_lock   100% 1 0 0   100% 0 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% 16 0 0   100% 6 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._create_backup_impl   89% 66 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% 32 0 0   100% 0 0   100%
src/local_deep_research/database/base.py (no function)   100% 2 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 _best_effort_chmod   100% 5 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py _remove_partial_user_db_files   82% 11 2 0   100% 2 0   85%
src/local_deep_research/database/encrypted_db.py DatabaseManager.__init__   100% 10 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._ensure_data_dir   100% 8 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.data_dir   100% 5 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.data_dir   100% 3 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   100% 72 0 0   100% 14 0   100%
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._compute_verifier_digest   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._make_verifier   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._cache_connection   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._record_password_verifier   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._verifier_matches   100% 5 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._cached_engine_trusted   100% 3 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._password_matches_cached   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._get_init_lock   100% 6 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.open_user_database   100% 19 0 0   100% 8 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._run_phase2_rekey   100% 7 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._open_user_database_cold   89% 53 6 0   83% 12 2   88%
src/local_deep_research/database/encrypted_db.py DatabaseManager._open_user_database_cold.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._checkpoint_wal   86% 7 1 0   50% 2 1   78%
src/local_deep_research/database/encrypted_db.py DatabaseManager.close_user_database   100% 10 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.close_all_databases   100% 10 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.check_database_integrity   100% 20 0 0   100% 6 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.change_password   100% 22 0 0   100% 6 0   100%
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   100% 13 0 0   88% 8 1   95%
src/local_deep_research/database/encrypted_db.py (no function)   100% 58 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 _get_user_init_lock   100% 6 0 0   100% 2 0   100%
src/local_deep_research/database/library_init.py pop_user_init_lock   100% 1 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% 17 0 0   100% 0 0   100%
src/local_deep_research/database/models/__init__.py (no function)   100% 25 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% 103 0 0   100% 0 0   100%
src/local_deep_research/database/models/chat.py ChatSession.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/chat.py ChatMessage.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/chat.py ChatProgressStep.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/chat.py (no function)   100% 56 0 0   100% 0 0   100%
src/local_deep_research/database/models/citation.py Paper.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/citation.py PaperAppearance.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/citation.py (no function)   100% 30 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% 43 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/journal.py Journal.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/journal.py (no function)   100% 13 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.__init__   100% 2 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% 297 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 (no function)   100% 16 0 0   100% 0 0   100%
src/local_deep_research/database/models/metrics.py TokenUsage.__repr__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/models/metrics.py ModelUsage.__repr__   100% 1 0 0   100% 0 0   100%
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__   100% 1 0 0   100% 0 0   100%
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 NewsSubscription.active_filter   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/models/news.py NewsSubscription.due_filter   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/models/news.py SubscriptionFolder.to_dict   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/models/news.py (no function)   100% 114 0 0   100% 0 0   100%
src/local_deep_research/database/models/note.py NoteVersion.__repr__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/models/note.py NoteLink.__repr__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/models/note.py NoteResearch.__repr__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/models/note.py NoteReference.__repr__   0% 3 3 0   100% 0 0   0%
src/local_deep_research/database/models/note.py NoteSynthesis.__repr__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/models/note.py NoteSynthesisSource.__repr__   0% 3 3 0   100% 0 0   0%
src/local_deep_research/database/models/note.py (no function)   100% 87 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% 128 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% 53 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   100% 1 0 0   100% 0 0   100%
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/models/zotero.py ZoteroSyncState.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/zotero.py ZoteroItemMap.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/zotero.py (no function)   100% 34 0 0   100% 0 0   100%
src/local_deep_research/database/pool_config.py (no function)   100% 4 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% 5 0 0   100% 2 0   100%
src/local_deep_research/database/queue_service.py UserQueueService.update_task_status   100% 17 0 0   100% 12 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_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% 17 0 0   100% 0 0   100%
src/local_deep_research/database/session_context.py safe_rollback   100% 20 0 0   100% 4 0   100%
src/local_deep_research/database/session_context.py get_user_db_session   100% 31 0 0   94% 18 1   98%
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 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.get_any_session_password   80% 10 2 0   62% 8 1   72%
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 capture_request_db_password   100% 9 0 0   100% 2 0   100%
src/local_deep_research/database/session_passwords.py (no function)   100% 14 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% 12 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% 8 0 0   100% 2 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   100% 12 0 0   100% 4 0   100%
src/local_deep_research/database/sqlcipher_utils.py warn_if_weak_kdf_with_existing_databases   100% 8 0 0   100% 4 0   100%
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   90% 10 1 0   75% 4 1   86%
src/local_deep_research/database/sqlcipher_utils.py apply_performance_pragmas   88% 16 2 0   50% 4 2   80%
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% 42 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.enter_scope   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/thread_local_session.py ThreadLocalSessionManager.exit_scope   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/thread_local_session.py ThreadLocalSessionManager.in_scope   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/thread_local_session.py ThreadLocalSessionManager.get_session   95% 42 2 0   90% 10 1   94%
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.reset_session_if_matches   88% 8 1 0   83% 6 1   86%
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.clear_credentials_for_user   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   57% 14 6 0   100% 0 0   57%
src/local_deep_research/database/thread_local_session.py clear_user_credentials   40% 5 3 0   100% 0 0   40%
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__   90% 20 2 0   100% 0 0   90%
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% 36 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.clear_passwords   100% 2 0 0   100% 2 0   100%
src/local_deep_research/database/thread_metrics.py ThreadSafeMetricsWriter.get_session   100% 24 0 0   86% 14 2   95%
src/local_deep_research/database/thread_metrics.py ThreadSafeMetricsWriter.write_token_metrics   100% 14 0 0   100% 4 0   100%
src/local_deep_research/database/thread_metrics.py (no function)   100% 15 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   89% 35 4 0   100% 8 0   91%
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 _module_available   50% 4 2 0   100% 0 0   50%
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)   96% 95 4 0   73% 26 5   91%
src/local_deep_research/document_loaders/xls_loader.py XLSLoader.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/xls_loader.py XLSLoader.lazy_load   94% 18 1 0   80% 10 2   89%
src/local_deep_research/document_loaders/xls_loader.py XLSLoader.load   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/xls_loader.py (no function)   100% 10 0 0   100% 0 0   100%
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% 22 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   94% 32 2 0   88% 16 2   92%
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% 27 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% 16 0 0   100% 6 0   100%
src/local_deep_research/embeddings/providers/implementations/ollama.py OllamaEmbeddingsProvider.is_available   67% 12 4 0   100% 0 0   67%
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% 22 0 0   100% 8 0   100%
src/local_deep_research/embeddings/providers/implementations/ollama.py (no function)   100% 27 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/openai.py OpenAIEmbeddingsProvider.create_embeddings   100% 39 0 0   100% 24 0   100%
src/local_deep_research/embeddings/providers/implementations/openai.py OpenAIEmbeddingsProvider.is_available   100% 11 0 0   100% 2 0   100%
src/local_deep_research/embeddings/providers/implementations/openai.py OpenAIEmbeddingsProvider.get_available_models   96% 27 1 0   90% 10 1   95%
src/local_deep_research/embeddings/providers/implementations/openai.py (no function)   100% 22 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider.create_embeddings   100% 28 0 0   100% 12 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._is_model_cached_locally   100% 13 0 2   100% 8 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._confined_local_model_path   97% 30 1 4   88% 16 2   93%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._looks_like_filesystem_path   83% 12 2 0   80% 10 2   82%
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% 27 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/bounded_semantic_chunker.py _DocumentSplitter.split_documents   100% 0 0 0   100% 0 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py BoundedSemanticChunker.__init__   100% 9 0 0   100% 2 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py BoundedSemanticChunker.__init__.create_boundary_splitter   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py BoundedSemanticChunker.split_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py BoundedSemanticChunker.create_documents   100% 3 0 0   100% 0 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py BoundedSemanticChunker.split_documents   100% 6 0 0   100% 2 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py BoundedSemanticChunker.transform_documents   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/splitters/bounded_semantic_chunker.py (no function)   100% 13 0 3   50% 2 1   93%
src/local_deep_research/embeddings/splitters/text_splitter_registry.py get_text_splitter   100% 50 0 0   95% 22 1   99%
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% 8 0 2   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   81% 37 7 0   75% 16 2   79%
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/openai_compat_errors.py _strip_credentials   86% 14 2 0   100% 8 0   91%
src/local_deep_research/error_handling/openai_compat_errors.py _is_dispatchable   100% 1 0 0   100% 0 0   100%
src/local_deep_research/error_handling/openai_compat_errors.py _walk_cause   100% 10 0 0   100% 4 0   100%
src/local_deep_research/error_handling/openai_compat_errors.py _dispatch   94% 18 1 0   94% 16 1   94%
src/local_deep_research/error_handling/openai_compat_errors.py _dispatch._is   100% 2 0 0   100% 0 0   100%
src/local_deep_research/error_handling/openai_compat_errors.py is_openai_compat_runtime_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/error_handling/openai_compat_errors.py friendly_openai_compatible_error   100% 6 0 0   100% 0 0   100%
src/local_deep_research/error_handling/openai_compat_errors.py (no function)   90% 21 2 0   100% 0 0   90%
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% 7 0 0   100% 6 0   100%
src/local_deep_research/error_handling/report_generator.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/exceptions.py (no function)   100% 10 0 0   100% 0 0   100%
src/local_deep_research/exporters/__init__.py (no function)   83% 12 2 0   100% 0 0   83%
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   97% 35 1 0   92% 12 1   96%
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% 0 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% 15 0 0   100% 2 0   100%
src/local_deep_research/exporters/pdf_exporter.py (no function)   100% 15 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 (no function)   100% 8 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   100% 6 0   94%
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/journal_quality/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/__init__.py get_source   75% 4 1 0   75% 4 1   75%
src/local_deep_research/journal_quality/data_sources/__init__.py (no function)   100% 10 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py s3_to_https   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py validate_manifest_entries   100% 4 0 0   100% 4 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py iter_partitions   100% 16 0 0   100% 4 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py iter_partitions.decode   93% 14 1 0   88% 8 1   91%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py (no function)   100% 13 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/base.py DataSource.fetch   100% 0 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/base.py DataSource.is_present   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/base.py DataSource.ensure   0% 13 13 0   0% 4 0   0%
src/local_deep_research/journal_quality/data_sources/base.py DataSource.status_dict   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/base.py (no function)   100% 23 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/doaj.py DOAJSource.fetch   0% 24 24 0   0% 6 0   0%
src/local_deep_research/journal_quality/data_sources/doaj.py (no function)   100% 29 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/institutions.py InstitutionSource.fetch   82% 51 9 0   60% 20 6   76%
src/local_deep_research/journal_quality/data_sources/institutions.py (no function)   100% 25 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/jabref.py JabRefSource.fetch   0% 36 36 0   0% 16 0   0%
src/local_deep_research/journal_quality/data_sources/jabref.py (no function)   100% 24 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/openalex.py OpenAlexSource.fetch   86% 58 8 0   73% 22 6   82%
src/local_deep_research/journal_quality/data_sources/openalex.py (no function)   100% 25 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/predatory.py PredatorySource.fetch   89% 28 3 0   64% 14 3   81%
src/local_deep_research/journal_quality/data_sources/predatory.py PredatorySource.fetch._read_csv   100% 5 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/predatory.py (no function)   100% 24 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._resolve_db_path   100% 2 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._ensure_engine   100% 16 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._ensure_engine._make_ro_conn   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._warn_on_stale_data_version   87% 15 2 0   100% 6 0   90%
src/local_deep_research/journal_quality/db.py JournalQualityDB._validate_existing_db   100% 17 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._unlink_unusable_db   100% 8 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._build_or_raise   70% 10 3 0   50% 4 2   64%
src/local_deep_research/journal_quality/db.py JournalQualityDB.session   92% 12 1 0   50% 2 1   86%
src/local_deep_research/journal_quality/db.py JournalQualityDB.available   100% 5 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.reset   100% 6 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_openalex   100% 8 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.count_predatory_by_names   0% 12 12 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_sources_batch   87% 23 3 0   80% 10 2   85%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_doaj   85% 13 2 0   100% 4 0   88%
src/local_deep_research/journal_quality/db.py JournalQualityDB.is_in_doaj   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.is_predatory   55% 20 9 0   29% 14 4   44%
src/local_deep_research/journal_quality/db.py JournalQualityDB.is_whitelisted   0% 6 6 0   0% 4 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_institution   0% 18 18 0   0% 6 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.score_from_affiliations   0% 32 32 0   0% 22 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.expand_abbreviation   76% 17 4 0   50% 8 2   68%
src/local_deep_research/journal_quality/db.py JournalQualityDB._lookup_source_row   47% 43 23 0   39% 36 10   43%
src/local_deep_research/journal_quality/db.py JournalQualityDB._fetch_by_name_lower   100% 2 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_summary   0% 5 5 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_quality_distribution   0% 5 5 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_source_distribution   0% 5 5 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_journals_page   86% 22 3 0   83% 12 2   85%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_institutions_page   87% 15 2 0   50% 6 3   76%
src/local_deep_research/journal_quality/db.py _source_to_lookup_dict   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py _source_to_dashboard_dict   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py _institution_to_dict   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py _institution_to_dashboard_dict   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py get_db   100% 5 0 0   75% 4 1   89%
src/local_deep_research/journal_quality/db.py reset_db   0% 3 3 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py build_db   0% 65 65 0   0% 12 0   0%
src/local_deep_research/journal_quality/db.py _sweep_stale_tmp_files   80% 10 2 0   100% 6 0   88%
src/local_deep_research/journal_quality/db.py _load_openalex   0% 8 8 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py _load_doaj   0% 9 9 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py _load_predatory   0% 12 12 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py _load_institutions   0% 9 9 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py _load_abbreviations   0% 9 9 0   0% 2 0   0%
src/local_deep_research/journal_quality/db.py _populate_predatory   0% 11 11 0   0% 6 0   0%
src/local_deep_research/journal_quality/db.py _populate_sources   91% 76 7 0   85% 40 6   89%
src/local_deep_research/journal_quality/db.py _populate_institutions   89% 9 1 0   83% 6 1   87%
src/local_deep_research/journal_quality/db.py _populate_abbreviations   0% 11 11 0   0% 6 0   0%
src/local_deep_research/journal_quality/db.py build_reference_db   0% 1 1 0   100% 0 0   0%
src/local_deep_research/journal_quality/db.py (no function)   100% 84 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py get_download_state   100% 2 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py _set_source_state   100% 3 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py _get_data_dir   100% 2 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py _clear_orphan_sentinel_on_startup   43% 7 4 0   50% 2 1   44%
src/local_deep_research/journal_quality/downloader.py _fetch_openalex_sources   0% 1 1 0   100% 0 0   0%
src/local_deep_research/journal_quality/downloader.py _fetch_doaj_journals   0% 1 1 0   100% 0 0   0%
src/local_deep_research/journal_quality/downloader.py _fetch_predatory   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py _fetch_jabref_abbreviations   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py _fetch_institutions   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py get_journal_data_status   87% 15 2 0   100% 2 0   88%
src/local_deep_research/journal_quality/downloader.py download_journal_data   83% 106 18 0   81% 26 3   83%
src/local_deep_research/journal_quality/downloader.py download_journal_data._sentinel_owner_alive   27% 15 11 0   50% 2 1   29%
src/local_deep_research/journal_quality/downloader.py download_journal_data._try_claim_sentinel   100% 6 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/downloader.py download_journal_data._fetch_one   92% 13 1 0   50% 2 1   87%
src/local_deep_research/journal_quality/downloader.py download_journal_data._fetch_one._on_progress   0% 2 2 0   100% 0 0   0%
src/local_deep_research/journal_quality/downloader.py ensure_journal_data   84% 19 3 0   90% 10 1   86%
src/local_deep_research/journal_quality/downloader.py (no function)   100% 28 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/models.py (no function)   100% 49 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/scoring.py normalize_name   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/scoring.py derive_quality_score   100% 41 0 0   100% 38 0   100%
src/local_deep_research/journal_quality/scoring.py institution_score_from_h_index   100% 7 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/scoring.py (no function)   100% 7 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 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   94% 33 2 0   93% 30 2   94%
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% 17 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% 2 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 (no function)   100% 9 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% 39 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.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% 25 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__   75% 12 3 0   100% 0 0   75%
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._ns   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/llm_registry.py LLMRegistry.register   100% 10 0 0   100% 4 0   100%
src/local_deep_research/llm/llm_registry.py LLMRegistry.unregister   100% 7 0 0   100% 2 0   100%
src/local_deep_research/llm/llm_registry.py LLMRegistry.get   100% 8 0 0   100% 4 0   100%
src/local_deep_research/llm/llm_registry.py LLMRegistry.is_registered   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/llm_registry.py LLMRegistry.list_registered   100% 7 0 0   100% 2 0   100%
src/local_deep_research/llm/llm_registry.py LLMRegistry.clear   100% 6 0 0   100% 2 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% 23 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/_helpers.py get_context_window_for_provider   100% 9 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/_helpers.py compute_max_tokens   100% 10 0 0   100% 6 0   100%
src/local_deep_research/llm/providers/_helpers.py (no function)   100% 5 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% 31 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   100% 7 0 0   100% 4 0   100%
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% 28 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 BaseLLMProvider.resolve_api_key   100% 10 0 0   100% 6 0   100%
src/local_deep_research/llm/providers/base.py BaseLLMProvider.resolve_api_key_or_placeholder   100% 2 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/base.py BaseLLMProvider.build_bearer_header   100% 5 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/base.py BaseLLMProvider.has_api_key   100% 4 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/base.py (no function)   100% 22 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/anthropic.py AnthropicProvider.create_llm   92% 26 2 0   100% 10 0   94%
src/local_deep_research/llm/providers/implementations/anthropic.py AnthropicProvider.list_models_for_api   100% 24 0 0   88% 8 1   97%
src/local_deep_research/llm/providers/implementations/anthropic.py (no function)   100% 18 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/atlascloud.py AtlasCloudProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/atlascloud.py (no function)   100% 13 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/custom_anthropic_endpoint.py CustomAnthropicEndpointProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/custom_anthropic_endpoint.py CustomAnthropicEndpointProvider.is_available   100% 15 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/implementations/custom_anthropic_endpoint.py (no function)   100% 18 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% 17 0 0   100% 6 0   100%
src/local_deep_research/llm/providers/implementations/custom_openai_endpoint.py CustomOpenAIEndpointProvider.create_llm   100% 9 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/implementations/custom_openai_endpoint.py (no function)   100% 23 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/deepseek.py DeepseekProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/deepseek.py (no function)   100% 13 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% 26 0 0   100% 10 0   100%
src/local_deep_research/llm/providers/implementations/google.py (no function)   100% 17 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% 13 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/llamacpp.py LlamaCppProvider.create_llm   100% 6 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/llamacpp.py LlamaCppProvider.is_available   100% 9 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/llamacpp.py LlamaCppProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/llamacpp.py (no function)   100% 21 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/lmstudio.py LMStudioProvider._ensure_v1_suffix   100% 4 0 0   100% 2 0   100%
src/local_deep_research/llm/providers/implementations/lmstudio.py LMStudioProvider._get_auth_headers   100% 1 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 LMStudioProvider.list_models_for_api   100% 7 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/implementations/lmstudio.py (no function)   100% 27 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/ollama.py OllamaProvider._get_auth_headers   100% 4 0 0   100% 2 0   100%
src/local_deep_research/llm/providers/implementations/ollama.py OllamaProvider.list_models_for_api   100% 19 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/implementations/ollama.py OllamaProvider.create_llm   100% 23 0 0   100% 8 0   100%
src/local_deep_research/llm/providers/implementations/ollama.py OllamaProvider.is_available   90% 30 3 0   100% 4 0   91%
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% 28 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/openai.py OpenAIProvider.create_llm   100% 28 0 0   100% 6 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% 13 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/orcarouter.py OrcaRouterProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/orcarouter.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/requesty.py RequestyProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/requesty.py (no function)   100% 13 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% 13 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/openai_base.py OpenAICompatibleProvider.create_llm   100% 26 0 0   100% 8 0   100%
src/local_deep_research/llm/providers/openai_base.py OpenAICompatibleProvider._create_llm_instance   86% 21 3 0   83% 6 1   85%
src/local_deep_research/llm/providers/openai_base.py OpenAICompatibleProvider.is_available   100% 3 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% 6 0 0   75% 4 1   90%
src/local_deep_research/llm/providers/openai_base.py OpenAICompatibleProvider.list_models_for_api   100% 30 0 0   93% 14 1   98%
src/local_deep_research/llm/providers/openai_base.py OpenAICompatibleProvider.list_models   100% 11 0 0   50% 2 1   92%
src/local_deep_research/llm/providers/openai_base.py (no function)   100% 26 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/server.py _classify_error   100% 17 0 0   100% 14 0   100%
src/local_deep_research/mcp/server.py _policy_denied_response   100% 3 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py _validate_range   100% 12 0 0   100% 10 0   100%
src/local_deep_research/mcp/server.py _error_result   100% 4 0 0   100% 0 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% 2 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py _validate_questions_per_iteration   100% 2 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py _validate_max_results   100% 2 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py _validate_searches_per_section   100% 2 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py _validate_temperature   100% 2 0 0   100% 0 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% 17 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py detailed_research   100% 17 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py generate_report   100% 20 0 0   75% 4 1   96%
src/local_deep_research/mcp/server.py analyze_documents   100% 20 0 0   100% 4 0   100%
src/local_deep_research/mcp/server.py search   86% 35 5 0   70% 10 3   82%
src/local_deep_research/mcp/server.py _egress_audit_net   76% 17 4 0   100% 2 0   79%
src/local_deep_research/mcp/server.py _execute_search   100% 13 0 0   100% 6 0   100%
src/local_deep_research/mcp/server.py list_search_engines   100% 13 0 0   100% 2 0   100%
src/local_deep_research/mcp/server.py list_strategies   100% 5 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py get_configuration   100% 8 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py configure_mcp_logging   100% 5 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py run_server   100% 10 0 0   100% 0 0   100%
src/local_deep_research/mcp/server.py (no function)   98% 52 1 0   50% 2 1   96%
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% 14 0 0   100% 6 0   100%
src/local_deep_research/metrics/database.py (no function)   100% 9 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.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% 14 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.get_model_pricing   100% 22 0 0   94% 16 1   97%
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_provider_from_model   93% 14 1 0   92% 12 1   92%
src/local_deep_research/metrics/pricing/pricing_fetcher.py (no function)   100% 12 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_period_cutoff   100% 4 0 0   100% 2 0   100%
src/local_deep_research/metrics/query_utils.py get_time_filter_condition   100% 4 0 0   100% 2 0   100%
src/local_deep_research/metrics/query_utils.py get_context_overflow_truncation_summary   100% 15 0 0   100% 4 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% 11 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   100% 40 0 0   100% 10 0   100%
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% 24 0 0   100% 0 0   100%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback.on_llm_start   97% 76 2 0   95% 44 2   97%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback._check_context_overflow   86% 21 3 0   71% 14 2   80%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback.on_llm_end   98% 62 1 0   98% 40 1   98%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback.on_llm_error   100% 8 0 0   100% 4 0   100%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback._pop_call_meta   100% 10 0 0   100% 2 0   100%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback._legacy_meta   100% 2 0 0   100% 0 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% 59 0 0   100% 20 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% 6 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   100% 131 0 0   98% 64 1   99%
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   71% 14 4   87%
src/local_deep_research/metrics/token_counter.py TokenCounter.get_research_timeline_metrics   100% 47 0 0   95% 22 1   99%
src/local_deep_research/metrics/token_counter.py (no function)   100% 36 0 0   100% 0 0   100%
src/local_deep_research/news/__init__.py (no function)   100% 7 0 0   100% 0 0   100%
src/local_deep_research/news/api.py _notify_scheduler_about_subscription_change   100% 18 0 0   100% 8 0   100%
src/local_deep_research/news/api.py get_news_feed   97% 109 3 0   91% 44 4   95%
src/local_deep_research/news/api.py get_subscription_history   92% 37 3 0   100% 6 0   93%
src/local_deep_research/news/api.py _format_time_ago   100% 15 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   87% 54 7 0   87% 38 5   87%
src/local_deep_research/news/api.py _validate_subscription_policy   89% 27 3 0   100% 10 0   92%
src/local_deep_research/news/api.py create_subscription   89% 27 3 0   100% 4 0   90%
src/local_deep_research/news/api.py delete_subscription   100% 16 0 0   100% 2 0   100%
src/local_deep_research/news/api.py get_votes_for_cards   82% 17 3 0   100% 4 0   86%
src/local_deep_research/news/api.py submit_feedback   100% 24 0 0   100% 6 0   100%
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% 27 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   78% 9 2 0   75% 4 1   77%
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   100% 19 0 0   100% 2 0   100%
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 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% 48 0 0   100% 0 0   100%
src/local_deep_research/news/core/storage_manager.py StorageManager.__init__   100% 6 0 0   100% 0 0   100%
src/local_deep_research/news/core/storage_manager.py StorageManager._get_current_session   73% 11 3 0   100% 2 0   77%
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.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_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 (no function)   100% 32 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% 29 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   85% 13 2 0   80% 10 2   83%
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   89% 38 4 0   83% 6 1   89%
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% 17 0 0   100% 0 0   100%
src/local_deep_research/news/subscription_runner.py build_subscription_request_data   100% 7 0 0   100% 4 0   100%
src/local_deep_research/news/subscription_runner.py advance_refresh_schedule   100% 4 0 0   100% 2 0   100%
src/local_deep_research/news/subscription_runner.py advance_refresh_schedule_by_id   100% 6 0 0   100% 2 0   100%
src/local_deep_research/news/subscription_runner.py mark_subscription_due_by_id   100% 6 0 0   100% 2 0   100%
src/local_deep_research/news/subscription_runner.py (no function)   100% 6 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/notifications/__init__.py (no function)   100% 8 0 0   100% 0 0   100%
src/local_deep_research/notifications/apprise_log_utils.py _AppriseSanitizingRecordFactory.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/notifications/apprise_log_utils.py _AppriseSanitizingRecordFactory.__call__   100% 8 0 0   100% 2 0   100%
src/local_deep_research/notifications/apprise_log_utils.py install_apprise_log_record_factory   100% 4 0 0   100% 2 0   100%
src/local_deep_research/notifications/apprise_log_utils.py (no function)   100% 8 0 0   100% 0 0   100%
src/local_deep_research/notifications/exceptions.py (no function)   100% 10 0 0   100% 0 0   100%
src/local_deep_research/notifications/manager.py NotificationResult.__bool__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/notifications/manager.py NotificationManager.__init__   100% 16 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% 47 0 0   100% 14 0   100%
src/local_deep_research/notifications/manager.py NotificationManager.test_service   100% 6 0 0   100% 4 0   100%
src/local_deep_research/notifications/manager.py NotificationManager._filter_urls_by_egress_policy   91% 33 3 0   100% 12 0   93%
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% 6 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% 46 0 0   100% 0 0   100%
src/local_deep_research/notifications/queue_helpers.py _format_reason   80% 5 1 0   75% 4 1   78%
src/local_deep_research/notifications/queue_helpers.py send_queue_notification   100% 16 0 0   100% 4 0   100%
src/local_deep_research/notifications/queue_helpers.py send_queue_failed_notification   100% 18 0 0   100% 6 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% 36 1 0   100% 8 0   98%
src/local_deep_research/notifications/queue_helpers.py send_research_failed_notification_from_session   97% 30 1 0   100% 6 0   97%
src/local_deep_research/notifications/queue_helpers.py (no function)   100% 12 0 0   100% 0 0   100%
src/local_deep_research/notifications/service.py NotificationService.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/notifications/service.py NotificationService._new_apprise   100% 1 0 0   100% 0 0   100%
src/local_deep_research/notifications/service.py NotificationService._disable_redirects   57% 7 3 0   100% 2 0   67%
src/local_deep_research/notifications/service.py NotificationService._enforce_guarded_send_invariants   100% 5 0 0   100% 4 0   100%
src/local_deep_research/notifications/service.py NotificationService._partition_urls   86% 14 2 0   75% 8 2   82%
src/local_deep_research/notifications/service.py NotificationService._guarded_notify   100% 6 0 0   100% 2 0   100%
src/local_deep_research/notifications/service.py NotificationService._send_with_retry   100% 12 0 0   100% 4 0   100%
src/local_deep_research/notifications/service.py NotificationService.send   74% 34 9 0   83% 12 2   76%
src/local_deep_research/notifications/service.py NotificationService._dispatch   93% 14 1 0   75% 8 2   86%
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   98% 42 1 0   95% 22 1   97%
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% 38 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_code_fence_spans   91% 56 5 0   83% 24 4   89%
src/local_deep_research/report_generator.py _is_in_spans   100% 1 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% 29 0 0   94% 18 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._normalize_heading_text   100% 5 0 0   100% 0 0   100%
src/local_deep_research/report_generator.py IntegratedReportGenerator._heading_restates_name   76% 17 4 0   71% 14 2   74%
src/local_deep_research/report_generator.py IntegratedReportGenerator._strip_leading_heading   95% 20 1 0   86% 14 2   91%
src/local_deep_research/report_generator.py IntegratedReportGenerator._strip_leading_italic_purpose   94% 34 2 0   81% 26 5   88%
src/local_deep_research/report_generator.py IntegratedReportGenerator._strip_embedded_bibliographies   73% 90 24 0   63% 54 6   69%
src/local_deep_research/report_generator.py IntegratedReportGenerator._strip_subsection_boilerplate   96% 27 1 0   86% 14 2   93%
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   94% 67 4 0   86% 28 4   92%
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% 22 0 0   100% 10 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% 46 0 0   100% 0 0   100%
src/local_deep_research/research_library/__init__.py (no function)   100% 4 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/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   89% 18 2 0   83% 6 1   88%
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   97% 60 2 0   100% 22 0   98%
src/local_deep_research/research_library/deletion/services/collection_deletion.py CollectionDeletionService.delete_collection_index_only   100% 31 0 0   100% 6 0   100%
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% 11 0 0   100% 0 0   100%
src/local_deep_research/research_library/deletion/services/document_deletion.py _hold_document_delete_lock   100% 17 0 0   83% 6 1   96%
src/local_deep_research/research_library/deletion/services/document_deletion.py _is_note_document   100% 2 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% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/deletion/services/document_deletion.py DocumentDeletionService._delete_document_locked   98% 43 1 0   92% 12 1   96%
src/local_deep_research/research_library/deletion/services/document_deletion.py DocumentDeletionService._purge_document_rag   100% 19 0 0   100% 8 0   100%
src/local_deep_research/research_library/deletion/services/document_deletion.py DocumentDeletionService.delete_blob_only   97% 35 1 0   93% 14 1   96%
src/local_deep_research/research_library/deletion/services/document_deletion.py DocumentDeletionService.remove_from_collection   96% 50 2 0   88% 16 2   94%
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% 23 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._resolved_containment_ok   75% 8 2 0   100% 2 0   80%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper.delete_filesystem_file   100% 19 0 0   100% 10 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper.delete_faiss_index_files   77% 62 14 0   86% 28 4   80%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper.delete_rag_indices_for_collection   100% 18 0 0   100% 8 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.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% 34 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   100% 25 0 0   100% 8 0   100%
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   100% 16 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py metadata_to_text   100% 30 0 0   100% 28 0   100%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py _has_type   100% 8 0 0   100% 8 0   100%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py _format_product   100% 30 0 0   95% 20 1   98%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py _format_article   100% 18 0 0   92% 12 1   97%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py _format_software   100% 18 0 0   92% 12 1   97%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py _format_opengraph   100% 16 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/extraction/metadata_extractor.py _format_generic   100% 8 0 0   100% 4 0   100%
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   100% 18 0 0   100% 2 0   100%
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   100% 11 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py _count_boilerplate   100% 4 0 0   100% 2 0   100%
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   100% 50 0 0   100% 30 0   100%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py extract_content_with_metadata   100% 20 0 0   100% 12 0   100%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py _try_specialized_downloader   60% 43 17 0   44% 16 3   56%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py fetch_and_extract   88% 17 2 0   100% 4 0   90%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py batch_fetch_and_extract   90% 29 3 0   90% 10 1   90%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py (no function)   100% 27 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py ReadabilityExtractor.extract   100% 18 0 0   100% 6 0   100%
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   94% 16 1 0   75% 4 1   90%
src/local_deep_research/research_library/downloaders/extraction/trafilatura_extractor.py (no function)   100% 7 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% 17 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 _cookie_domain_matches   71% 7 2 0   50% 4 2   64%
src/local_deep_research/research_library/downloaders/playwright_html.py _same_registrable_site   71% 7 2 0   50% 4 2   64%
src/local_deep_research/research_library/downloaders/playwright_html.py _parse_one_set_cookie   83% 18 3 0   70% 10 3   79%
src/local_deep_research/research_library/downloaders/playwright_html.py _set_cookie_is_expired   67% 18 6 0   75% 8 2   69%
src/local_deep_research/research_library/downloaders/playwright_html.py _run_async   100% 10 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader.__init__   100% 8 0 0   50% 2 1   90%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._playwright_route_guard   91% 47 4 0   100% 16 0   94%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._playwright_ws_guard   50% 4 2 0   100% 0 0   50%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._crawl4ai_route_guard   88% 49 6 0   94% 16 1   89%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._crawl4ai_ws_guard   50% 4 2 0   100% 0 0   50%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._cookies_from_response   84% 37 6 0   94% 18 1   87%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._reapply_hop_cookies   100% 12 0 0   100% 4 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._reapply_hop_cookies_sync   75% 12 3 0   100% 4 0   81%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._apply_hop_cookie_header   100% 11 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._redirect_target   83% 6 1 0   75% 4 1   80%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._robots_allows   88% 16 2 0   50% 4 2   80%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_html   86% 7 1 0   75% 4 1   82%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_with_crawl4ai   92% 37 3 0   88% 8 1   91%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_with_crawl4ai._crawl   100% 8 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_with_crawl4ai._crawl._on_page_context_created   100% 6 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_with_playwright   82% 39 7 0   50% 4 2   79%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader.close   69% 13 4 0   100% 4 0   76%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader.__init__   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader._get_playwright_downloader   100% 3 0 0   100% 2 0   100%
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   92% 24 2 0   70% 10 3   85%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader.download_with_result   54% 24 11 0   40% 10 4   50%
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% 49 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/notes/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/__init__.py get_note_source_type_id   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/__init__.py (no function)   100% 6 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_llm   83% 6 1 0   75% 4 1   80%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._build_settings_snapshot   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._extract_llm_text   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._parse_json_from_llm   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._parse_json_list   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._coerce_confidence   82% 11 2 0   100% 6 0   88%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._coerce_str_list   100% 12 0 0   100% 10 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._build_data_block   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._build_diff_blocks   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._common_prefix_len   89% 9 1 0   75% 4 1   85%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._diff_windows   100% 10 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._diff_truncation_notice   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_note_source_type_id   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._fetch_document   80% 5 1 0   50% 2 1   71%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_note_content   75% 4 1 0   50% 2 1   67%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_note   75% 4 1 0   50% 2 1   67%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._extract_doc_id   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.find_similar_notes   67% 9 3 0   100% 2 0   73%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.summarize_note   100% 13 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.extract_research_questions   94% 18 1 0   83% 6 1   92%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.suggest_tags   100% 25 0 0   100% 8 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.extract_key_concepts   100% 15 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.summarize_changes   87% 15 2 0   67% 6 2   81%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.extract_claims   100% 15 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.synthesize_factcheck_query   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.grade_all_claims   96% 76 3 0   86% 42 6   92%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.semantic_search   100% 57 0 0   93% 28 2   98%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.find_similar_passages   91% 44 4 0   85% 26 4   89%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.suggest_links   0% 10 10 0   0% 2 0   0%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.semantic_diff   81% 16 3 0   100% 4 0   85%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.synthesize_notes   95% 39 2 0   89% 18 2   93%
src/local_deep_research/research_library/notes/services/note_ai_service.py (no function)   100% 68 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py escape_markdown_link_label   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py _capture_request_db_password   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py _get_summary_executor   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py _submit_summary_task   83% 12 2 0   100% 2 0   86%
src/local_deep_research/research_library/notes/services/note_service.py _shutdown_summary_executor   0% 4 4 0   0% 2 0   0%
src/local_deep_research/research_library/notes/services/note_service.py _populate_change_summary_async   84% 19 3 0   67% 6 2   80%
src/local_deep_research/research_library/notes/services/note_service.py _fold_title_ascii   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py _assert_content_size   100% 4 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py _validate_tags   100% 11 0 0   100% 12 0   100%
src/local_deep_research/research_library/notes/services/note_service.py _validate_title   88% 8 1 0   88% 8 1   88%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._generate_slug   100% 7 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._compute_content_hash   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._compute_version_hash   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._get_note_source_type_id   50% 8 4 0   50% 2 1   50%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._get_or_create_notes_collection   80% 15 3 0   100% 2 0   82%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_notes_collection_id   100% 6 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_notes_index_status   100% 7 0 0   50% 2 1   89%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._is_note   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._get_note_in_session   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._escape_like   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._rollback_quietly   67% 3 1 0   50% 2 1   60%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.create_note   90% 39 4 0   93% 14 1   91%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.note_exists   71% 7 2 0   50% 4 2   64%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_note   75% 12 3 0   100% 2 0   79%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.update_note   100% 71 0 0   97% 34 1   99%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.delete_note   84% 32 5 0   100% 6 0   87%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._build_filtered_notes_query   90% 10 1 0   83% 6 1   88%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.count_notes   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.list_notes   79% 19 4 0   75% 4 1   78%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.add_to_collection   95% 21 1 0   100% 6 0   96%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.remove_from_collection   89% 36 4 0   100% 8 0   91%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_note_collections   57% 7 3 0   100% 0 0   57%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_note_research   57% 7 3 0   100% 0 0   57%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.link_research_to_note   97% 32 1 0   90% 10 1   95%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_notes_for_research   100% 11 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._create_note_with_cleanup   82% 11 2 0   100% 0 0   82%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.create_note_for_research   100% 13 0 0   100% 6 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.create_note_for_research._link   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._add_reference   67% 9 3 0   100% 0 0   67%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_notes_for_document   100% 10 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.create_note_for_document   100% 16 0 0   100% 8 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.create_note_for_document._link   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_annotations_for_target   100% 12 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.has_annotation   100% 6 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.update_note_research   75% 12 3 0   100% 4 0   81%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.reorder_note_research   76% 25 6 0   83% 12 2   78%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._document_to_note_dict   100% 16 0 0   100% 8 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._create_version_snapshot_in_session   100% 15 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._mark_note_stale_for_reindex_in_session   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._prune_versions_in_session   100% 17 0 0   100% 8 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._log_version_prune   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.restore_with_bookends   100% 30 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._parse_and_update_links_in_session   99% 76 1 0   96% 46 2   98%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._parse_and_update_links_in_session._valid_note_target   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._parse_and_update_links   0% 9 9 0   100% 0 0   0%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._resolve_link_internal   100% 11 0 0   100% 6 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._resolve_link_prefix   100% 7 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService._truncate_preview   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_backlinks   100% 8 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_outgoing_links   100% 8 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.get_unlinked_mentions   94% 16 1 0   83% 6 1   91%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.accept_suggested_link   97% 34 1 0   86% 14 2   94%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.resolve_link   100% 8 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py NoteService.search_notes_for_linking   100% 12 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_service.py (no function)   100% 113 0 0   100% 0 0   100%
src/local_deep_research/research_library/search/__init__.py (no function)   100% 2 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% 32 0 0   100% 10 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 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% 22 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__   91% 33 3 0   100% 6 0   92%
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% 4 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._build_egress_context   53% 15 7 0   100% 2 0   59%
src/local_deep_research/research_library/services/download_service.py DownloadService._check_url_against_policy   85% 13 2 0   75% 8 2   81%
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   91% 23 2 0   90% 10 1   91%
src/local_deep_research/research_library/services/download_service.py DownloadService.queue_research_downloads   93% 28 2 0   88% 16 2   91%
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% 37 1 0   86% 14 2   94%
src/local_deep_research/research_library/services/download_service.py DownloadService._download_pdf   100% 98 0 0   96% 26 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% 22 0 0   100% 8 0   100%
src/local_deep_research/research_library/services/download_service.py DownloadService._try_api_text_extraction   96% 27 1 0   90% 10 1   95%
src/local_deep_research/research_library/services/download_service.py DownloadService._fallback_pdf_extraction   100% 39 0 0   100% 8 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   98% 53 1 0   94% 16 1   97%
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% 64 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/faiss_safe_load.py _RestrictedFaissUnpickler.find_class   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/faiss_safe_load.py _RestrictedFaissUnpickler.get_extension   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/faiss_safe_load.py _RestrictedFaissUnpickler.persistent_load   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/faiss_safe_load.py load_index_to_docstore_id   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/faiss_safe_load.py (no function)   100% 8 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _LazyEmbeddings.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _LazyEmbeddings.embed_documents   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _LazyEmbeddings.embed_query   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _TrackedRLock.__init__   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _TrackedRLock.acquire   100% 12 0 0   100% 6 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _TrackedRLock.release   100% 8 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _TrackedRLock.locked   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _TrackedRLock.__enter__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _TrackedRLock.__exit__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _get_faiss_write_lock   100% 7 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _hold_faiss_write_lock   100% 13 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/library_rag_service.py pop_faiss_locks_for_user   100% 5 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.__init__   85% 47 7 0   50% 6 1   81%
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% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._matches_current_index_configuration   89% 9 1 0   67% 6 2   80%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._find_matching_rag_index   100% 8 0 0   83% 6 1   93%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._resolve_index_for_config   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_index_path   83% 12 2 0   100% 4 0   88%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._migrate_legacy_index_files   75% 32 8 0   75% 12 3   75%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._reset_index_state_for_rebuild   100% 14 0 0   75% 4 1   94%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_or_create_rag_index   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_or_create_rag_index_in_session   94% 31 2 0   80% 10 2   90%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._quarantine_corrupt_index   88% 33 4 0   90% 10 1   88%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._corrupt_sort_key   72% 18 5 0   75% 4 1   73%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._prune_old_quarantined_files   80% 15 3 0   100% 4 0   84%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._preflight_index_path   91% 53 5 0   83% 30 5   88%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_vector_index   39% 23 14 0   0% 4 0   33%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_vector_index._record   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_vector_index._verify   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.search   100% 3 0 0   100% 0 0   100%
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._flag_document_for_reindex   57% 7 3 0   100% 0 0   57%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._collection_transaction_lock   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._prepare_document   82% 17 3 0   50% 6 3   74%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._write_prepared_document   84% 31 5 0   75% 4 1   83%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_document   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._index_one   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._index_document_locked   80% 64 13 0   83% 12 2   80%
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   90% 31 3 0   100% 2 0   91%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.purge_document_chunks   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.purge_document_vectors   61% 28 11 0   75% 8 2   64%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.purge_document_vectors._record   0% 1 1 0   100% 0 0   0%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.purge_document_vectors._verify   0% 1 1 0   100% 0 0   0%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_documents_batch   100% 23 0 0   100% 6 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_documents_parallel   88% 86 10 0   93% 42 3   90%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_documents_parallel._run_one   93% 15 1 0   88% 8 1   91%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.reconcile_collection_index   100% 35 0 0   79% 14 3   94%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.get_rag_stats   91% 22 2 0   90% 10 1   91%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.remove_documents_from_index   84% 38 6 0   75% 16 4   81%
src/local_deep_research/research_library/services/library_rag_service.py (no function)   100% 94 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._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   67% 12 4 0   50% 8 4   60%
src/local_deep_research/research_library/services/library_service.py LibraryService.get_documents   91% 57 5 0   82% 28 5   88%
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   94% 36 2 0   100% 12 0   96%
src/local_deep_research/research_library/services/library_service.py LibraryService.open_file_location   100% 14 0 0   100% 8 0   100%
src/local_deep_research/research_library/services/library_service.py LibraryService.get_unique_domains   100% 8 0 0   100% 4 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% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py LibraryService.sync_library_with_filesystem   95% 42 2 0   100% 12 0   96%
src/local_deep_research/research_library/services/library_service.py LibraryService.mark_for_redownload   100% 17 0 0   88% 8 1   96%
src/local_deep_research/research_library/services/library_service.py (no function)   100% 46 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py filesystem_pdf_storage_allowed   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py resolve_pdf_storage_mode   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager.__init__   100% 9 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager._safe_path_in_root   100% 10 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager._get_safe_file_path   100% 11 0 0   88% 8 1   95%
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% 10 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   73% 11 3 0   100% 4 0   80%
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   88% 24 3 0   90% 10 1   88%
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% 31 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/rag_service_factory.py _get_default_text_separators   100% 10 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/rag_service_factory.py _enforce_embeddings_policy   74% 19 5 0   75% 4 1   74%
src/local_deep_research/research_library/services/rag_service_factory.py get_rag_service   100% 35 0 0   100% 10 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% 12 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py escape_like   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py is_downloadable_domain   86% 21 3 0   100% 12 0   91%
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 ensure_in_collection   100% 6 0 0   100% 2 0   100%
src/local_deep_research/research_library/utils/__init__.py _reject_unsafe_username_component   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/utils/__init__.py apply_user_subdir   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/utils/__init__.py _shared_library_allowed   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py _legacy_read_fallback_allowed   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py get_library_storage_path   100% 9 0 0   100% 0 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 _resolve_within_root   92% 12 1 0   75% 4 1   88%
src/local_deep_research/research_library/utils/__init__.py get_absolute_path_from_settings   100% 17 0 0   90% 10 1   96%
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% 28 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py _html_to_text   86% 7 1 0   50% 2 1   78%
src/local_deep_research/research_library/zotero/client.py ZoteroAttachment.is_downloadable_pdf   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroItem.title   0% 1 1 0   100% 0 0   0%
src/local_deep_research/research_library/zotero/client.py ZoteroItem.best_pdf_attachment   100% 4 0 0   75% 4 1   88%
src/local_deep_research/research_library/zotero/client.py ZoteroItem.is_standalone_pdf_attachment   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroItem.as_attachment   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py _sleep_for_backoff   100% 11 0 0   100% 4 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.__init__   100% 18 0 0   100% 8 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.close   67% 6 2 0   50% 2 1   62%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.__enter__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.__exit__   0% 2 2 0   100% 0 0   0%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._request   78% 36 8 0   80% 20 2   79%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._library_version   50% 4 2 0   100% 0 0   50%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.test_connection   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_current_key_info   71% 7 2 0   100% 2 0   78%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_collections   100% 18 0 0   100% 8 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_groups   88% 24 3 0   75% 12 3   83%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_collection_name   0% 6 6 0   100% 0 0   0%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_top_item_versions   82% 34 6 0   79% 14 3   81%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_items   90% 10 1 0   83% 6 1   88%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._get_children_raw   86% 14 2 0   50% 4 2   78%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_children   100% 7 0 0   100% 4 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_notes   100% 9 0 0   83% 6 1   93%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_annotations   93% 15 1 0   90% 10 1   92%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.download_attachment   90% 20 2 0   88% 8 1   89%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._read_local_file   73% 15 4 0   75% 4 1   74%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._fetch_file_unauthenticated   53% 15 7 0   75% 4 1   58%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_attachment_fulltext   79% 14 3 0   50% 2 1   75%
src/local_deep_research/research_library/zotero/client.py (no function)   100% 60 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroConfig.is_configured   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroConfig.targets   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py _get_user_sync_lock   100% 6 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.get_config   82% 11 2 0   100% 0 0   82%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._make_client   0% 1 1 0   100% 0 0   0%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._resolve_library_id   88% 26 3 0   94% 16 1   90%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._library_root   100% 6 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.test_connection   77% 13 3 0   75% 4 1   76%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.list_collections   0% 6 6 0   0% 2 0   0%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.list_groups   0% 6 6 0   0% 2 0   0%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.is_user_syncing   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.get_sync_progress   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._set_progress   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._clear_progress   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.sync_all   92% 26 2 0   75% 8 2   88%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.get_status   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._sync_one   92% 136 11 0   90% 50 5   91%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._cleanup_removed_vectors   0% 23 23 0   0% 4 0   0%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._mark_failed   80% 10 2 0   50% 2 1   75%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._ensure_ldr_collection   81% 16 3 0   67% 6 2   77%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._get_or_create_state   100% 9 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._ingest_item   100% 101 0 0   100% 44 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._exclusive_to_mapping   100% 10 0 0   100% 6 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._purge_collection_chunks   90% 10 1 0   75% 8 2   83%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._collect_annotations_text   72% 18 5 0   100% 6 0   79%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._safe_extract_text   60% 10 4 0   50% 2 1   58%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._apply_metadata   90% 20 2 0   83% 12 2   88%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._item_has_tags   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._authors   90% 10 1 0   75% 8 2   83%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._source_url   100% 7 0 0   100% 4 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._parse_date   100% 14 0 0   88% 8 1   95%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._metadata_text   82% 22 4 0   69% 16 5   76%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._filename_for   80% 10 2 0   100% 4 0   86%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._upsert_map   100% 8 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._touch_map_version   67% 6 2 0   50% 2 1   62%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._remove_item   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._release_document   95% 20 1 0   86% 14 2   91%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._capture_chunk_ids   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._document_exists   67% 3 1 0   50% 2 1   60%
src/local_deep_research/research_library/zotero/sync_service.py (no function)   100% 95 0 0   100% 0 0   100%
src/local_deep_research/scheduler/__init__.py (no function)   100% 2 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py SchedulerCredentialStore.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py SchedulerCredentialStore.store   100% 1 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py SchedulerCredentialStore.retrieve   100% 2 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py SchedulerCredentialStore.clear   100% 1 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py DocumentSchedulerSettings.defaults   100% 1 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.__new__   100% 5 0 0   75% 4 1   89%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.__init__   100% 12 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._load_default_config   100% 1 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.initialize_with_settings   100% 6 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._get_setting   100% 3 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._wrap_job   100% 5 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._wrap_job.wrapper   100% 3 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._get_document_scheduler_settings   93% 30 2 0   88% 8 1   92%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.invalidate_user_settings_cache   100% 6 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.invalidate_all_settings_cache   100% 5 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.start   100% 12 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.stop   100% 8 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.update_user_info   100% 20 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.unregister_user   100% 13 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.reschedule_document_jobs   100% 9 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.reschedule_zotero_jobs   100% 9 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._schedule_user_subscriptions   93% 55 4 0   83% 18 3   90%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._schedule_document_processing   100% 36 0 0   100% 6 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._schedule_reconciler   100% 13 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._arm_egress_backstop   88% 17 2 0   100% 2 0   89%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._process_user_documents   97% 120 4 0   100% 30 0   97%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._reconcile_unindexed_documents   93% 76 5 0   86% 28 2   91%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.get_document_scheduler_status   100% 12 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.trigger_document_processing   100% 23 0 0   100% 6 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._schedule_zotero_sync   96% 24 1 0   83% 6 1   93%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._schedule_zotero_sync._drop_existing_job   100% 5 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._sync_user_zotero   0% 21 21 0   0% 6 0   0%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._check_user_overdue_subscriptions   100% 24 0 0   100% 8 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._check_subscription   95% 43 2 0   90% 10 1   94%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._trigger_subscription_research_sync   95% 42 2 0   75% 8 2   92%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._store_research_result   100% 56 0 0   100% 10 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._store_research_result.make_serializable   89% 9 1 0   88% 8 1   88%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._run_cleanup_with_tracking   100% 5 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._cleanup_inactive_users   100% 16 0 0   100% 4 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._reload_config   100% 15 0 0   100% 8 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.get_status   100% 9 0 0   75% 4 1   92%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._estimate_memory_usage   100% 2 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler.get_user_sessions_summary   100% 5 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py get_background_job_scheduler   100% 3 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py (no function)   100% 85 0 0   100% 0 0   100%
src/local_deep_research/search_system.py ensure_snapshot_username   100% 3 0 0   100% 2 0   100%
src/local_deep_research/search_system.py username_from_snapshot   100% 1 0 0   100% 0 0   100%
src/local_deep_research/search_system.py AdvancedSearchSystem.__init__   100% 38 0 0   93% 14 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% 9 0 0   100% 2 0   100%
src/local_deep_research/search_system.py AdvancedSearchSystem._arm_egress_backstop   63% 19 7 0   100% 4 0   70%
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% 20 0 0   100% 0 0   100%
src/local_deep_research/search_system_factory.py _get_setting   100% 4 0 0   100% 2 0   100%
src/local_deep_research/search_system_factory.py create_strategy   91% 64 6 0   86% 36 5   89%
src/local_deep_research/search_system_factory.py (no function)   100% 7 0 0   100% 0 0   100%
src/local_deep_research/security/__init__.py __getattr__   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/__init__.py (no function)   100% 27 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 _visible_leaf   100% 3 0 0   100% 0 0   100%
src/local_deep_research/security/data_sanitizer.py _is_empty_value   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/data_sanitizer.py _has_non_secret_qualifier   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/data_sanitizer.py _matches_sensitive_name   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/data_sanitizer.py _is_exact_sensitive_match   75% 4 1 0   50% 2 1   67%
src/local_deep_research/security/data_sanitizer.py _force_redact_strings   100% 7 0 0   100% 6 0   100%
src/local_deep_research/security/data_sanitizer.py DataSanitizer.is_sensitive_setting   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/data_sanitizer.py DataSanitizer.redact_value   100% 15 0 0   100% 12 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 DataSanitizer.redact_settings_snapshot   100% 11 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% 29 0 0   100% 0 0   100%
src/local_deep_research/security/directory_creation.py create_directory   100% 14 0 0   100% 10 0   100%
src/local_deep_research/security/directory_creation.py (no function)   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py _capture_real_getaddrinfo   86% 7 1 0   75% 4 1   82%
src/local_deep_research/security/dns_pinning.py _normalize_host   71% 7 2 0   50% 4 2   64%
src/local_deep_research/security/dns_pinning.py _host_for_log   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/dns_pinning.py _get_pins   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/dns_pinning.py reset_ssrf_block   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py consume_ssrf_block   100% 3 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py _getaddrinfo_bounded   100% 10 0 0   100% 4 0   100%
src/local_deep_research/security/dns_pinning.py _getaddrinfo_bounded._worker   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py _pinned_getaddrinfo   94% 16 1 0   92% 12 1   93%
src/local_deep_research/security/dns_pinning.py _resolve_maybe_block   100% 15 0 0   100% 8 0   100%
src/local_deep_research/security/dns_pinning.py install   80% 5 1 0   50% 4 2   67%
src/local_deep_research/security/dns_pinning.py _shim_installed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py _extract_scheme_host   80% 15 3 0   75% 4 1   79%
src/local_deep_research/security/dns_pinning.py _extract_host   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py _resolve_and_validate   92% 12 1 0   83% 6 1   89%
src/local_deep_research/security/dns_pinning.py pinned_request   93% 14 1 0   75% 4 1   89%
src/local_deep_research/security/dns_pinning.py block_private_resolution   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/dns_pinning.py pin_hosts   91% 23 2 0   80% 10 2   88%
src/local_deep_research/security/dns_pinning.py pinned_notification_send   100% 6 0 0   100% 2 0   100%
src/local_deep_research/security/dns_pinning.py (no function)   100% 41 0 0   100% 0 0   100%
src/local_deep_research/security/egress/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/security/egress/audit_hook.py set_active_context   100% 8 0 2   100% 4 0   100%
src/local_deep_research/security/egress/audit_hook.py clear_active_context   100% 2 0 0   100% 2 0   100%
src/local_deep_research/security/egress/audit_hook.py get_active_context   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/audit_hook.py active_egress_context   100% 7 0 0   100% 2 0   100%
src/local_deep_research/security/egress/audit_hook.py install_audit_hook   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/egress/audit_hook.py is_installed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/audit_hook.py _extract_host   82% 11 2 0   67% 6 2   76%
src/local_deep_research/security/egress/audit_hook.py _audit_hook   81% 26 5 0   57% 14 6   72%
src/local_deep_research/security/egress/audit_hook.py (no function)   100% 20 0 0   100% 0 0   100%
src/local_deep_research/security/egress/classification.py evaluate_run   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/egress/classification.py _decide_enforcing   100% 10 0 0   100% 6 0   100%
src/local_deep_research/security/egress/classification.py (no function)   100% 33 0 0   100% 0 0   100%
src/local_deep_research/security/egress/fetch.py policy_aware_validate_url   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/egress/fetch.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/egress/guidance.py _scope_mismatch_how   91% 11 1 0   83% 6 1   88%
src/local_deep_research/security/egress/guidance.py denial_guidance   100% 9 0 0   100% 6 0   100%
src/local_deep_research/security/egress/guidance.py (no function)   100% 7 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py unprotected_egress_allowed   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py PolicyDeniedError.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py parse_user_egress_scope   94% 18 1 0   92% 12 1   93%
src/local_deep_research/security/egress/policy.py effective_scope_for_display   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _is_nat64_wrapped_metadata   100% 10 0 2   100% 2 0   100%
src/local_deep_research/security/egress/policy.py _resolve_with_timeout   100% 8 0 2   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _resolve_with_timeout._do_lookup   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _cache_classification   100% 6 0 0   100% 2 0   100%
src/local_deep_research/security/egress/policy.py _classify_host   85% 34 5 2   88% 26 3   87%
src/local_deep_research/security/egress/policy.py _get_engine_class   78% 9 2 0   100% 2 0   82%
src/local_deep_research/security/egress/policy.py _engine_flags   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _resolve_collection_is_public   100% 12 0 0   100% 2 0   100%
src/local_deep_research/security/egress/policy.py _vector_store_class   50% 8 4 0   50% 2 1   50%
src/local_deep_research/security/egress/policy.py _normalize_provider_key   67% 3 1 0   50% 2 1   60%
src/local_deep_research/security/egress/policy.py _resolve_index_vector_store_providers   71% 14 4 0   50% 4 0   67%
src/local_deep_research/security/egress/policy.py _resolve_vector_store_providers   80% 10 2 0   50% 2 1   75%
src/local_deep_research/security/egress/policy.py _starts_with_double_separator   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _normalize_uri_like_url_parser   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/egress/policy.py _is_local_filesystem_uri   100% 20 0 0   100% 12 0   100%
src/local_deep_research/security/egress/policy.py _file_uri_names_a_remote_share   100% 10 0 0   100% 4 0   100%
src/local_deep_research/security/egress/policy.py _vector_store_endpoint_is_local   100% 11 0 0   100% 8 0   100%
src/local_deep_research/security/egress/policy.py vector_store_is_contained   100% 10 0 0   100% 10 0   100%
src/local_deep_research/security/egress/policy.py classify_engine   100% 16 0 0   100% 12 0   100%
src/local_deep_research/security/egress/policy.py filter_engines_by_egress   100% 6 0 0   100% 4 0   100%
src/local_deep_research/security/egress/policy.py filter_candidates_by_egress   75% 12 3 0   100% 4 0   81%
src/local_deep_research/security/egress/policy.py evaluate_engine   100% 18 0 3   100% 14 0   100%
src/local_deep_research/security/egress/policy.py _classify_engine_url   91% 32 3 0   95% 20 1   92%
src/local_deep_research/security/egress/policy.py _is_user_registered_llm   100% 8 0 3   100% 2 0   100%
src/local_deep_research/security/egress/policy.py evaluate_llm_endpoint   92% 26 2 3   100% 16 0   95%
src/local_deep_research/security/egress/policy.py evaluate_embeddings   100% 25 0 3   100% 16 0   100%
src/local_deep_research/security/egress/policy.py _normalize_alt_ipv4   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _quota_ctx   100% 4 0 2   100% 0 0   100%
src/local_deep_research/security/egress/policy.py evaluate_url   90% 48 5 3   97% 32 1   92%
src/local_deep_research/security/egress/policy.py _record_denial   100% 12 0 0   100% 4 0   100%
src/local_deep_research/security/egress/policy.py evaluate_retriever   83% 23 4 3   88% 16 2   85%
src/local_deep_research/security/egress/policy.py _retriever_is_local   78% 9 2 0   100% 2 0   82%
src/local_deep_research/security/egress/policy.py _adaptive_failopen_user_key   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/egress/policy.py _should_warn_adaptive_failopen   100% 15 0 0   100% 8 0   100%
src/local_deep_research/security/egress/policy.py _resolve_adaptive_scope   89% 28 3 0   100% 18 0   93%
src/local_deep_research/security/egress/policy.py context_from_snapshot   97% 37 1 0   95% 22 1   97%
src/local_deep_research/security/egress/policy.py _get_setting_value   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py coerce_str_list   80% 10 2 0   67% 6 2   75%
src/local_deep_research/security/egress/policy.py resolve_run_primary_engine   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/egress/policy.py build_run_egress_context   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py _coerce_bool   80% 5 1 0   75% 4 1   78%
src/local_deep_research/security/egress/policy.py (no function)   100% 106 0 0   100% 0 0   100%
src/local_deep_research/security/egress/run_classification.py engine_label   100% 18 0 0   100% 10 0   100%
src/local_deep_research/security/egress/run_classification.py _require_local_probe   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/egress/run_classification.py _trusted_names   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/egress/run_classification.py _inference_label   80% 10 2 0   100% 2 0   83%
src/local_deep_research/security/egress/run_classification.py llm_label   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/egress/run_classification.py embeddings_label   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/egress/run_classification.py classify_run   100% 12 0 0   100% 8 0   100%
src/local_deep_research/security/egress/run_classification.py _fail_closed_decision   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/egress/run_classification.py audit_run   100% 10 0 0   100% 0 0   100%
src/local_deep_research/security/egress/run_classification.py audit_run_from_snapshot   100% 11 0 0   100% 4 0   100%
src/local_deep_research/security/egress/run_classification.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/security/egress/validators.py validate_egress_scope   92% 13 1 0   83% 6 1   89%
src/local_deep_research/security/egress/validators.py validate_allowed_local_hostnames   93% 30 2 0   100% 16 0   96%
src/local_deep_research/security/egress/validators.py validate_trusted_search_engines   83% 24 4 0   86% 14 2   84%
src/local_deep_research/security/egress/validators.py guarded_engine_url_descriptors   83% 18 3 0   80% 10 2   82%
src/local_deep_research/security/egress/validators.py _public_engine_url_settings   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/validators.py _engine_url_origin   92% 25 2 0   80% 10 2   89%
src/local_deep_research/security/egress/validators.py engine_url_origin_text   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/egress/validators.py _private_engine_url_allowlist   85% 26 4 0   100% 12 0   89%
src/local_deep_research/security/egress/validators.py engine_url_in_private_allowlist   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/egress/validators.py resolve_engine_allow_private_ips   67% 18 6 0   100% 6 0   75%
src/local_deep_research/security/egress/validators.py resolve_searxng_allow_private_ips   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/validators.py _engine_url_ssrf_error   82% 40 7 0   83% 18 3   83%
src/local_deep_research/security/egress/validators.py _engine_url_ssrf_error._block_reason   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/egress/validators.py _engine_url_error   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/egress/validators.py _stored_engine_url_value   88% 8 1 0   83% 6 1   86%
src/local_deep_research/security/egress/validators.py _normalize_engine_url_for_comparison   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/egress/validators.py _engine_url_is_unchanged   100% 12 0 0   100% 6 0   100%
src/local_deep_research/security/egress/validators.py validate_engine_instance_urls   89% 18 2 0   100% 8 0   92%
src/local_deep_research/security/egress/validators.py first_egress_validation_error   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/egress/validators.py (no function)   100% 35 0 0   100% 0 0   100%
src/local_deep_research/security/egress/warnings.py check_public_egress_enabled   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/egress/warnings.py check_unprotected_egress   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/egress/warnings.py check_trusted_destinations   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/egress/warnings.py check_effective_scope   100% 12 0 0   100% 8 0   100%
src/local_deep_research/security/egress/warnings.py check_private_engine_url_blocked   94% 33 2 0   100% 14 0   96%
src/local_deep_research/security/egress/warnings.py check_searxng_private_url_blocked   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/warnings.py _extract_engine_hosts   90% 29 3 0   88% 16 2   89%
src/local_deep_research/security/egress/warnings.py check_local_engine_public_url   88% 16 2 0   100% 4 0   90%
src/local_deep_research/security/egress/warnings.py check_local_engine_public_url._looks_local   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/egress/warnings.py check_cloud_llm_enabled   86% 7 1 0   83% 6 1   85%
src/local_deep_research/security/egress/warnings.py check_cloud_embeddings_enabled   82% 17 3 0   90% 10 1   85%
src/local_deep_research/security/egress/warnings.py (no function)   100% 12 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% 9 0 0   100% 2 0   100%
src/local_deep_research/security/file_integrity/integrity_manager.py FileIntegrityManager._integrity_write   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/file_integrity/integrity_manager.py FileIntegrityManager._session_for   100% 8 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% 32 0 0   100% 12 0   100%
src/local_deep_research/security/file_integrity/integrity_manager.py FileIntegrityManager.verify_file   83% 23 4 0   80% 10 0   82%
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)   100% 33 0 0   100% 0 0   100%
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 _format_size   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/file_upload_validator.py _resolve_max_file_size   100% 10 0 0   100% 4 0   100%
src/local_deep_research/security/file_upload_validator.py FileUploadValidator.validate_file_size   100% 8 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% 23 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% 3 0 0   100% 0 0   100%
src/local_deep_research/security/legacy_ipv4.py is_ambiguous_numeric_ipv4_host   100% 9 0 0   100% 2 0   100%
src/local_deep_research/security/legacy_ipv4.py is_percent_encoded_numeric_ipv4_host   100% 9 0 0   100% 2 0   100%
src/local_deep_research/security/legacy_ipv4.py _decode_percent_escapes   67% 9 3 0   75% 4 1   69%
src/local_deep_research/security/legacy_ipv4.py _parse_component   100% 19 0 0   100% 12 0   100%
src/local_deep_research/security/legacy_ipv4.py _digit_value   100% 7 0 0   100% 6 0   100%
src/local_deep_research/security/legacy_ipv4.py (no function)   100% 11 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_log_record   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 redact_secrets   100% 6 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py sanitize_error_message   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py scrub_error   100% 11 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py sanitize_error_for_client   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py sanitize_error_details   100% 9 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py (no function)   100% 15 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 parse_notification_url_list   100% 10 0 0   100% 10 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._ip_matches_blocked_range   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._resolve_hostname_ips   100% 10 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._host_blocks_at_level   100% 15 0 0   100% 10 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._extract_host   60% 5 2 0   100% 0 0   60%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._normalize_host   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._apprise_query_keys   100% 20 0 0   100% 12 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._validate_apprise_query_policy   100% 12 0 0   100% 8 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._is_private_ip   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator.validate_service_url   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._validate_service_url_impl   97% 67 2 0   98% 42 1   97%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._compute_hint   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/notification_validator.py NotificationURLValidator.validate_service_url_with_hint   89% 37 4 0   90% 20 2   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% 13 0 0   100% 10 0   100%
src/local_deep_research/security/notification_validator.py (no function)   100% 57 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 _has_encoded_traversal   91% 11 1 0   88% 8 1   89%
src/local_deep_research/security/path_validator.py _has_unicode_traversal   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/path_validator.py PathValidator.validate_safe_path   81% 26 5 0   100% 12 0   87%
src/local_deep_research/security/path_validator.py PathValidator.validate_local_filesystem_path   96% 49 2 0   100% 34 0   98%
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% 13 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% 27 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 _is_credential_header   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py _headers_for_redirect   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py safe_get   100% 42 0 0   94% 16 1   98%
src/local_deep_research/security/safe_requests.py safe_post   96% 48 2 0   94% 18 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.rebuild_auth   100% 4 0 0   100% 4 0   100%
src/local_deep_research/security/safe_requests.py SafeSession.request   100% 11 0 0   100% 6 0   100%
src/local_deep_research/security/safe_requests.py SafeSession.send   100% 7 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _parse_retry_after   100% 13 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py safe_get_with_retries   97% 35 1 0   90% 10 1   96%
src/local_deep_research/security/safe_requests.py (no function)   100% 36 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py env_truthy   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py is_diagnose_mode   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py SecureLogger.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py SecureLogger.exception   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py SecureLogger.bind   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py SecureLogger.patch   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py SecureLogger.__getattr__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/secure_logging.py (no function)   100% 12 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   93% 15 1 0   88% 8 1   91%
src/local_deep_research/security/security_settings.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py nat64_embedded_ipv4   90% 10 1 0   88% 8 1   89%
src/local_deep_research/security/ssrf_validator.py is_nat64_wrapped_metadata_ip   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py is_nat64_wrapped_link_local_ip   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py is_ip_blocked   100% 38 0 0   100% 28 0   100%
src/local_deep_research/security/ssrf_validator.py validate_url   96% 56 2 0   96% 24 1   96%
src/local_deep_research/security/ssrf_validator.py assert_base_url_safe   100% 3 0 0   100% 2 0   100%
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 redact_url_for_log   100% 8 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py (no function)   100% 24 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   82% 17 3 0   100% 8 0   88%
src/local_deep_research/security/url_builder.py (no function)   100% 12 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% 4 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% 11 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/queue_processor.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 testing_with_mocks   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/env_definitions/testing.py (no function)   100% 7 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 _reset_legacy_warning_flag_for_tests   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/env_registry.py is_rate_limiting_enabled   100% 18 0 0   100% 8 0   100%
src/local_deep_research/settings/env_registry.py (no function)   100% 13 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   87% 15 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% 48 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py EnvSettingError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py MissingEnvironmentVariableError.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py EnvironmentValueRangeError.__init__   83% 6 1 0   75% 4 1   80%
src/local_deep_research/settings/exceptions.py EnvironmentPathNotFoundError.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py InvalidEnvironmentValueError.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py (no function)   100% 13 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 is_sensitive_setting_key   100% 2 0 0   100% 0 0   100%
src/local_deep_research/settings/logger.py redact_sensitive_keys   92% 12 1 0   90% 10 1   91%
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% 23 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 _validate_imported_setting_value   84% 31 5 0   82% 28 5   83%
src/local_deep_research/settings/manager.py _is_policy_setting   100% 3 0 0   100% 2 0   100%
src/local_deep_research/settings/manager.py is_valid_setting_key   100% 3 0 0   100% 2 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 apply_environment_overrides_to_snapshot   82% 28 5 0   69% 16 3   77%
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   75% 8 2 0   100% 2 0   80%
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._is_environment_locked   100% 4 0 0   100% 2 0   100%
src/local_deep_research/settings/manager.py SettingsManager.default_settings   82% 33 6 0   100% 8 0   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% 28 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   93% 69 5 0   87% 46 6   90%
src/local_deep_research/settings/manager.py SettingsManager.clear_cache   100% 2 0 0   100% 0 0   100%
src/local_deep_research/settings/manager.py SettingsManager.get_all_settings   95% 39 2 0   95% 22 1   95%
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   96% 56 2 0   93% 28 2   95%
src/local_deep_research/settings/manager.py SettingsManager.delete_setting   100% 17 0 0   88% 8 1   96%
src/local_deep_research/settings/manager.py SettingsManager.load_from_defaults_file   100% 7 0 0   100% 2 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   64% 14 5 0   75% 4 1   67%
src/local_deep_research/settings/manager.py SettingsManager.import_settings   98% 55 1 0   94% 32 2   97%
src/local_deep_research/settings/manager.py SettingsManager.emit_settings_changed_after_commit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/manager.py SettingsManager._emit_settings_changed   89% 18 2 0   88% 8 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% 74 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% 14 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% 3 0 0   100% 0 0   100%
src/local_deep_research/storage/file.py FileReportStorage._get_report_path   100% 4 0 0   100% 2 0   100%
src/local_deep_research/storage/file.py FileReportStorage._get_metadata_path   100% 4 0 0   100% 2 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% 14 0 0   100% 10 0   100%
src/local_deep_research/text_optimization/citation_formatter.py is_line_breaking_char   100% 2 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _escape_bibtex   100% 1 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _safe_bibtex_url   100% 4 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _iter_citation_group   100% 4 0 0   75% 4 1   88%
src/local_deep_research/text_optimization/citation_formatter.py _sort_key   50% 4 2 0   100% 0 0   50%
src/local_deep_research/text_optimization/citation_formatter.py _collect_bibliography_entries   100% 8 0 0   100% 6 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   100% 2 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter.format_document_split   95% 20 1 0   93% 14 1   94%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter.apply_inline_hyperlinks   92% 26 2 0   90% 20 2   91%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter.apply_inline_hyperlinks._src_url   100% 1 0 0   100% 0 0   100%
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% 8 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   100% 12 0   100%
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   100% 10 0   100%
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._parse_collections   89% 9 1 0   83% 6 1   87%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._format_source_tagged_hyperlinks   100% 7 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._format_source_tagged_hyperlinks.format_link   100% 6 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._format_source_tagged_hyperlinks.replace_citation   100% 1 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._slugify_collection   100% 2 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._slugify_title   100% 4 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._citation_label   100% 7 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._is_linkable_url   71% 7 2 0   100% 2 0   78%
src/local_deep_research/text_optimization/citation_formatter.py CitationFormatter._extract_source_label   87% 15 2 0   100% 8 0   91%
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% 16 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% 44 0 0   92% 26 2   97%
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% 69 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/chunk_anchor.py extract_chunk_index   93% 27 2 0   100% 20 0   96%
src/local_deep_research/utilities/chunk_anchor.py extract_document_id   100% 23 0 0   100% 18 0   100%
src/local_deep_research/utilities/chunk_anchor.py is_safe_document_id   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/chunk_anchor.py is_library_chunk_result   100% 7 0 0   100% 6 0   100%
src/local_deep_research/utilities/chunk_anchor.py _alias_host   91% 11 1 0   83% 6 1   88%
src/local_deep_research/utilities/chunk_anchor.py is_library_document_link   100% 6 0 0   100% 4 0   100%
src/local_deep_research/utilities/chunk_anchor.py build_chunk_anchor_url   100% 10 0 0   100% 8 0   100%
src/local_deep_research/utilities/chunk_anchor.py (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/utilities/citation_normalizer.py normalize_issn   100% 6 0 0   100% 4 0   100%
src/local_deep_research/utilities/citation_normalizer.py detect_engine   100% 10 0 0   100% 8 0   100%
src/local_deep_research/utilities/citation_normalizer.py _parse_authors_list   91% 23 2 0   86% 22 3   89%
src/local_deep_research/utilities/citation_normalizer.py _parse_name   90% 10 1 0   83% 6 1   88%
src/local_deep_research/utilities/citation_normalizer.py _parse_date   65% 23 8 0   58% 12 1   63%
src/local_deep_research/utilities/citation_normalizer.py _extract_arxiv_id   88% 8 1 0   75% 4 1   83%
src/local_deep_research/utilities/citation_normalizer.py _extract_doi   100% 22 0 0   90% 20 2   95%
src/local_deep_research/utilities/citation_normalizer.py normalize_citation   100% 19 0 0   100% 8 0   100%
src/local_deep_research/utilities/citation_normalizer.py _infer_item_type   83% 6 1 0   75% 4 1   80%
src/local_deep_research/utilities/citation_normalizer.py _build_csl_json   96% 25 1 0   95% 20 1   96%
src/local_deep_research/utilities/citation_normalizer.py (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/utilities/db_utils.py get_db_session   100% 16 0 0   100% 8 0   100%
src/local_deep_research/utilities/db_utils.py _get_cached_user_session   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/db_utils.py cleanup_cached_user_sessions_current_thread   89% 19 2 0   100% 8 0   93%
src/local_deep_research/utilities/db_utils.py get_settings_manager   100% 12 0 0   100% 4 0   100%
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 (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/utilities/enums.py (no function)   100% 6 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   100% 21 0 0   75% 4 1   96%
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/js_rendering.py read_js_rendering_setting   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/js_rendering.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/utilities/json_utils.py get_llm_response_text   100% 12 0 0   100% 10 0   100%
src/local_deep_research/utilities/json_utils.py _coerce_content_blocks   64% 11 4 0   60% 10 2   62%
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 _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% 11 0 0   100% 0 0   100%
src/local_deep_research/utilities/llm_utils.py get_model_identifier   100% 6 0 0   100% 4 0   100%
src/local_deep_research/utilities/llm_utils.py _close_base_llm   100% 35 0 0   100% 12 0   100%
src/local_deep_research/utilities/llm_utils.py _close_inner_ollama_clients   100% 6 0 0   100% 0 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% 18 0 0   100% 10 0   100%
src/local_deep_research/utilities/llm_utils.py fetch_ollama_models   100% 16 0 0   100% 6 0   100%
src/local_deep_research/utilities/llm_utils.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/utilities/log_utils.py _register_milestone_level   100% 4 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_context_fallback   60% 5 2 0   100% 0 0   60%
src/local_deep_research/utilities/log_utils.py _get_request_username   60% 5 2 0   100% 0 0   60%
src/local_deep_research/utilities/log_utils.py _get_research_id   100% 9 0 0   100% 6 0   100%
src/local_deep_research/utilities/log_utils.py _report_silent_exception   12% 16 14 0   10% 10 1   12%
src/local_deep_research/utilities/log_utils.py _clear_daemon_thread_credentials   100% 5 0 0   100% 0 0   100%
src/local_deep_research/utilities/log_utils.py _process_log_queue   67% 15 5 0   100% 4 0   74%
src/local_deep_research/utilities/log_utils.py _write_log_to_database   83% 23 4 0   88% 8 1   84%
src/local_deep_research/utilities/log_utils.py database_sink   93% 27 2 0   80% 10 2   89%
src/local_deep_research/utilities/log_utils.py _truncate_for_database   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/log_utils.py _exception_context   89% 27 3 0   75% 16 4   84%
src/local_deep_research/utilities/log_utils.py _truncate_for_frontend   50% 4 2 0   50% 2 1   50%
src/local_deep_research/utilities/log_utils.py frontend_progress_sink   94% 17 1 0   92% 12 1   93%
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 start_log_queue_processor   100% 9 0 0   100% 2 0   100%
src/local_deep_research/utilities/log_utils.py stop_log_queue_processor   100% 9 0 0   83% 6 1   93%
src/local_deep_research/utilities/log_utils.py config_logger   100% 19 0 0   100% 6 0   100%
src/local_deep_research/utilities/log_utils.py (no function)   100% 50 0 0   100% 0 0   100%
src/local_deep_research/utilities/lxml_thread_safety.py get_thread_parser   100% 5 0 0   100% 2 0   100%
src/local_deep_research/utilities/lxml_thread_safety.py get_thread_trafilatura_parser   100% 5 0 0   100% 2 0   100%
src/local_deep_research/utilities/lxml_thread_safety.py parse_for_trafilatura   57% 7 3 0   100% 2 0   67%
src/local_deep_research/utilities/lxml_thread_safety.py install_per_thread_html_parsers   100% 11 0 0   100% 2 0   100%
src/local_deep_research/utilities/lxml_thread_safety.py install_per_thread_html_parsers.fromstring   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/lxml_thread_safety.py is_installed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/lxml_thread_safety.py (no function)   100% 12 0 0   100% 0 0   100%
src/local_deep_research/utilities/openalex_enrichment.py _normalize_doi   100% 8 0 0   100% 6 0   100%
src/local_deep_research/utilities/openalex_enrichment.py enrich_results_with_source_ids   98% 56 1 0   97% 30 1   98%
src/local_deep_research/utilities/openalex_enrichment.py (no function)   100% 9 0 0   100% 0 0   100%
src/local_deep_research/utilities/request_context.py set_request_user   100% 3 0 0   100% 0 0   100%
src/local_deep_research/utilities/request_context.py reset_request_user   100% 9 0 0   100% 0 0   100%
src/local_deep_research/utilities/request_context.py get_current_username   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/request_context.py get_current_session_id   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/request_context.py request_user   100% 4 0 0   100% 0 0   100%
src/local_deep_research/utilities/request_context.py (no function)   100% 12 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_utilities.py remove_think_tags   100% 4 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py _format_quality_tag   96% 27 1 0   96% 26 1   96%
src/local_deep_research/utilities/search_utilities.py _format_quality_tag_html   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py extract_links_from_search_results   100% 22 0 0   100% 10 0   100%
src/local_deep_research/utilities/search_utilities.py _sanitize_sources_field   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/search_utilities.py _owned_chunk_display   83% 6 1 0   75% 4 1   80%
src/local_deep_research/utilities/search_utilities.py source_url_field   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py count_distinct_sources   100% 11 0 0   100% 8 0   100%
src/local_deep_research/utilities/search_utilities.py format_links_to_markdown   98% 65 1 0   97% 34 1   98%
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 (no function)   100% 18 0 0   100% 0 0   100%
src/local_deep_research/utilities/setup_utils.py setup_user_directories   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/setup_utils.py (no function)   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/sql_utils.py escape_like   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/sql_utils.py (no function)   100% 1 0 0   100% 0 0   100%
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% 1 0 0   100% 0 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   78% 9 2 0   100% 0 0   78%
src/local_deep_research/utilities/thread_context.py preserve_research_context.wrapper   100% 17 0 0   100% 6 0   100%
src/local_deep_research/utilities/thread_context.py (no function)   100% 12 0 0   100% 0 0   100%
src/local_deep_research/utilities/threading_utils.py thread_specific_cache   100% 3 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 (no function)   100% 6 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 unwrap_setting   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/type_utils.py (no function)   100% 3 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 _is_library_route   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/url_utils.py _has_control_chars   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/url_utils.py _normalize_library_alias   77% 26 6 0   86% 14 2   80%
src/local_deep_research/utilities/url_utils.py _parse_library_citation   100% 26 0 0   100% 16 0   100%
src/local_deep_research/utilities/url_utils.py library_display_url   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/url_utils.py is_valid_chunk_fragment   88% 8 1 0   83% 6 1   86%
src/local_deep_research/utilities/url_utils.py preferred_chunk_display   100% 7 0 0   100% 4 0   100%
src/local_deep_research/utilities/url_utils.py canonical_url_key   94% 34 2 0   100% 16 0   96%
src/local_deep_research/utilities/url_utils.py is_safe_custom_llm_endpoint   100% 13 0 0   100% 8 0   100%
src/local_deep_research/utilities/url_utils.py (no function)   100% 29 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/__init__.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py WriteLock.__enter__   100% 1 0 0   0% 2 2   33%
src/local_deep_research/vector_stores/base.py WriteLock.__exit__   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.create   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.load   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.add   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.search   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.delete   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.live_ids   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.count   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.apply   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.reconstruct   100% 0 0 1   100% 0 0   100%
src/local_deep_research/vector_stores/base.py BaseVectorStore.persist   100% 0 0 1   100% 0 0   100%
src/local_deep_research/vector_stores/base.py (no function)   100% 35 0 0   50% 2 1   97%
src/local_deep_research/vector_stores/config.py _load_provider_classes   100% 4 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/config.py resolve_provider   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/config.py get_vector_store_class   100% 6 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/config.py (no function)   100% 8 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex.__init__   100% 12 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex._db   100% 4 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex.index_prepared   96% 27 1 0   79% 14 3   90%
src/local_deep_research/vector_stores/facade.py VectorIndex.index   96% 23 1 0   75% 8 2   90%
src/local_deep_research/vector_stores/facade.py VectorIndex._finalize_db   100% 12 0 0   83% 6 1   94%
src/local_deep_research/vector_stores/facade.py VectorIndex._build_row   100% 2 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex.search   100% 17 0 0   100% 8 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex.delete   100% 13 0 0   100% 4 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex.delete_ids   67% 12 4 0   50% 4 0   62%
src/local_deep_research/vector_stores/facade.py VectorIndex.live_ids   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/facade.py VectorIndex.count   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/facade.py (no function)   100% 38 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py _canon   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.__init__   100% 10 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._bind   100% 6 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._build_base_index   100% 9 0 0   100% 4 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._physical_config_reason   100% 8 0 0   100% 4 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.create   100% 4 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.load   100% 11 0 0   100% 6 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._prepare   94% 16 1 0   92% 12 1   93%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.add   100% 7 0 0   100% 4 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._read_guard   100% 8 0 0   100% 6 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.search   93% 14 1 0   88% 8 1   91%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.supports_delete   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.delete   100% 7 0 0   100% 4 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._rebuild_dropping   94% 16 1 0   62% 8 3   83%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._live_ids_unlocked   100% 3 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.live_ids   100% 2 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.count   100% 2 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.reconstruct   100% 5 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._file_fingerprint   57% 7 3 0   50% 2 1   56%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.persist   74% 38 10 0   100% 6 0   77%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._reload_under_lock   96% 24 1 0   86% 14 2   92%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._restore_from_disk   100% 11 0 0   75% 4 1   93%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._require_add_vectors   67% 3 1 0   50% 2 1   60%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._dedup_new   100% 13 0 0   100% 6 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore.apply   100% 9 0 0   100% 6 0   100%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._apply_locked   97% 30 1 0   83% 12 2   93%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._apply_hnsw   93% 67 5 0   85% 26 4   90%
src/local_deep_research/vector_stores/implementations/faiss_store.py FaissVectorStore._record_integrity   93% 15 1 0   83% 6 1   90%
src/local_deep_research/vector_stores/implementations/faiss_store.py (no function)   100% 54 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py _rag_cache_root   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py _is_live_pkl   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py _is_quarantined_pkl   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py _sidecar_for   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py _find_legacy_docstores   69% 36 11 0   93% 14 1   76%
src/local_deep_research/vector_stores/legacy_cleanup.py _find_legacy_docstores._onerror   0% 3 3 0   100% 0 0   0%
src/local_deep_research/vector_stores/legacy_cleanup.py _delete_file   25% 12 9 0   100% 0 0   25%
src/local_deep_research/vector_stores/legacy_cleanup.py _write_sidecar_atomic   71% 34 10 0   83% 6 1   72%
src/local_deep_research/vector_stores/legacy_cleanup.py _extract_map   85% 20 3 0   100% 6 0   88%
src/local_deep_research/vector_stores/legacy_cleanup.py migrate_legacy_docstores   86% 36 5 0   83% 18 3   85%
src/local_deep_research/vector_stores/legacy_cleanup.py rekey_index_file   89% 65 7 0   79% 28 6   86%
src/local_deep_research/vector_stores/legacy_cleanup.py (no function)   100% 28 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _sidecar_for   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _is_idmap2   100% 6 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _load_uuid_to_id   100% 8 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _resolve_index_params   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _persist_rekeyed_config   94% 16 1 0   90% 10 1   92%
src/local_deep_research/vector_stores/legacy_rekey.py _purge_redundant_pkl   64% 11 4 0   100% 2 0   69%
src/local_deep_research/vector_stores/legacy_rekey.py _quarantine_and_reset   85% 20 3 0   60% 10 4   77%
src/local_deep_research/vector_stores/legacy_rekey.py rekey_user_indexes   55% 99 45 0   77% 26 4   59%
src/local_deep_research/vector_stores/legacy_rekey.py (no function)   100% 22 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/app.py _install_thread_excepthook   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/app.py _install_thread_excepthook._hook   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web/app.py main   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web/app.py _run_with_uvicorn   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/app.py (no function)   92% 12 1 0   50% 2 1   86%
src/local_deep_research/web/auth/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
src/local_deep_research/web/auth/connection_cleanup.py _pop_per_user_locks   70% 20 6 0   100% 0 0   70%
src/local_deep_research/web/auth/connection_cleanup.py _disconnect_all_user_sockets   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/auth/connection_cleanup.py _count_open_fds   100% 16 0 0   100% 4 0   100%
src/local_deep_research/web/auth/connection_cleanup.py cleanup_idle_connections   100% 65 0 0   100% 20 0   100%
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% 15 0 0   100% 0 0   100%
src/local_deep_research/web/auth/password_utils.py get_user_password   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/auth/password_utils.py resolve_user_password   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web/auth/password_utils.py (no function)   100% 4 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% 14 0 0   100% 4 0   100%
src/local_deep_research/web/auth/session_manager.py SessionManager.touch_session   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/auth/session_manager.py SessionManager.destroy_session   100% 7 0 0   100% 4 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% 12 0 0   100% 8 0   100%
src/local_deep_research/web/auth/session_manager.py SessionManager._disconnect_expired_sockets   100% 10 0 0   100% 2 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% 22 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/dependencies/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py get_session_username   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py clear_session_if_unrecoverable   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web/dependencies/auth.py require_auth   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web/dependencies/auth.py _server_session_valid   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py get_db_session_dep   100% 10 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/auth.py get_settings_manager_dep   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py ensure_user_database   100% 30 0 0   95% 22 1   98%
src/local_deep_research/web/dependencies/auth.py (no function)   100% 16 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/csrf.py generate_csrf_token   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/csrf.py _tokens_match   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/csrf.py validate_csrf_token   75% 4 1 0   50% 2 1   67%
src/local_deep_research/web/dependencies/csrf.py CSRFMiddleware.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/csrf.py CSRFMiddleware.__call__   96% 67 3 0   96% 24 1   96%
src/local_deep_research/web/dependencies/csrf.py CSRFMiddleware.__call__.replay_receive   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/csrf.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/flash.py flash   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/flash.py get_flashed_messages   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/flash.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/json_body.py json_body_error   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/json_body.py read_json_dict   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/json_body.py (no function)   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _is_trusted_peer   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _get_client_ip   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _redact_storage_uri   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _user_key   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py set_request_api_rate_limit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _api_user_key   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _api_exempt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py (no function)   98% 64 1 0   92% 12 1   97%
src/local_deep_research/web/dependencies/template_helpers.py render_template   100% 26 0 0   100% 8 0   100%
src/local_deep_research/web/dependencies/template_helpers.py (no function)   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py wrap_sync_route_with_cleanup   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/threadpool.py wrap_sync_route_with_cleanup._wrapped   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/threadpool.py iterate_sync_with_cleanup   100% 19 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/threadpool.py WorkerCleanupStreamingResponse.__init__   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/threadpool.py WorkerCleanupAPIRoute.__init__   100% 2 0 2   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py prepare_router_for_worker_cleanup   100% 3 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/threadpool.py run_db_sync   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py run_db_sync._wrapped   100% 17 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py (no function)   100% 20 0 2   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% 7 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _load_secret_key   100% 23 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py warn_if_threadpool_exceeds_db_pool   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py lifespan   65% 118 41 0   64% 22 8   65%
src/local_deep_research/web/fastapi_app.py _is_private_ip   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.unconditional_headers   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.cache_headers   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.__call__   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.__call__.send_wrapper   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web/fastapi_app.py _is_multipart_upload_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware.__init__   100% 11 0 0   100% 6 0   100%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware._send_413   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware.__call__   100% 34 0 0   100% 16 0   100%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware.__call__.recv_limited   100% 6 0 0   75% 4 1   90%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware.__call__.send_tracking   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware._maybe_warn_untrusted_forwarded_proto   100% 11 0 0   100% 10 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware._maybe_warn_insecure_public   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware.__call__   100% 15 0 0   100% 6 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware.__call__.send_wrapper   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web/fastapi_app.py RememberMeMiddleware.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py RememberMeMiddleware.__call__   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py RememberMeMiddleware.__call__.send_wrapper   100% 15 0 0   100% 8 0   100%
src/local_deep_research/web/fastapi_app.py _is_api_request   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers   85% 26 4 0   100% 0 0   85%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_http_exception   100% 13 0 0   100% 8 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.not_found   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.unhandled_exception   80% 5 1 0   50% 2 1   71%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_json_decode_error   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_web_api_exception   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_news_api_exception   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_policy_denied   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _now_ts   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _enforce_session_expiry   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py _stamp_session_expiry   100% 2 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _enforce_session_revocation   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware.__call__   94% 35 2 0   100% 10 0   96%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware.__call__._MinimalRequest.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware.__call__.send_wrapper   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py RequestTimingASGIMiddleware.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py RequestTimingASGIMiddleware.__call__   100% 19 0 0   100% 6 0   100%
src/local_deep_research/web/fastapi_app.py _request_timing_enabled   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _setup_rate_limiting   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _setup_rate_limiting._rate_limit_exceeded   100% 14 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _add_static_routes   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _add_static_routes.favicon   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _add_static_routes.serve_static   97% 31 1 0   83% 12 2   93%
src/local_deep_research/web/fastapi_app.py _setup_template_globals   100% 16 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _setup_template_globals.csrf_token_factory   0% 1 1 0   100% 0 0   0%
src/local_deep_research/web/fastapi_app.py _setup_template_globals.url_for   90% 10 1 0   83% 6 1   88%
src/local_deep_research/web/fastapi_app.py _PathScopedCORSMiddleware.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _PathScopedCORSMiddleware.__call__   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py _configure_cors   100% 12 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py _mount_all   100% 20 0 0   100% 6 0   100%
src/local_deep_research/web/fastapi_app.py _mount_all.index   100% 20 0 0   75% 4 1   96%
src/local_deep_research/web/fastapi_app.py _validate_url_for_bindings   97% 38 1 0   92% 24 2   95%
src/local_deep_research/web/fastapi_app.py _validate_url_for_bindings._under_wildcard_prefix   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py (no function)   96% 115 5 0   50% 2 1   95%
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% 14 0 0   100% 4 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 ChatSetting.validate_chat_key   0% 3 3 0   0% 2 0   0%
src/local_deep_research/web/models/settings.py (no function)   100% 36 0 0   100% 0 0   100%
src/local_deep_research/web/queue/__init__.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/queue/lifecycle_cleanup.py reconcile_research_queue_status   100% 12 0 0   100% 4 0   100%
src/local_deep_research/web/queue/lifecycle_cleanup.py cleanup_queued_research_state   90% 20 2 0   83% 12 2   88%
src/local_deep_research/web/queue/lifecycle_cleanup.py (no function)   100% 9 0 0   100% 0 0   100%
src/local_deep_research/web/queue/manager.py _safe_commit   100% 9 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% 16 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.__init__   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._get_user_critical_lock   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.pop_user_critical_lock   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._bump_spawn_retry_count   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._commit_with_safe_rollback   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._delete_queue_row_safely   87% 15 2 0   100% 2 0   88%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.start   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.stop   100% 5 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% 49 0 0   100% 20 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._start_research_directly   89% 81 9 0   69% 16 5   86%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._drop_active_research_row   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.notify_research_completed   100% 12 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.notify_research_failed   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._process_queue_loop   87% 31 4 0   100% 10 0   90%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._drain_pending_operations   100% 12 0 0   83% 6 1   94%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._process_user_queue   97% 39 1 0   92% 12 1   96%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._reclaim_stranded_queue_rows   94% 17 1 0   90% 10 1   93%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._sweep_missing_parent_queue_rows   93% 15 1 0   90% 10 1   92%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._start_queued_researches   91% 81 7 0   70% 20 6   87%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._start_research   100% 43 0 0   100% 12 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.reconcile_orphan_active_research   88% 26 3 0   88% 8 1   88%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2._evict_stale_pending_operations   67% 9 3 0   50% 6 1   60%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.queue_progress_update   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.queue_error_update   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/queue/processor_v2.py QueueProcessorV2.process_pending_operations_for_user   95% 91 5 0   84% 44 7   91%
src/local_deep_research/web/queue/processor_v2.py (no function)   100% 64 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py _ReentrantUserLock.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py _ReentrantUserLock.acquire   86% 7 1 0   75% 4 1   82%
src/local_deep_research/web/research_state.py _ReentrantUserLock.release   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py _ReentrantUserLock.locked   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py _ReentrantUserLock.__enter__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py _ReentrantUserLock.__exit__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py is_research_active   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py get_active_research_ids   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py get_active_research_snapshot   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py get_research_field   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web/research_state.py set_active_research   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py _get_user_research_start_gate   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py get_user_research_start_lock   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py user_research_start_gate   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py check_and_start_research   100% 18 0 0   80% 10 2   93%
src/local_deep_research/web/research_state.py update_active_research   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py append_research_log   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py update_progress_if_higher   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/research_state.py remove_active_research   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py iter_active_research   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py get_active_research_count   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py get_usernames_with_active_research   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py is_termination_requested   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py set_termination_flag   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py clear_termination_flag   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/research_state.py is_research_thread_alive   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py update_progress_and_check_active   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/research_state.py cleanup_research   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/research_state.py reclaim_stale_user_active_research   100% 15 0 0   100% 8 0   100%
src/local_deep_research/web/research_state.py (no function)   100% 38 0 0   100% 0 0   100%
src/local_deep_research/web/routers/__init__.py (no function)   100% 0 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api.py get_current_config   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api.py api_start_research   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api.py api_research_status   100% 14 0 0   83% 6 1   95%
src/local_deep_research/web/routers/api.py api_terminate_research   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/api.py api_get_resources   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api.py api_add_resource   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/api.py api_add_resource._impl   100% 22 0 0   100% 6 0   100%
src/local_deep_research/web/routers/api.py api_delete_resource   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api.py _ollama_base_url_from_config   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api.py _probe_ollama_tags   100% 16 0 0   100% 4 0   100%
src/local_deep_research/web/routers/api.py check_ollama_status   100% 28 0 0   100% 10 0   100%
src/local_deep_research/web/routers/api.py check_ollama_model   100% 45 0 0   100% 18 0   100%
src/local_deep_research/web/routers/api.py (no function)   100% 40 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api_v1.py _scrub_error_fields   100% 10 0 0   100% 10 0   100%
src/local_deep_research/web/routers/api_v1.py _reject_unsafe_body_params   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/api_v1.py _pop_ineffective_params   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/api_v1.py _validate_param_types   100% 12 0 0   100% 10 0   100%
src/local_deep_research/web/routers/api_v1.py require_api_access   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/routers/api_v1.py require_api_access._read_settings   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api_v1.py health_check   95% 38 2 0   100% 10 0   96%
src/local_deep_research/web/routers/api_v1.py api_documentation   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/api_v1.py _load_user_context_into_params   75% 24 6 0   67% 6 2   73%
src/local_deep_research/web/routers/api_v1.py api_quick_summary   100% 41 0 0   100% 18 0   100%
src/local_deep_research/web/routers/api_v1.py api_generate_report   100% 39 0 0   100% 16 0   100%
src/local_deep_research/web/routers/api_v1.py api_analyze_documents   100% 29 0 0   100% 12 0   100%
src/local_deep_research/web/routers/api_v1.py (no function)   96% 52 2 0   100% 0 0   96%
src/local_deep_research/web/routers/auth.py get_csrf_token   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _rollback_partial_session   78% 9 2 0   50% 2 1   73%
src/local_deep_research/web/routers/auth.py _disconnect_user_sockets   60% 5 2 0   100% 0 0   60%
src/local_deep_research/web/routers/auth.py _disconnect_session_sockets   60% 5 2 0   100% 0 0   60%
src/local_deep_research/web/routers/auth.py login_page   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/auth.py login   94% 49 3 0   90% 10 1   93%
src/local_deep_research/web/routers/auth.py login._ctx_post_login   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _perform_post_login_tasks   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _perform_post_login_tasks_body   91% 80 7 0   83% 12 2   90%
src/local_deep_research/web/routers/auth.py _log_step_duration   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/auth.py validate_password   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py register_page   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/auth.py register   87% 92 12 0   92% 26 2   88%
src/local_deep_research/web/routers/auth.py logout   82% 34 6 0   80% 10 2   82%
src/local_deep_research/web/routers/auth.py check_auth   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/auth.py change_password_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py change_password   88% 52 6 0   90% 20 2   89%
src/local_deep_research/web/routers/auth.py integrity_check   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py (no function)   100% 58 0 0   100% 0 0   100%
src/local_deep_research/web/routers/benchmark.py _validate_datasets_config   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web/routers/benchmark.py index   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/routers/benchmark.py results   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/benchmark.py start_benchmark   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/benchmark.py _start_benchmark_sync   84% 69 11 0   76% 34 8   82%
src/local_deep_research/web/routers/benchmark.py get_running_benchmark   100% 11 0 0   100% 2 0   100%
src/local_deep_research/web/routers/benchmark.py get_benchmark_status   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/benchmark.py cancel_benchmark   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/benchmark.py get_benchmark_history   100% 45 0 0   79% 14 3   95%
src/local_deep_research/web/routers/benchmark.py get_benchmark_results   91% 47 4 0   86% 14 2   90%
src/local_deep_research/web/routers/benchmark.py export_benchmark_results   100% 24 0 0   100% 6 0   100%
src/local_deep_research/web/routers/benchmark.py get_saved_configs   50% 6 3 0   100% 0 0   50%
src/local_deep_research/web/routers/benchmark.py start_benchmark_simple   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/benchmark.py _start_benchmark_simple_sync   98% 41 1 0   90% 20 2   95%
src/local_deep_research/web/routers/benchmark.py validate_config   86% 22 3 0   100% 12 0   91%
src/local_deep_research/web/routers/benchmark.py get_search_quality   100% 11 0 0   100% 2 0   100%
src/local_deep_research/web/routers/benchmark.py delete_benchmark_run   100% 18 0 0   100% 4 0   100%
src/local_deep_research/web/routers/benchmark.py (no function)   100% 53 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py _bad_body   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py _chat_user_key   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py _json_object_body   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py _load_settings   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py _parse_int_param   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/routers/chat.py _validate_title   100% 8 0 0   100% 6 0   100%
src/local_deep_research/web/routers/chat.py _cleanup_chat_send_rows   78% 9 2 0   100% 0 0   78%
src/local_deep_research/web/routers/chat.py chat_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py create_session   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py create_session._impl   83% 24 4 0   88% 8 1   84%
src/local_deep_research/web/routers/chat.py generate_session_title   80% 5 1 0   50% 2 1   71%
src/local_deep_research/web/routers/chat.py generate_session_title._impl   74% 19 5 0   67% 6 2   72%
src/local_deep_research/web/routers/chat.py list_sessions   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py list_sessions._impl   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py get_session   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py get_session._impl   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py update_session   80% 5 1 0   50% 2 1   71%
src/local_deep_research/web/routers/chat.py update_session._impl   90% 39 4 0   88% 16 2   89%
src/local_deep_research/web/routers/chat.py delete_session   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py delete_session._impl   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py get_messages   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py get_messages._impl   100% 19 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py send_message   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py send_message._impl   87% 110 14 2   81% 36 5   86%
src/local_deep_research/web/routers/chat.py _enforce_chat_session_research_slot   88% 8 1 0   75% 4 1   83%
src/local_deep_research/web/routers/chat.py delete_attempt   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py delete_attempt._impl   75% 12 3 0   100% 0 0   75%
src/local_deep_research/web/routers/chat.py retry_attempt   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/chat.py retry_attempt._impl   59% 98 40 0   41% 22 7   56%
src/local_deep_research/web/routers/chat.py (no function)   100% 71 0 0   100% 0 0   100%
src/local_deep_research/web/routers/context_overflow_api.py get_context_overflow_metrics   100% 71 0 0   96% 24 1   99%
src/local_deep_research/web/routers/context_overflow_api.py get_research_context_overflow   100% 29 0 0   100% 10 0   100%
src/local_deep_research/web/routers/context_overflow_api.py (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/web/routers/followup.py prepare_followup   100% 22 0 0   100% 6 0   100%
src/local_deep_research/web/routers/followup.py prepare_followup._load_sync   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/followup.py start_followup   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/followup.py _start_followup_sync   78% 120 27 0   77% 22 3   77%
src/local_deep_research/web/routers/followup.py (no function)   100% 19 0 0   100% 0 0   100%
src/local_deep_research/web/routers/history.py history_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/history.py get_history   100% 32 0 0   100% 6 0   100%
src/local_deep_research/web/routers/history.py get_research_status   100% 23 0 0   100% 6 0   100%
src/local_deep_research/web/routers/history.py get_research_details   100% 23 0 0   100% 4 0   100%
src/local_deep_research/web/routers/history.py get_report   100% 16 0 0   100% 4 0   100%
src/local_deep_research/web/routers/history.py get_markdown   100% 13 0 0   100% 4 0   100%
src/local_deep_research/web/routers/history.py get_research_logs   100% 15 0 0   100% 4 0   100%
src/local_deep_research/web/routers/history.py get_log_count   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/routers/history.py (no function)   100% 36 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py _string_list_error   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library.py handle_web_api_exception   0% 4 4 0   0% 2 0   0%
src/local_deep_research/web/routers/library.py get_authenticated_user_password   100% 13 0 0   100% 6 0   100%
src/local_deep_research/web/routers/library.py library_page   89% 45 5 0   100% 0 0   89%
src/local_deep_research/web/routers/library.py document_details_page   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library.py download_manager_page   76% 25 6 0   50% 2 1   74%
src/local_deep_research/web/routers/library.py get_library_stats   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py get_collections_list   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py get_documents   100% 16 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py toggle_favorite   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py get_pdf_url   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py _serve_pdf   100% 22 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library.py _serve_pdf._error   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library.py view_pdf_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py serve_pdf_api   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py view_text_page   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library.py serve_text_api   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library.py open_folder   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py download_single_resource   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library.py download_text_single   69% 13 4 0   100% 4 0   76%
src/local_deep_research/web/routers/library.py download_all_text   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py download_all_text.generate   100% 45 0 0   90% 10 1   98%
src/local_deep_research/web/routers/library.py download_research_pdfs   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library.py download_research_pdfs._queue_sync   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py _claim_download_queue_item   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py _release_download_queue_item   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py _finalize_download_queue_item   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py download_bulk   93% 15 1 0   88% 8 1   91%
src/local_deep_research/web/routers/library.py download_bulk.generate   93% 94 7 0   89% 28 3   92%
src/local_deep_research/web/routers/library.py get_research_list   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py sync_library   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py mark_for_redownload   91% 11 1 0   83% 6 1   88%
src/local_deep_research/web/routers/library.py mark_for_redownload._mark_sync   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py queue_all_undownloaded   92% 48 4 0   88% 16 2   91%
src/local_deep_research/web/routers/library.py get_research_sources   88% 17 2 0   100% 6 0   91%
src/local_deep_research/web/routers/library.py check_downloads   92% 12 1 0   83% 6 1   89%
src/local_deep_research/web/routers/library.py check_downloads._query_sync   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library.py download_source   92% 12 1 0   83% 6 1   89%
src/local_deep_research/web/routers/library.py download_source._download_sync   87% 30 4 0   100% 12 0   90%
src/local_deep_research/web/routers/library.py (no function)   100% 81 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library_delete.py _parse_json_body   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library_delete.py _validate_document_ids_from_data   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library_delete.py _validate_document_ids   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py delete_document   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library_delete.py delete_document_blob   100% 11 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library_delete.py get_document_deletion_preview   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py remove_document_from_collection   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library_delete.py delete_collection   100% 14 0 0   100% 6 0   100%
src/local_deep_research/web/routers/library_delete.py delete_collection_index   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py get_collection_deletion_preview   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py delete_documents_bulk   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py delete_documents_blobs_bulk   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py remove_documents_from_collection_bulk   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_delete.py get_bulk_deletion_preview   100% 12 0 0   100% 4 0   100%
src/local_deep_research/web/routers/library_delete.py (no function)   100% 37 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library_search.py get_research_history_collection   100% 21 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_search.py convert_all_research   100% 18 0 0   100% 6 0   100%
src/local_deep_research/web/routers/library_search.py convert_all_research._convert   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library_search.py add_research_to_collection   80% 5 1 0   50% 2 1   71%
src/local_deep_research/web/routers/library_search.py _add_research_to_collection_sync   87% 23 3 0   88% 8 1   87%
src/local_deep_research/web/routers/library_search.py search_collection   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library_search.py _search_collection_sync   95% 39 2 0   88% 16 2   93%
src/local_deep_research/web/routers/library_search.py _enrich_with_research_metadata   95% 22 1 0   83% 6 1   93%
src/local_deep_research/web/routers/library_search.py _enrich_with_document_metadata   91% 22 2 0   100% 8 0   93%
src/local_deep_research/web/routers/library_search.py (no function)   100% 21 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py _extract_domain   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/metrics.py get_rating_analytics   100% 22 0 0   100% 8 0   100%
src/local_deep_research/web/routers/metrics.py get_link_analytics   94% 90 5 0   85% 46 7   91%
src/local_deep_research/web/routers/metrics.py get_available_strategies   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py get_strategy_analytics   100% 29 0 0   100% 10 0   100%
src/local_deep_research/web/routers/metrics.py get_rate_limiting_analytics   98% 43 1 0   93% 14 1   96%
src/local_deep_research/web/routers/metrics.py metrics_dashboard   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py context_overflow_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_metrics   100% 39 0 0   100% 2 0   100%
src/local_deep_research/web/routers/metrics.py get_rate_limiting_metrics   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_current_rate_limits   100% 10 0 0   100% 2 0   100%
src/local_deep_research/web/routers/metrics.py api_research_link_metrics   84% 37 6 0   75% 20 5   81%
src/local_deep_research/web/routers/metrics.py api_research_metrics   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_research_timeline_metrics   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_research_search_metrics   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_enhanced_metrics   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_get_research_rating   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/metrics.py api_save_research_rating   88% 26 3 0   100% 16 0   93%
src/local_deep_research/web/routers/metrics.py api_save_research_rating._save_sync   91% 11 1 0   83% 6 1   88%
src/local_deep_research/web/routers/metrics.py star_reviews   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py cost_analytics   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_star_reviews   100% 49 0 0   100% 18 0   100%
src/local_deep_research/web/routers/metrics.py api_pricing   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_model_pricing   100% 9 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_cost_calculation   100% 18 0 0   100% 4 0   100%
src/local_deep_research/web/routers/metrics.py api_research_costs   100% 22 0 0   100% 6 0   100%
src/local_deep_research/web/routers/metrics.py api_cost_analytics   71% 45 13 0   50% 18 5   65%
src/local_deep_research/web/routers/metrics.py link_analytics   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_link_analytics   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_get_domain_classifications   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_get_classifications_summary   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_classify_domains   100% 14 0 0   100% 8 0   100%
src/local_deep_research/web/routers/metrics.py api_classify_domains._classify_sync   100% 25 0 0   100% 6 0   100%
src/local_deep_research/web/routers/metrics.py api_classification_progress   100% 16 0 0   83% 6 1   95%
src/local_deep_research/web/routers/metrics.py journal_quality   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_journal_data_status   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_journal_data_download   100% 41 0 0   93% 14 1   98%
src/local_deep_research/web/routers/metrics.py api_journal_data_download._run_download   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py api_journal_quality   88% 32 4 0   88% 8 1   88%
src/local_deep_research/web/routers/metrics.py _ref_db_lookup   0% 7 7 0   0% 2 0   0%
src/local_deep_research/web/routers/metrics.py _get_ref_db_or_none   60% 5 2 0   100% 0 0   60%
src/local_deep_research/web/routers/metrics.py _resolve_paper_quality   62% 8 3 0   50% 6 3   57%
src/local_deep_research/web/routers/metrics.py _lookup_journal_llm_quality   75% 8 2 0   50% 4 2   67%
src/local_deep_research/web/routers/metrics.py api_user_research_journals   23% 39 30 0   14% 14 2   21%
src/local_deep_research/web/routers/metrics.py api_research_journals   88% 41 5 0   75% 16 4   84%
src/local_deep_research/web/routers/metrics.py (no function)   100% 105 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_flask_api.py _subscription_validation_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_flask_api.py _validate_subscription_payload   100% 26 0 0   100% 24 0   100%
src/local_deep_research/web/routers/news_flask_api.py require_scheduler_control   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_flask_api.py safe_error_message   100% 8 0 0   100% 6 0   100%
src/local_deep_research/web/routers/news_flask_api.py _is_job_owned_by_user   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web/routers/news_flask_api.py get_user_id   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/routers/news_flask_api.py _start_research_in_process   56% 16 7 0   50% 4 2   55%
src/local_deep_research/web/routers/news_flask_api.py _reject_custom_endpoint_async   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_flask_api.py _reject_custom_endpoint   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_flask_api.py _is_valid_uuid   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_flask_api.py get_news_feed   100% 31 0 0   100% 6 0   100%
src/local_deep_research/web/routers/news_flask_api.py create_subscription   94% 34 2 0   100% 6 0   95%
src/local_deep_research/web/routers/news_flask_api.py vote_on_news   100% 17 0 0   100% 6 0   100%
src/local_deep_research/web/routers/news_flask_api.py get_batch_feedback   95% 21 1 0   90% 10 1   94%
src/local_deep_research/web/routers/news_flask_api.py submit_feedback   100% 18 0 0   100% 8 0   100%
src/local_deep_research/web/routers/news_flask_api.py research_news_item   92% 13 1 0   50% 2 1   87%
src/local_deep_research/web/routers/news_flask_api.py get_current_user_subscriptions   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_flask_api.py get_subscription   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/news_flask_api.py update_subscription   83% 23 4 0   100% 10 0   88%
src/local_deep_research/web/routers/news_flask_api.py delete_subscription   71% 7 2 0   100% 0 0   71%
src/local_deep_research/web/routers/news_flask_api.py run_subscription_now   100% 28 0 0   100% 6 0   100%
src/local_deep_research/web/routers/news_flask_api.py get_subscription_history   88% 16 2 0   100% 2 0   89%
src/local_deep_research/web/routers/news_flask_api.py save_preferences   82% 11 2 0   100% 2 0   85%
src/local_deep_research/web/routers/news_flask_api.py get_categories   75% 8 2 0   100% 0 0   75%
src/local_deep_research/web/routers/news_flask_api.py get_scheduler_status   94% 32 2 0   80% 10 2   90%
src/local_deep_research/web/routers/news_flask_api.py start_scheduler   80% 10 2 0   100% 2 0   83%
src/local_deep_research/web/routers/news_flask_api.py stop_scheduler   83% 12 2 0   100% 4 0   88%
src/local_deep_research/web/routers/news_flask_api.py check_subscriptions_now   88% 17 2 0   100% 4 0   90%
src/local_deep_research/web/routers/news_flask_api.py trigger_cleanup   80% 10 2 0   100% 2 0   83%
src/local_deep_research/web/routers/news_flask_api.py get_active_users   80% 10 2 0   100% 2 0   83%
src/local_deep_research/web/routers/news_flask_api.py scheduler_stats   89% 18 2 0   80% 10 2   86%
src/local_deep_research/web/routers/news_flask_api.py check_overdue_subscriptions   95% 39 2 0   100% 6 0   96%
src/local_deep_research/web/routers/news_flask_api.py get_folders   75% 8 2 0   100% 0 0   75%
src/local_deep_research/web/routers/news_flask_api.py create_folder   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_flask_api.py create_folder._impl   83% 12 2 0   100% 4 0   88%
src/local_deep_research/web/routers/news_flask_api.py update_folder   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_flask_api.py update_folder._impl   78% 9 2 0   100% 2 0   82%
src/local_deep_research/web/routers/news_flask_api.py delete_folder   80% 10 2 0   100% 2 0   83%
src/local_deep_research/web/routers/news_flask_api.py get_subscriptions_organized   85% 13 2 0   100% 2 0   87%
src/local_deep_research/web/routers/news_flask_api.py update_subscription_folder   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web/routers/news_flask_api.py _update_subscription_folder_sync   94% 31 2 0   100% 16 0   96%
src/local_deep_research/web/routers/news_flask_api.py get_subscription_stats   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_flask_api.py get_search_history   78% 9 2 0   100% 0 0   78%
src/local_deep_research/web/routers/news_flask_api.py add_search_history   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_flask_api.py add_search_history._impl   81% 16 3 0   100% 2 0   83%
src/local_deep_research/web/routers/news_flask_api.py clear_search_history   80% 10 2 0   100% 0 0   80%
src/local_deep_research/web/routers/news_flask_api.py (no function)   100% 111 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_pages.py news_page   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_pages.py subscriptions_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_pages.py new_subscription_page   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_pages.py edit_subscription_page   100% 14 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_pages.py news_health_check   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/news_pages.py _load_user_settings   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_pages.py (no function)   100% 19 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _clamp_limit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _clamp_text_query   86% 7 1 0   83% 6 1   85%
src/local_deep_research/web/routers/notes.py _log_value_preview   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _parse_json_off_loop   67% 3 1 0   50% 2 1   60%
src/local_deep_research/web/routers/notes.py _notes_json_body   91% 23 2 0   100% 12 0   94%
src/local_deep_research/web/routers/notes.py _notes_json_body._too_large   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _trigger_note_auto_index   57% 14 6 0   50% 4 2   56%
src/local_deep_research/web/routers/notes.py notes_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py note_detail_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py list_notes   91% 23 2 0   100% 4 0   93%
src/local_deep_research/web/routers/notes.py create_note   80% 20 4 0   100% 8 0   86%
src/local_deep_research/web/routers/notes.py semantic_search_notes   91% 23 2 0   100% 4 0   93%
src/local_deep_research/web/routers/notes.py ask_context   67% 6 2 0   100% 0 0   67%
src/local_deep_research/web/routers/notes.py search_notes_for_linking   65% 17 6 0   100% 2 0   68%
src/local_deep_research/web/routers/notes.py get_note   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py update_note   82% 22 4 0   100% 10 0   88%
src/local_deep_research/web/routers/notes.py delete_note   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py get_note_collections   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py add_note_to_collection   82% 17 3 0   88% 8 1   84%
src/local_deep_research/web/routers/notes.py remove_note_from_collection   83% 12 2 0   100% 4 0   88%
src/local_deep_research/web/routers/notes.py get_note_research   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py link_research_to_note   64% 22 8 0   40% 10 2   56%
src/local_deep_research/web/routers/notes.py patch_note_research   80% 15 3 0   83% 6 1   81%
src/local_deep_research/web/routers/notes.py reorder_note_research   80% 20 4 0   80% 10 2   80%
src/local_deep_research/web/routers/notes.py get_research_notes   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py create_research_note   80% 15 3 0   50% 2 1   76%
src/local_deep_research/web/routers/notes.py save_research_as_note   89% 35 4 0   88% 8 1   88%
src/local_deep_research/web/routers/notes.py _validated_annotation_fields   82% 17 3 0   75% 12 3   79%
src/local_deep_research/web/routers/notes.py _comment_note_title   75% 4 1 0   50% 2 1   67%
src/local_deep_research/web/routers/notes.py _annotation_response   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _comment_note_content   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _research_exists   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py get_research_annotations   78% 9 2 0   100% 2 0   82%
src/local_deep_research/web/routers/notes.py create_research_annotation   78% 18 4 0   75% 4 1   77%
src/local_deep_research/web/routers/notes.py delete_research_annotation   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py get_document_notes   62% 8 3 0   50% 2 1   60%
src/local_deep_research/web/routers/notes.py create_document_note   80% 15 3 0   50% 2 1   76%
src/local_deep_research/web/routers/notes.py get_document_annotations   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py create_document_annotation   77% 22 5 0   50% 4 2   73%
src/local_deep_research/web/routers/notes.py delete_document_annotation   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py index_note_to_collection   86% 21 3 0   90% 10 1   87%
src/local_deep_research/web/routers/notes.py get_similar_notes   67% 12 4 0   100% 2 0   71%
src/local_deep_research/web/routers/notes.py summarize_note   70% 10 3 0   75% 4 1   71%
src/local_deep_research/web/routers/notes.py extract_research_questions   40% 10 6 0   50% 4 2   43%
src/local_deep_research/web/routers/notes.py suggest_tags   84% 19 3 0   88% 8 1   85%
src/local_deep_research/web/routers/notes.py extract_key_concepts   40% 10 6 0   50% 4 2   43%
src/local_deep_research/web/routers/notes.py get_backlinks   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py get_outgoing_links   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py get_suggested_links   83% 12 2 0   100% 2 0   86%
src/local_deep_research/web/routers/notes.py accept_suggested_link   75% 16 4 0   67% 6 2   73%
src/local_deep_research/web/routers/notes.py get_unlinked_mentions   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/notes.py similar_passages   81% 16 3 0   83% 6 1   82%
src/local_deep_research/web/routers/notes.py fact_check_note   77% 13 3 0   83% 6 1   79%
src/local_deep_research/web/routers/notes.py _grade_note_claims   100% 38 0 0   100% 10 0   100%
src/local_deep_research/web/routers/notes.py grade_note_fact_check   79% 14 3 0   83% 6 1   80%
src/local_deep_research/web/routers/notes.py resolve_link   82% 17 3 0   83% 6 1   83%
src/local_deep_research/web/routers/notes.py preview_synthesis   84% 19 3 0   90% 10 1   86%
src/local_deep_research/web/routers/notes.py synthesize_notes   98% 47 1 0   94% 16 1   97%
src/local_deep_research/web/routers/notes.py get_note_versions   78% 23 5 0   75% 4 1   78%
src/local_deep_research/web/routers/notes.py get_semantic_diff   88% 26 3 0   90% 10 1   89%
src/local_deep_research/web/routers/notes.py get_note_version   86% 14 2 0   100% 4 0   89%
src/local_deep_research/web/routers/notes.py restore_note_version   60% 15 6 0   50% 8 2   57%
src/local_deep_research/web/routers/notes.py (no function)   100% 189 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _agent_enabled_default_on   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _is_protected_collection   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _get_auto_index_executor   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _try_reserve_auto_index_slot   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _release_auto_index_slot   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _shutdown_auto_index_executor   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py get_rag_service   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _get_text_separators   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _parse_configured_text_separators   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _module_matches   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _format_test_embedding_error   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py get_supported_formats   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py embedding_settings_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py view_document_chunks   100% 16 0 0   83% 6 1   95%
src/local_deep_research/web/routers/rag.py collections_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py collection_create_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _validated_collection_id   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py collection_details_page   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py collection_upload_page   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py get_current_settings   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py test_embedding   96% 28 1 0   83% 6 1   94%
src/local_deep_research/web/routers/rag.py test_embedding._run_embedding_test   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py get_available_models   97% 34 1 0   100% 6 0   98%
src/local_deep_research/web/routers/rag.py get_available_models._embeddings_model_fetch_allowed   53% 15 7 0   25% 4 1   47%
src/local_deep_research/web/routers/rag.py get_index_info   87% 15 2 0   100% 4 0   89%
src/local_deep_research/web/routers/rag.py get_rag_stats   80% 10 2 0   100% 2 0   83%
src/local_deep_research/web/routers/rag.py index_document   92% 24 2 0   100% 10 0   94%
src/local_deep_research/web/routers/rag.py index_document._index_sync   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py remove_document   90% 21 2 0   88% 8 1   90%
src/local_deep_research/web/routers/rag.py remove_document._remove_sync   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py index_all   89% 19 2 0   100% 2 0   90%
src/local_deep_research/web/routers/rag.py index_all.generate   88% 51 6 0   90% 20 2   89%
src/local_deep_research/web/routers/rag.py configure_rag   100% 41 0 0   100% 18 0   100%
src/local_deep_research/web/routers/rag.py configure_rag._persist_configuration   100% 21 0 0   100% 10 0   100%
src/local_deep_research/web/routers/rag.py get_documents   86% 42 6 0   100% 6 0   88%
src/local_deep_research/web/routers/rag.py get_collections   88% 16 2 0   100% 4 0   90%
src/local_deep_research/web/routers/rag.py create_collection   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _create_collection_sync   94% 35 2 0   100% 16 0   96%
src/local_deep_research/web/routers/rag.py update_collection   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _update_collection_sync   95% 38 2 0   100% 22 0   97%
src/local_deep_research/web/routers/rag.py _try_pdf_upgrade   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py upload_to_collection   91% 32 3 0   93% 14 1   91%
src/local_deep_research/web/routers/rag.py _upload_to_collection_sync   93% 134 10 0   95% 38 2   93%
src/local_deep_research/web/routers/rag.py get_collection_documents   95% 44 2 0   94% 18 1   95%
src/local_deep_research/web/routers/rag.py _store_collection_embedding_metadata   100% 17 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _reset_collection_for_reindex   100% 9 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _unlink_reindex_faiss_files   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _query_documents_to_index   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py index_collection   91% 23 2 0   100% 2 0   92%
src/local_deep_research/web/routers/rag.py index_collection.generate   91% 95 9 0   80% 30 4   88%
src/local_deep_research/web/routers/rag.py index_collection.generate._on_progress   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py index_collection.generate._run_parallel   55% 11 5 0   100% 0 0   55%
src/local_deep_research/web/routers/rag.py _get_rag_service_for_thread   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py trigger_auto_index   94% 33 2 0   100% 6 0   95%
src/local_deep_research/web/routers/rag.py trigger_auto_index._release_slot_once   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py trigger_auto_index._wrapped_worker   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _auto_index_documents_worker   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _sanitized_indexing_errors   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _background_index_worker   100% 66 0 0   100% 16 0   100%
src/local_deep_research/web/routers/rag.py _background_index_worker._on_progress   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _background_index_worker._is_cancelled   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _is_database_locked_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _do_update_task_status   96% 25 1 0   90% 20 2   93%
src/local_deep_research/web/routers/rag.py _update_task_status   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _is_task_cancelled   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py start_background_index   100% 12 0 0   100% 6 0   100%
src/local_deep_research/web/routers/rag.py _start_background_index_sync   100% 29 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _start_background_index_sync._ctx_worker   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py get_index_status   100% 22 0 0   100% 8 0   100%
src/local_deep_research/web/routers/rag.py cancel_indexing   100% 34 0 0   100% 16 0   100%
src/local_deep_research/web/routers/rag.py (no function)   100% 141 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py redirect_static   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py progress_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py research_details_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py results_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py history_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py _extract_research_params   100% 42 0 0   100% 22 0   100%
src/local_deep_research/web/routers/research.py _precheck_collection_agent_enabled   100% 18 0 3   100% 8 0   100%
src/local_deep_research/web/routers/research.py _precheck_engine_policy   88% 32 4 0   88% 8 1   88%
src/local_deep_research/web/routers/research.py _apply_policy_overrides   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web/routers/research.py _research_not_found   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py _queue_research   100% 13 0 0   100% 2 0   100%
src/local_deep_research/web/routers/research.py start_research   100% 18 0 0   100% 8 0   100%
src/local_deep_research/web/routers/research.py _start_research_sync   87% 207 27 0   84% 62 8   86%
src/local_deep_research/web/routers/research.py terminate_research   94% 48 3 0   86% 14 2   92%
src/local_deep_research/web/routers/research.py delete_research   70% 30 9 0   70% 10 1   70%
src/local_deep_research/web/routers/research.py clear_history   86% 28 4 0   92% 12 1   88%
src/local_deep_research/web/routers/research.py open_file_location   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py save_raw_config   93% 30 2 0   100% 6 0   94%
src/local_deep_research/web/routers/research.py save_raw_config.find_blocked_keys   100% 14 0 0   100% 12 0   100%
src/local_deep_research/web/routers/research.py get_history   81% 36 7 0   90% 10 1   83%
src/local_deep_research/web/routers/research.py get_research_details   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/research.py get_research_logs   100% 29 0 0   100% 10 0   100%
src/local_deep_research/web/routers/research.py _log_export_exempt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py export_research_logs   75% 12 3 0   100% 2 0   79%
src/local_deep_research/web/routers/research.py export_research_logs.generate   90% 20 2 0   100% 6 0   92%
src/local_deep_research/web/routers/research.py get_research_report   100% 16 0 0   100% 4 0   100%
src/local_deep_research/web/routers/research.py export_research_report   73% 33 9 0   83% 6 1   74%
src/local_deep_research/web/routers/research.py get_research_status   96% 51 2 0   100% 22 0   97%
src/local_deep_research/web/routers/research.py get_queue_status   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py get_queue_position   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/research.py get_upload_limits   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py upload_pdf   80% 54 11 0   89% 18 2   82%
src/local_deep_research/web/routers/research.py upload_pdf._validate_and_extract   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/research.py (no function)   100% 96 0 0   100% 0 0   100%
src/local_deep_research/web/routers/scheduler.py get_scheduler_status   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/scheduler.py trigger_manual_run   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/scheduler.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _shape_egress_scope_setting   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py _shape_pdf_storage_mode_setting   91% 11 1 0   83% 6 1   88%
src/local_deep_research/web/routers/settings.py _apply_env_override   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _filter_editable_settings   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py _resolve_model_discovery_policy   86% 21 3 0   62% 8 3   79%
src/local_deep_research/web/routers/settings.py _model_discovery_provider_allowed   83% 6 1 0   75% 4 1   80%
src/local_deep_research/web/routers/settings.py _get_setting_from_session   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py validate_setting   100% 21 0 0   100% 22 0   100%
src/local_deep_research/web/routers/settings.py coerce_setting_for_write   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py _container_embeds_sentinel   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web/routers/settings.py _container_all_leaves_are_sentinel   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web/routers/settings.py _container_matches_stored_shape   82% 11 2 0   80% 10 2   81%
src/local_deep_research/web/routers/settings.py _is_secret_empty_noop   86% 7 1 0   83% 6 1   85%
src/local_deep_research/web/routers/settings.py _redaction_sentinel_error   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _embeds_redaction_sentinel   100% 11 0 0   100% 10 0   100%
src/local_deep_research/web/routers/settings.py _embeds_sentinel_on_create   86% 7 1 0   83% 6 1   85%
src/local_deep_research/web/routers/settings.py _is_allowed_new_setting_key   100% 10 0 0   100% 10 0   100%
src/local_deep_research/web/routers/settings.py _new_key_rejection_reason   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py settings_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _save_all_settings_sync   96% 151 6 0   95% 92 5   95%
src/local_deep_research/web/routers/settings.py save_all_settings   83% 6 1 0   75% 4 1   80%
src/local_deep_research/web/routers/settings.py reset_to_defaults   93% 27 2 0   100% 10 0   95%
src/local_deep_research/web/routers/settings.py _save_settings_sync   96% 54 2 0   95% 22 1   96%
src/local_deep_research/web/routers/settings.py save_settings   95% 22 1 0   90% 10 1   94%
src/local_deep_research/web/routers/settings.py api_get_all_settings   100% 21 0 0   100% 6 0   100%
src/local_deep_research/web/routers/settings.py api_import_settings   100% 14 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py api_get_categories   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_get_types   50% 6 3 0   100% 0 0   50%
src/local_deep_research/web/routers/settings.py api_get_ui_elements   50% 6 3 0   100% 0 0   50%
src/local_deep_research/web/routers/settings.py api_get_available_models   88% 107 13 0   95% 44 2   90%
src/local_deep_research/web/routers/settings.py _log_available_models_duration   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _get_engine_icon_and_category   100% 27 0 0   100% 16 0   100%
src/local_deep_research/web/routers/settings.py _classify_options_for_egress   93% 28 2 9   100% 10 0   95%
src/local_deep_research/web/routers/settings.py api_get_available_search_engines   82% 49 9 3   71% 14 4   79%
src/local_deep_research/web/routers/settings.py api_get_search_favorites   100% 10 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py api_update_search_favorites   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py api_update_search_favorites._impl   100% 17 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py api_toggle_search_favorite   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py api_toggle_search_favorite._impl   100% 25 0 0   100% 10 0   100%
src/local_deep_research/web/routers/settings.py main_config_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py collections_config_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_keys_config_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py search_engines_config_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py llm_config_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py open_file_location   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py fix_corrupted_settings   100% 84 0 0   98% 64 1   99%
src/local_deep_research/web/routers/settings.py api_get_warnings   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_get_backup_status   77% 26 6 0   88% 8 1   79%
src/local_deep_research/web/routers/settings.py check_ollama_status   100% 10 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py api_get_rate_limiting_status   100% 11 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py api_reset_engine_rate_limiting   100% 8 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _cleanup_rate_limit_estimates_sync   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_cleanup_rate_limiting   100% 19 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py get_bulk_settings   100% 17 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py api_get_data_location   100% 18 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _is_blank_service_url   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _notification_test_body   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _caller_supplied_notification_url   0% 7 7 0   0% 4 0   0%
src/local_deep_research/web/routers/settings.py api_test_notification_url   100% 15 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py api_get_db_setting   100% 21 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py api_update_setting   75% 4 1 0   50% 2 1   67%
src/local_deep_research/web/routers/settings.py _api_update_setting_sync   97% 99 3 0   94% 54 3   96%
src/local_deep_research/web/routers/settings.py api_delete_setting   100% 22 0 0   100% 10 0   100%
src/local_deep_research/web/routers/settings.py (no function)   100% 143 0 0   100% 0 0   100%
src/local_deep_research/web/routers/unified_search.py _document_url   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/routers/unified_search.py _validated_query_and_limit   100% 13 0 0   100% 6 0   100%
src/local_deep_research/web/routers/unified_search.py unified_search_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/unified_search.py keyword_search   91% 22 2 0   100% 6 0   93%
src/local_deep_research/web/routers/unified_search.py semantic_search   98% 61 1 0   96% 26 1   98%
src/local_deep_research/web/routers/unified_search.py (no function)   100% 28 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py _zotero_error_status   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/routers/zotero.py _zotero_error_response   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py _db_password   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py _session_expired_response   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py zotero_page   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py get_config   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/zotero.py test_connection   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/zotero.py _not_configured_response   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py list_collections   83% 12 2 0   100% 4 0   88%
src/local_deep_research/web/routers/zotero.py list_groups   83% 12 2 0   100% 4 0   88%
src/local_deep_research/web/routers/zotero.py sync_now   100% 14 0 0   100% 6 0   100%
src/local_deep_research/web/routers/zotero.py sync_now._run   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/zotero.py get_status   75% 8 2 0   100% 2 0   80%
src/local_deep_research/web/routers/zotero.py (no function)   100% 32 0 0   100% 0 0   100%
src/local_deep_research/web/routes/_search_constants.py (no function)   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routes/globals.py (no function)   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routes/research_validation.py validate_research_query_length   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routes/research_validation.py validate_search_overrides   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routes/research_validation.py (no function)   100% 10 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 _ensure_weasyprint   73% 11 3 0   100% 2 0   77%
src/local_deep_research/web/services/pdf_service.py weasyprint_available   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/services/pdf_service.py _safe_url_fetcher   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/services/pdf_service.py get_weasyprint_install_instructions   50% 8 4 0   33% 6 2   43%
src/local_deep_research/web/services/pdf_service.py PDFService.__init__   100% 2 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% 6 0 0   100% 4 0   100%
src/local_deep_research/web/services/pdf_service.py (no function)   100% 25 0 0   100% 0 0   100%
src/local_deep_research/web/services/report_assembly_service.py assemble_full_report   100% 15 0 0   100% 10 0   100%
src/local_deep_research/web/services/report_assembly_service.py _build_metrics_markdown   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/services/report_assembly_service.py _build_sources_markdown   100% 14 0 0   100% 6 0   100%
src/local_deep_research/web/services/report_assembly_service.py _format_source_link   92% 12 1 0   88% 8 1   90%
src/local_deep_research/web/services/report_assembly_service.py _dedup_key   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/report_assembly_service.py get_research_source_links   100% 15 0 0   100% 8 0   100%
src/local_deep_research/web/services/report_assembly_service.py get_research_source_links_batch   100% 19 0 0   100% 10 0   100%
src/local_deep_research/web/services/report_assembly_service.py (no function)   100% 16 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py _SocketEmitter.emit_to_subscribers   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py clamp_user_max_concurrent   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py _chat_step_decision   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/services/research_service.py _compose_chat_step_content   100% 4 0 0   100% 2 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 _extract_synthesized_answer   100% 6 0 0   100% 6 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% 19 0 0   100% 4 0   100%
src/local_deep_research/web/services/research_service.py start_research_process._release_semaphore_on_exit   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py start_research_process._ctx_wrapped   100% 1 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 _save_chat_message_and_context   77% 26 6 0   75% 8 2   76%
src/local_deep_research/web/services/research_service.py _make_chat_stream_callback   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py _make_chat_stream_callback._flush_carry   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py _make_chat_stream_callback._hyperlink_chunk   72% 25 7 0   80% 10 2   74%
src/local_deep_research/web/services/research_service.py _make_chat_stream_callback.stream_callback   85% 20 3 0   80% 10 2   83%
src/local_deep_research/web/services/research_service.py _save_partial_chat_message_on_terminate   90% 21 2 0   100% 10 0   94%
src/local_deep_research/web/services/research_service.py run_research_process   87% 546 73 0   82% 188 25   86%
src/local_deep_research/web/services/research_service.py run_research_process.progress_callback   92% 95 8 0   87% 60 8   90%
src/local_deep_research/web/services/research_service.py run_research_process.check_termination   0% 6 6 0   0% 2 0   0%
src/local_deep_research/web/services/research_service.py run_research_process._resolve_sources   67% 3 1 0   50% 2 1   60%
src/local_deep_research/web/services/research_service.py run_research_process._maybe_save_chat_message   45% 11 6 0   100% 2 0   54%
src/local_deep_research/web/services/research_service.py cleanup_research_resources   100% 27 0 0   100% 8 0   100%
src/local_deep_research/web/services/research_service.py handle_termination   100% 13 0 0   100% 2 0   100%
src/local_deep_research/web/services/research_service.py cancel_research   86% 37 5 0   92% 12 1   88%
src/local_deep_research/web/services/research_service.py (no function)   100% 73 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_sources_service.py _as_text   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web/services/research_sources_service.py _json_text_safe   92% 12 1 0   88% 8 1   90%
src/local_deep_research/web/services/research_sources_service.py _coerce_year   57% 7 3 0   50% 2 1   56%
src/local_deep_research/web/services/research_sources_service.py _coerce_identifier   95% 20 1 0   92% 12 1   94%
src/local_deep_research/web/services/research_sources_service.py normalize_source_fields   100% 28 0 0   100% 26 0   100%
src/local_deep_research/web/services/research_sources_service.py select_source_url   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/services/research_sources_service.py ResearchSourcesService.save_research_sources   82% 84 15 0   81% 26 3   82%
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 _json_safe   87% 15 2 0   86% 14 2   86%
src/local_deep_research/web/services/research_sources_service.py _resolve_journal_id   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/services/research_sources_service.py _find_existing_paper   86% 21 3 0   92% 12 1   88%
src/local_deep_research/web/services/research_sources_service.py _merge_identifiers   67% 21 7 0   70% 20 6   68%
src/local_deep_research/web/services/research_sources_service.py (no function)   100% 37 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   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/services/settings_service.py reschedule_document_jobs_if_needed   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/services/settings_service.py reschedule_zotero_jobs_if_needed   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/services/settings_service.py validate_setting   100% 21 0 0   95% 22 1   98%
src/local_deep_research/web/services/settings_service.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _install_origin_rejection_logging   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _install_origin_rejection_logging._log_error_once   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py init_lock   100% 2 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py _logging_is_enabled   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py set_main_loop   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _get_main_loop   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py _schedule_coroutine_threadsafe   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _decode_session_cookie   100% 21 0 0   100% 4 0   100%
src/local_deep_research/web/services/socketio_asgi.py connect   100% 39 0 0   100% 12 0   100%
src/local_deep_research/web/services/socketio_asgi.py disconnect   100% 19 0 0   100% 6 0   100%
src/local_deep_research/web/services/socketio_asgi.py _owns_research_sync   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/services/socketio_asgi.py _subscription_key   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py _user_owns_research   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _socket_session_still_valid   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py on_subscribe   100% 42 0 0   85% 20 3   95%
src/local_deep_research/web/services/socketio_asgi.py on_unsubscribe   100% 29 0 0   94% 16 1   98%
src/local_deep_research/web/services/socketio_asgi.py emit_socket_event   100% 12 0 0   67% 6 2   89%
src/local_deep_research/web/services/socketio_asgi.py emit_to_user   100% 13 0 0   67% 6 2   89%
src/local_deep_research/web/services/socketio_asgi.py emit_to_user._emit   100% 8 0 0   75% 4 1   92%
src/local_deep_research/web/services/socketio_asgi.py disconnect_user   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py disconnect_session   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _disconnect_matching   100% 13 0 0   67% 6 2   89%
src/local_deep_research/web/services/socketio_asgi.py _disconnect_matching._disconnect   100% 10 0 0   67% 6 2   88%
src/local_deep_research/web/services/socketio_asgi.py emit_to_subscribers   100% 18 0 0   100% 8 0   100%
src/local_deep_research/web/services/socketio_asgi.py _async_emit   100% 7 0 0   75% 4 1   91%
src/local_deep_research/web/services/socketio_asgi.py _async_emit_to_subscribers   100% 21 0 0   92% 12 1   97%
src/local_deep_research/web/services/socketio_asgi.py remove_subscriptions_for_research   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py _async_remove_subscriptions   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py (no function)   100% 62 0 0   100% 12 0   100%
src/local_deep_research/web/template_config.py _LDRTemplates.TemplateResponse   100% 54 0 0   77% 22 5   93%
src/local_deep_research/web/template_config.py (no function)   82% 17 3 0   100% 0 0   82%
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/request_timing.py _should_arm_freeze_dump   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/utils/request_timing.py _arm_freeze_dump   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/utils/request_timing.py RequestTimingMiddleware.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/utils/request_timing.py RequestTimingMiddleware.__call__   100% 15 0 0   100% 4 0   100%
src/local_deep_research/web/utils/request_timing.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.__init__   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.init_app   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._load_manifest   100% 7 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% 15 0 0   100% 10 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._fallback_assets   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._refresh_manifest_if_missing   100% 12 0 0   100% 8 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.assets_are_missing   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.missing_assets_banner   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.init_for_fastapi   100% 15 0 0   100% 4 0   100%
src/local_deep_research/web/utils/vite_helper.py (no function)   100% 20 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   89% 133 15 0   87% 54 7   88%
src/local_deep_research/web/warning_checks/__init__.py (no function)   100% 12 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/engine_groups.py is_collection_engine   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_groups.py classify_engine_group   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engine_groups.py effective_group   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_groups.py group_order   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_groups.py group_label   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_groups.py group_icon   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_groups.py (no function)   100% 14 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/_google_pse_rate_limiter.py _scope_key   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_google_pse_rate_limiter.py _get_scope_lock   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/_google_pse_rate_limiter.py respect_rate_limit   100% 11 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/_google_pse_rate_limiter.py reset_for_tests   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_google_pse_rate_limiter.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _normalize_url   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _evict_stale_locks_unlocked   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _get_url_state   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py respect_rate_limit   100% 14 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py reset_for_tests   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py (no function)   100% 17 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% 10 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.check_urls   95% 21 1 0   100% 6 0   96%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.run   98% 40 1 0   96% 24 1   97%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._get_full_content   100% 35 0 0   100% 20 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% 20 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/local_embedding_manager.py LocalEmbeddingManager.__init__   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/local_embedding_manager.py LocalEmbeddingManager.close   100% 8 0 0   100% 4 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% 14 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/local_embedding_manager.py LocalEmbeddingManager._delete_chunks_from_db   100% 18 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/local_embedding_manager.py (no function)   100% 17 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._validated_arxiv_id   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._enforce_response_size_cap   100% 2 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._download_pdf_safely   100% 13 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._stream_response_to_file   82% 17 3 0   83% 6 1   83%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._get_previews   100% 16 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._get_full_content   94% 71 4 0   94% 18 1   94%
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% 28 0 0   100% 4 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% 39 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_brave.py BraveSearchEngine.__init__   100% 13 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_brave.py BraveSearchEngine._get_previews   96% 25 1 0   100% 4 0   97%
src/local_deep_research/web_search_engines/engines/search_engine_brave.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_collection.py CollectionSearchEngine.__init__   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_collection.py CollectionSearchEngine._load_collection_embedding_settings   100% 33 0 0   90% 20 2   96%
src/local_deep_research/web_search_engines/engines/search_engine_collection.py CollectionSearchEngine.search   100% 54 0 0   100% 12 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_collection.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_ddg.py DuckDuckGoSearchEngine.__init__   100% 7 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% 14 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine._cloud_id_forbidden_by_scope   73% 11 3 0   100% 0 0   73%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine.clear_availability_cache   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine._get_cached_availability   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine.is_available   92% 25 2 0   100% 6 0   94%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine._probe_hosts_available   86% 43 6 0   75% 16 4   83%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine.__init__   100% 28 0 0   100% 8 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% 27 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine._get_full_content   100% 22 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine.search_by_query_string   100% 9 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py ElasticsearchSearchEngine.search_by_dsl   100% 8 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% 37 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   100% 56 0 0   96% 26 1   99%
src/local_deep_research/web_search_engines/engines/search_engine_exa.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine.__init__   100% 15 0 0   100% 4 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% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine._search_github   100% 37 0 0   92% 12 1   98%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine._get_readme_content   100% 17 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine._get_recent_issues   100% 13 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine._get_file_content   100% 17 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   95% 38 2 0   91% 22 2   93%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine._get_full_content   100% 37 0 0   100% 22 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine.search_repository   100% 23 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine.search_code   100% 14 0 0   100% 4 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._valid_unique_indices   100% 9 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine._filter_for_relevance   100% 19 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py (no function)   100% 40 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py GooglePSESearchEngine.__init__   80% 30 6 0   100% 8 0   84%
src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py GooglePSESearchEngine._validate_connection   100% 11 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py GooglePSESearchEngine._respect_rate_limit   88% 8 1 0   75% 4 1   83%
src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py GooglePSESearchEngine._make_request   97% 38 1 0   90% 10 1   96%
src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py GooglePSESearchEngine._get_previews   100% 28 0 0   92% 12 1   98%
src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py (no function)   100% 20 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% 25 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% 26 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   87% 45 6 0   77% 22 3   84%
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% 22 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   92% 52 4 0   93% 14 1   92%
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% 12 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% 27 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_library.py LibraryRAGSearchEngine.__init__   97% 31 1 0   75% 8 2   92%
src/local_deep_research/web_search_engines/engines/search_engine_library.py LibraryRAGSearchEngine.search   100% 82 0 0   100% 24 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_library.py LibraryRAGSearchEngine._raise_collections_failed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_library.py LibraryRAGSearchEngine._get_previews   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_library.py LibraryRAGSearchEngine._get_full_content   97% 38 1 0   88% 16 2   94%
src/local_deep_research/web_search_engines/engines/search_engine_library.py LibraryRAGSearchEngine._get_document_url   100% 25 0 0   92% 12 1   97%
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% 28 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% 38 1 0   94% 16 1   96%
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   62% 8 3 0   100% 2 0   70%
src/local_deep_research/web_search_engines/engines/search_engine_mojeek.py (no function)   100% 18 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% 55 5 0   86% 22 3   90%
src/local_deep_research/web_search_engines/engines/search_engine_nasa_ads.py NasaAdsSearchEngine._format_doc_preview   90% 49 5 0   83% 24 4   88%
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% 18 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine.__init__   100% 21 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._get_previews   100% 58 0 0   100% 24 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._format_work_preview   97% 67 2 0   84% 32 5   93%
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% 19 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   84% 68 11 0   71% 24 7   80%
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   92% 12 1 0   100% 0 0   92%
src/local_deep_research/web_search_engines/engines/search_engine_openlibrary.py OpenLibrarySearchEngine.get_author   87% 15 2 0   50% 2 1   82%
src/local_deep_research/web_search_engines/engines/search_engine_openlibrary.py (no function)   100% 26 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% 23 0 0   88% 8 1   97%
src/local_deep_research/web_search_engines/engines/search_engine_paperless.py PaperlessSearchEngine._expand_query_with_llm   89% 19 2 0   75% 4 1   87%
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   94% 16 1 0   83% 6 1   91%
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   100% 32 0 0   92% 12 1   98%
src/local_deep_research/web_search_engines/engines/search_engine_paperless.py PaperlessSearchEngine.run   84% 19 3 0   62% 8 1   78%
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% 7 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% 30 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% 15 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py PubChemSearchEngine._get_compound_by_name   95% 22 1 0   100% 4 0   96%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py PubChemSearchEngine._get_compound_properties   100% 16 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py PubChemSearchEngine._get_compound_description   100% 20 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py PubChemSearchEngine._get_compound_synonyms   100% 20 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py PubChemSearchEngine._get_previews   98% 61 1 0   93% 28 2   97%
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% 11 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py PubChemSearchEngine.search_by_formula   100% 21 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubchem.py (no function)   100% 27 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine.__init__   97% 32 1 0   50% 2 1   94%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_result_count   100% 15 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% 50 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% 19 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% 28 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_article_summaries   98% 41 1 0   83% 18 3   93%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_article_abstracts   96% 51 2 0   85% 26 4   92%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_article_detailed_metadata   99% 68 1 0   83% 46 8   92%
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   96% 26 1 0   79% 14 3   90%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_pmc_full_text   100% 36 0 0   75% 20 5   91%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_previews   96% 84 3 0   78% 54 12   89%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_full_content   95% 84 4 0   78% 60 13   88%
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% 37 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% 12 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% 12 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% 15 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% 11 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_scaleserp.py ScaleSerpSearchEngine._get_previews   100% 47 0 0   100% 16 0   100%
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% 16 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py SearXNGSearchEngine._normalize_list   100% 16 0 0   100% 12 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._private_url_blocked_by_gate   71% 7 2 0   100% 2 0   78%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py SearXNGSearchEngine.__init__   100% 44 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py SearXNGSearchEngine._respect_rate_limit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py SearXNGSearchEngine._get_search_results   96% 83 3 0   91% 32 3   95%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py SearXNGSearchEngine._parse_json_results   92% 26 2 0   83% 12 2   89%
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   91% 11 1 0   75% 4 1   87%
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% 7 0 0   100% 4 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   67% 12 4 0   100% 2 0   71%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py (no function)   100% 37 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine.__init__   97% 32 1 0   83% 6 1   95%
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% 8 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% 18 1 0   88% 8 1   92%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._optimize_query   100% 18 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._direct_search   100% 23 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._adaptive_search   100% 49 0 0   92% 26 2   97%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._get_paper_details   100% 17 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._get_previews   100% 37 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   97% 30 1 0   83% 24 4   91%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py (no function)   100% 32 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py SerpAPISearchEngine.__init__   100% 12 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py SerpAPISearchEngine._get_previews   100% 17 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py (no function)   100% 13 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serper.py SerperSearchEngine.__init__   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serper.py SerperSearchEngine._get_previews   100% 44 0 0   100% 14 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% 20 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_sofya.py SofyaSearchEngine.__init__   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_sofya.py SofyaSearchEngine._build_payload   100% 9 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_sofya.py SofyaSearchEngine._get_previews   100% 31 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_sofya.py SofyaSearchEngine._get_full_content   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_sofya.py (no function)   100% 21 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   92% 66 5 0   86% 14 2   91%
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% 16 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_stackexchange.py StackExchangeSearchEngine.get_answers   100% 15 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% 34 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tavily.py TavilySearchEngine.__init__   100% 13 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% 35 0 0   100% 8 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% 16 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine.__init__   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine._normalize_location   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine._normalize_language   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine._headers   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine._raise_request_exception_if_rate_limited   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine._get_previews   82% 33 6 0   100% 4 0   84%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py TinyFishSearchEngine._get_full_content   78% 40 9 0   65% 20 7   73%
src/local_deep_research/web_search_engines/engines/search_engine_tinyfish.py (no function)   100% 28 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% 30 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% 30 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% 8 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine._get_wayback_content   100% 10 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine._get_full_content   100% 20 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine.search_by_url   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine.search_by_date_range   100% 17 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine.get_latest_snapshot   100% 17 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py (no function)   100% 24 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% 20 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% 35 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% 53 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py WikipediaSearchEngine._get_full_content   100% 28 0 0   100% 4 0   100%
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   100% 17 0 0   100% 4 0   100%
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% 21 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   94% 64 4 0   83% 18 3   91%
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% 12 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% 28 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/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% 4 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% 8 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   60% 5 2 0   100% 0 0   60%
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% 14 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   90% 82 8 0   89% 36 4   90%
src/local_deep_research/web_search_engines/relevance_filter.py _invoke_text   86% 22 3 0   67% 6 2   82%
src/local_deep_research/web_search_engines/relevance_filter.py (no function)   100% 19 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry._ns   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.register   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.register_multiple   100% 18 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.get   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.unregister   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.clear   100% 10 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.is_registered   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.list_registered   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py RetrieverRegistry.get_metadata   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/retriever_registry.py (no function)   100% 18 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py _is_api_key_placeholder   100% 10 0 0   100% 8 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   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine.is_available   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine.__init__   100% 20 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._create_journal_filter   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._configure_programmatic_mode   100% 5 0 0   100% 2 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._verify_egress_scope   100% 19 0 0   88% 8 1   96%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._egress_policy_key   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._check_egress_policy   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine.run   88% 43 5 0   100% 12 0   91%
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   96% 47 2 0   100% 16 0   97%
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% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._extract_display_link   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._clean_result_url   100% 3 0 0   100% 2 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._build_full_search_egress_context   50% 16 8 0   100% 2 0   56%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._init_full_search   100% 8 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% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._scrub_error   100% 1 0 0   100% 0 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   78% 9 2 0   80% 10 2   79%
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% 87 0 2   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_factory.py create_search_engine   90% 146 14 0   86% 80 9   89%
src/local_deep_research/web_search_engines/search_engine_factory.py _create_full_search_wrapper   100% 46 0 0   87% 30 4   95%
src/local_deep_research/web_search_engines/search_engine_factory.py get_search   84% 51 8 0   89% 28 3   86%
src/local_deep_research/web_search_engines/search_engine_factory.py (no function)   100% 13 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% 41 0 0   100% 16 0   100%
src/local_deep_research/web_search_engines/search_engines_config.py list_eligible_engine_configs   88% 48 6 0   91% 34 3   89%
src/local_deep_research/web_search_engines/search_engines_config.py _engine_class_is_available   61% 18 7 0   75% 4 1   64%
src/local_deep_research/web_search_engines/search_engines_config.py get_available_engines   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engines_config.py _resolve_api_key   92% 13 1 0   88% 8 1   90%
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% 15 0 0   100% 0 0   100%
Total     94% 59323 3673 70   90% 18508 1455   93%

No items found using the specified filter.