Coverage report: 95%

Files Functions Classes

coverage.py v7.16.2, created at 2026-10-22 21:20 +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% 24 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% 31 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% 17 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% 12 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% 13 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__   90% 21 2 0   100% 4 0   92%
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% 11 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% 9 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   100% 6 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py _format_affiliations   100% 15 0 0   92% 12 1   96%
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   85% 13 2 0   100% 2 0   87%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.create_default   100% 17 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   100% 11 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__analyze_journal_reputation   96% 27 1 0   92% 12 1   95%
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   88% 42 5 0   75% 4 1   87%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.__score_journal   100% 89 0 0   83% 46 8   94%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.filter_results   100% 77 0 0   100% 32 0   100%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py JournalReputationFilter.filter_results._handle_no_venue   100% 12 0 0   83% 6 1   94%
src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py (no function)   100% 54 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% 17 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 source_entries   100% 3 0 0   100% 2 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% 12 0 0   100% 10 0   100%
src/local_deep_research/advanced_search_system/knowledge/followup_context_manager.py FollowUpContextHandler._extract_findings.text   100% 2 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/knowledge/followup_context_manager.py FollowUpContextHandler._extract_sources   100% 11 0 0   100% 8 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% 19 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% 9 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% 15 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% 10 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% 6 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% 9 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% 12 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/archive.py _enforce_archive_engine   100% 4 0 0   100% 4 0   100%
src/local_deep_research/advanced_search_system/tools/archive.py build_archive_fetch_tool   100% 22 0 0   100% 14 0   100%
src/local_deep_research/advanced_search_system/tools/archive.py build_archive_fetch_tool.fetch   98% 46 1 0   95% 20 1   97%
src/local_deep_research/advanced_search_system/tools/archive.py build_archive_fetch_tool.fetch.capture_guard   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/archive.py build_archive_fetch_tool.fetch_archive   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/archive.py build_archive_fetch_tool.fetch_archive_summary   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/archive.py (no function)   100% 11 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 _read_max_fetches_setting   100% 27 0 0   100% 10 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _read_content_max_length_setting   92% 25 2 0   100% 8 0   94%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _read_summary_input_max_length_setting   100% 7 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _built_model_provider   85% 13 2 0   75% 8 2   81%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _summary_invocation_budget   83% 35 6 0   100% 10 0   87%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _warn_collector_lacks_fetch_recording   100% 3 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _check_and_record_fetch   83% 12 2 0   83% 6 1   83%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _register_in_collector   100% 20 0 0   90% 10 1   97%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _format_fetch_message   100% 7 0 0   100% 4 0   100%
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 _is_fetch_cache_hit_allowed   91% 11 1 6   50% 2 1   85%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _is_fetch_cache_hit_allowed._compute   100% 4 0 5   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _try_resolve_url   100% 29 0 0   100% 22 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _complete_archive_metadata   94% 16 1 0   90% 10 1   92%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _archive_fetch_context   97% 33 1 0   92% 24 2   95%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _archive_fetch_context.capture_guard   100% 3 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _archive_failure_message   89% 9 1 0   83% 6 1   87%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _fetch_raw_content   97% 62 2 4   100% 40 0   98%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_full_fetch_tool   100% 8 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_full_fetch_tool.fetch_content   96% 28 1 0   90% 10 1   95%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_summary_fetch_tool   100% 10 0 0   100% 2 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/__init__.py _make_summary_fetch_tool.fetch_content   100% 56 0 0   100% 20 0   100%
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% 47 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   95% 57 3 4   96% 24 1   95%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py make_library_resolver   100% 4 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/fetch/library_resolver.py make_library_resolver._resolve   100% 3 0 0   100% 2 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/advanced_search_system/tools/search_availability.py wait_for_cooldown   100% 19 0 0   100% 10 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py note_metrics_name   100% 2 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py _record_skipped_search   100% 5 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py run_search   92% 37 3 0   88% 16 2   91%
src/local_deep_research/advanced_search_system/tools/search_availability.py SearchAvailabilityMiddleware.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py SearchAvailabilityMiddleware._filter_request   100% 25 0 0   100% 12 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py SearchAvailabilityMiddleware.wrap_model_call   100% 1 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py SearchAvailabilityMiddleware.awrap_model_call   100% 2 0 0   100% 0 0   100%
src/local_deep_research/advanced_search_system/tools/search_availability.py (no function)   100% 19 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   85% 34 5 0   95% 20 1   89%
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% 25 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   67% 3 1 0   50% 2 1   60%
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._read_setting_value   100% 4 0 0   100% 2 0   100%
src/local_deep_research/api/settings_utils.py InMemorySettingsManager.get_setting   100% 20 0 0   100% 16 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% 8 0 0   100% 6 0   100%
src/local_deep_research/api/settings_utils.py InMemorySettingsManager.load_from_defaults_file   100% 6 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% 26 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% 27 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 _select_grader_template   100% 1 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py _build_grading_prompt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py _call_grader_llm   100% 5 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/graders.py _acall_grader_llm   80% 5 1 0   50% 2 1   71%
src/local_deep_research/benchmarks/graders.py _parse_grading_response   100% 17 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/graders.py _grading_error_result   100% 1 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py grade_single_result   100% 12 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py grade_single_result_async   75% 12 3 0   100% 0 0   75%
src/local_deep_research/benchmarks/graders.py _start_single_grading   100% 6 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py _log_grading_call_done   100% 2 0 0   100% 0 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_async   100% 5 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py _load_results_for_grading   100% 9 0 0   83% 6 1   93%
src/local_deep_research/benchmarks/graders.py _append_graded_line   100% 2 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py _start_batch_item   100% 5 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/graders.py _finish_batch_item   100% 9 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/graders.py _fail_batch_item   100% 6 0 0   100% 2 0   100%
src/local_deep_research/benchmarks/graders.py _log_grading_summary   100% 3 0 0   100% 0 0   100%
src/local_deep_research/benchmarks/graders.py _grade_results_inner   100% 16 0 0   100% 4 0   100%
src/local_deep_research/benchmarks/graders.py _grade_results_inner_async   81% 16 3 0   75% 4 1   80%
src/local_deep_research/benchmarks/graders.py human_evaluation   60% 48 19 0   61% 18 5   61%
src/local_deep_research/benchmarks/graders.py (no function)   100% 35 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% 34 0 0   100% 6 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% 48 1 0   88% 8 1   96%
src/local_deep_research/benchmarks/web_api/benchmark_service.py BenchmarkService._run_benchmark_thread   93% 85 6 0   77% 26 6   89%
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   97% 60 2 0   100% 8 0   97%
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   84% 19 3 0   83% 6 1   84%
src/local_deep_research/benchmarks/web_api/benchmark_service.py (no function)   100% 62 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% 10 0 0   100% 6 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 _timestamp_order_key   100% 2 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% 26 1 0   83% 6 1   94%
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   92% 50 4 0   94% 18 1   93%
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   100% 21 0 0   100% 8 0   100%
src/local_deep_research/chat/service.py ChatService.delete_attempt   100% 3 0 0   100% 0 0   100%
src/local_deep_research/chat/service.py ChatService.purge_attempt_rag   71% 7 2 0   100% 2 0   78%
src/local_deep_research/chat/service.py ChatService.delete_attempt_rows   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   90% 31 3 0   100% 12 0   93%
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% 31 0 0   100% 10 0   100%
src/local_deep_research/chat/service.py (no function)   100% 51 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 _HeadingRepetitionGuard.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py _HeadingRepetitionGuard.feed   100% 8 0 0   100% 6 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py _HeadingRepetitionGuard._count   95% 20 1 0   92% 12 1   94%
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._new_repetition_guard   100% 1 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._handle_chunk   91% 11 1 0   83% 6 1   88%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._log_repetition_abort   100% 1 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._join_chunks   100% 1 0 0   100% 0 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._partial_after_stream_failure   100% 5 0 0   100% 2 0   100%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._invoke_with_streaming   92% 24 2 0   100% 10 0   94%
src/local_deep_research/citation_handlers/base_citation_handler.py BaseCitationHandler._invoke_with_streaming_async   100% 17 0 0   100% 8 0   100%
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._invoke_text_async   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% 13 0 0   90% 10 1   96%
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% 34 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 _identity_text   100% 5 0 0   100% 4 0   100%
src/local_deep_research/citation_handlers/standard_citation_handler.py StandardCitationHandler._format_sources   100% 12 0 0   100% 4 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% 10 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   98% 46 1   98%
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 _merge_callbacks   90% 10 1 0   83% 6 1   88%
src/local_deep_research/config/llm_config.py _config_receiver   100% 5 0 0   100% 2 0   100%
src/local_deep_research/config/llm_config.py _starts_the_model_run   100% 3 0 0   100% 2 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.__init__   100% 8 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._with_research_callbacks   100% 12 0 0   100% 6 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._effective_research_id   100% 2 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._check_terminated   100% 4 0 0   100% 2 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._walk_base_chain   78% 9 2 0   100% 2 0   82%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._underlying_stream_usage   58% 12 5 0   62% 8 1   60%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._underlying_disables_streaming   71% 7 2 0   100% 4 0   82%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._stream_cancel_allowed   68% 34 11 0   72% 18 1   69%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._is_structured_chunk   38% 13 8 0   50% 8 2   43%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._combine_stream_chunks   31% 49 34 0   32% 28 5   31%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._invoke_via_stream   74% 46 12 0   65% 20 7   71%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._ainvoke_via_stream   67% 49 16 0   55% 22 8   63%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.invoke   100% 14 0 0   100% 4 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.ainvoke   100% 14 0 0   100% 4 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.stream   100% 20 0 0   88% 8 1   96%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.astream   100% 20 0 0   88% 8 1   96%
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.batch   56% 16 7 0   40% 10 2   50%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.abatch   50% 16 8 0   30% 10 3   42%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.close   100% 7 0 0   100% 2 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 ProcessingLLMWrapper.bind   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.with_config   100% 1 0 0   100% 0 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper._rewrap   100% 3 0 0   100% 2 0   100%
src/local_deep_research/config/llm_config.py ProcessingLLMWrapper.with_structured_output   71% 7 2 0   100% 0 0   71%
src/local_deep_research/config/llm_config.py wrap_llm_without_think_tags   93% 30 2 0   100% 18 0   96%
src/local_deep_research/config/llm_config.py (no function)   100% 59 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 get_custom_data_directory   100% 3 0 0   100% 2 0   100%
src/local_deep_research/config/paths.py _ensure_dir   100% 7 0 0   100% 4 0   100%
src/local_deep_research/config/paths.py DirectoryNotPrivateError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/config/paths.py restrict_directory_to_owner   92% 13 1 0   88% 8 1   90%
src/local_deep_research/config/paths.py describe_private_directory_refusal   100% 7 0 0   100% 4 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 restrict_research_outputs_directory   100% 7 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_sentence_transformers_home   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% 31 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% 8 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% 7 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher._resolve_cache   100% 6 0 4   100% 2 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher._get_downloader   94% 54 3 0   100% 22 0   96%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher._apply_egress_policy_to_downloader   95% 19 1 3   93% 14 1   94%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.fetch   86% 50 7 0   86% 28 4   86%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.fetch._ssrf_ok   100% 11 0 6   100% 2 0   100%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher.fetch._download_once   100% 36 0 0   94% 18 1   98%
src/local_deep_research/content_fetcher/fetcher.py ContentFetcher._download_content   100% 7 0 0   100% 4 0   100%
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% 23 0 0   100% 0 0   100%
src/local_deep_research/content_fetcher/url_classifier.py URLClassifier.classify   89% 19 2 0   100% 14 0   94%
src/local_deep_research/content_fetcher/url_classifier.py URLClassifier._host_and_path   100% 7 0 0   100% 2 0   100%
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% 21 0 0   90% 20 2   95%
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% 35 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% 8 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 _add_settings_env_var_before_0004   100% 9 0 0   100% 6 0   100%
src/local_deep_research/database/alembic_runner.py run_migrations   98% 59 1 0   95% 22 1   98%
src/local_deep_research/database/alembic_runner.py (no function)   100% 24 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 _best_effort_chmod   100% 6 0 0   100% 0 0   100%
src/local_deep_research/database/auth_db.py _create_private_file   88% 8 1 0   50% 2 1   80%
src/local_deep_research/database/auth_db.py _get_auth_engine   87% 23 3 0   88% 8 1   87%
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   94% 17 1 0   75% 4 1   90%
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% 27 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   90% 10 1 0   50% 2 1   83%
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 _validate_backup_path   100% 7 0 0   100% 4 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 _get_backup_verifications   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py _file_identity   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py _backup_identity   82% 11 2 0   100% 0 0   82%
src/local_deep_research/database/backup/backup_service.py _is_published_pair   88% 8 1 0   83% 6 1   86%
src/local_deep_research/database/backup/backup_service.py is_safe_glob_result   100% 7 0 0   100% 2 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% 17 0 0   100% 6 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._create_backup_impl   94% 83 5 0   95% 20 1   94%
src/local_deep_research/database/backup/backup_service.py BackupService._verify_and_identify   100% 8 0 0   100% 4 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._find_verified_backup   96% 26 1 0   94% 18 1   95%
src/local_deep_research/database/backup/backup_service.py BackupService._find_verified_backup.modified_ns   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._copy_source_salt   92% 12 1 0   75% 4 1   88%
src/local_deep_research/database/backup/backup_service.py BackupService._remove_backup_files   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._verify_backup   100% 33 0 0   90% 10 1   98%
src/local_deep_research/database/backup/backup_service.py BackupService._age_cutoff   100% 8 0 0   100% 2 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._count_limit   85% 13 2 0   100% 4 0   88%
src/local_deep_research/database/backup/backup_service.py BackupService._cleanup_old_backups   84% 57 9 0   97% 30 1   89%
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._quarantined_backup_paths   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService._managed_backup_paths   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/backup/backup_service.py BackupService.purge_and_refresh   86% 14 2 0   100% 4 0   89%
src/local_deep_research/database/backup/backup_service.py BackupService._open_backup_with_current_key   75% 12 3 0   100% 0 0   75%
src/local_deep_research/database/backup/backup_service.py BackupService._classify_backup_key   72% 46 13 0   79% 14 3   73%
src/local_deep_research/database/backup/backup_service.py BackupService._backup_salt_matches_live_database   78% 9 2 0   100% 2 0   82%
src/local_deep_research/database/backup/backup_service.py BackupService._move_damaged_backup_aside   80% 15 3 0   50% 4 2   74%
src/local_deep_research/database/backup/backup_service.py BackupService.purge_backups_under_superseded_key   88% 26 3 0   92% 12 1   89%
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% 58 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 _seconds_until   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py _SidecarWaitBudget.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py sidecar_wait_budget   100% 6 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py _sidecar_wait_seconds   100% 4 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py _record_sidecar_wait   100% 3 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py _bounded_rekey_lock   100% 10 0 0   50% 2 1   92%
src/local_deep_research/database/encrypted_db.py _gated_checkpoint_busy_timeout_ms   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py _gated_checkpoint_busy_timeout_pragma   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py _RekeyVerificationError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py _raise_rekey_unavailable   100% 1 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 _create_private_file   100% 11 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py _assert_reserved_file   100% 6 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py _db_path_is_symlinked   100% 8 0 0   100% 2 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 _read_backup_retention   83% 18 3 0   100% 6 0   88%
src/local_deep_research/database/encrypted_db.py DatabaseManager.__init__   100% 13 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.probe_user_connection   100% 8 0 0   100% 2 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% 23 0 0   100% 4 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.create_user_database   100% 8 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._initialize_new_user_database   100% 30 0 0   75% 4 1   97%
src/local_deep_research/database/encrypted_db.py DatabaseManager._create_user_database_files   100% 62 0 0   100% 12 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._create_user_database_files.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._make_connection_cache_entry   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._cache_connection   100% 6 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._record_password_verifier   100% 7 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._connection_epoch_matches   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._detach_connection_locked   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._detach_connection   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._snapshot_connection_generation   100% 5 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._connection_generation_matches_locked   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._detach_connection_generation   80% 5 1 0   50% 2 1   71%
src/local_deep_research/database/encrypted_db.py DatabaseManager._claim_connection_generation   100% 9 0 0   100% 6 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._acquire_current_connection_generation   88% 68 8 0   82% 28 3   86%
src/local_deep_research/database/encrypted_db.py DatabaseManager._verifier_entry_matches   100% 11 0 0   100% 4 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._verifier_matches   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._connection_generation_password_matches   100% 3 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._cached_engine_trusted   100% 5 0 0   100% 4 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._get_password_change_lock   100% 10 0 0   100% 4 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._get_rekey_lock   80% 10 2 0   75% 4 1   79%
src/local_deep_research/database/encrypted_db.py DatabaseManager.open_user_database   92% 66 5 0   84% 32 5   90%
src/local_deep_research/database/encrypted_db.py DatabaseManager._purge_superseded_key_backups   100% 15 0 0   100% 6 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._bounded_init_lock   100% 6 0 0   100% 2 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   88% 60 7 0   89% 18 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% 6 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   92% 12 1 0   50% 2 1   86%
src/local_deep_research/database/encrypted_db.py DatabaseManager._require_full_synchronous   100% 4 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._pre_rekey_checkpoint   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._best_effort_rekey_checkpoint   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._warn_rekey_integrity   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._verify_rekey_candidate   69% 26 8 0   88% 8 1   74%
src/local_deep_research/database/encrypted_db.py DatabaseManager._classify_rekey_failure   71% 7 2 0   100% 2 0   78%
src/local_deep_research/database/encrypted_db.py DatabaseManager._clear_committed_rekey_pending   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._close_rekey_connection   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._recover_pending_rekey   94% 18 1 0   67% 6 2   88%
src/local_deep_research/database/encrypted_db.py DatabaseManager._resolve_unapplied_rekey   67% 9 3 0   50% 2 1   64%
src/local_deep_research/database/encrypted_db.py DatabaseManager._dispose_detached_connection   100% 10 0 0   100% 4 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._dispose_connection_generation   90% 10 1 0   50% 2 1   83%
src/local_deep_research/database/encrypted_db.py DatabaseManager._dispose_connection_generation_under_sidecar_lock   84% 19 3 0   75% 8 2   81%
src/local_deep_research/database/encrypted_db.py DatabaseManager.close_user_database   100% 4 0 0   100% 4 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.close_all_databases   90% 10 1 0   83% 6 1   88%
src/local_deep_research/database/encrypted_db.py DatabaseManager.reset_connection_pools   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._reset_connection_generation   100% 10 0 0   100% 2 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager._wal_fully_checkpointed   67% 9 3 0   100% 2 0   73%
src/local_deep_research/database/encrypted_db.py DatabaseManager.check_database_integrity   100% 22 0 0   100% 8 0   100%
src/local_deep_research/database/encrypted_db.py DatabaseManager.change_password   96% 101 4 0   91% 32 1   95%
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% 14 0 0   100% 8 0   100%
src/local_deep_research/database/encrypted_db.py (no function)   100% 159 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% 16 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% 10 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% 17 0 0   100% 2 0   100%
src/local_deep_research/database/library_init.py ensure_research_history_collection   100% 17 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% 57 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% 298 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__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/metrics.py ModelUsage.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/metrics.py ResearchRating.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/metrics.py SearchCall.__repr__   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/models/metrics.py (no function)   100% 92 0 0   100% 0 0   100%
src/local_deep_research/database/models/news.py 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 LenientJSON.coerce_compared_value   67% 3 1 0   50% 2 1   60%
src/local_deep_research/database/models/research.py LenientJSON.result_processor   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/models/research.py LenientJSON.result_processor.process   100% 7 0 0   100% 2 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% 137 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/rekey_epoch.py read_authorization_epoch   100% 5 0 0   100% 2 0   100%
src/local_deep_research/database/rekey_epoch.py read_user_authorization_epoch   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_epoch.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py RekeySidecarIOError.__init__   100% 6 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py RekeyUnavailableError.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py RekeyIndeterminateError.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py RekeyLockContentionError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py DatabaseKeyCheckUnavailableError.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py RekeyRecoveryRequiredError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py RekeyEpochUnreadableError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _get_sidecar_gate   100% 6 0 0   100% 2 0   100%
src/local_deep_research/database/rekey_lock.py _acquire_posix_lock   89% 18 2 0   88% 8 1   88%
src/local_deep_research/database/rekey_lock.py _release_posix_lock   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _acquire_windows_lock   90% 20 2 0   88% 8 1   89%
src/local_deep_research/database/rekey_lock.py _release_windows_lock   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _authorization_lock_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _sidecar_io_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _open_sidecar   93% 27 2 0   100% 6 0   94%
src/local_deep_research/database/rekey_lock.py _is_database_file   85% 26 4 0   100% 12 0   89%
src/local_deep_research/database/rekey_lock.py _refuse_foreign_sidecar   64% 11 4 0   67% 6 2   65%
src/local_deep_research/database/rekey_lock.py _close_refused_sidecar   50% 4 2 0   100% 0 0   50%
src/local_deep_research/database/rekey_lock.py _acquire_sidecar_lock   100% 16 0 0   100% 10 0   100%
src/local_deep_research/database/rekey_lock.py _acquire_os_lock_with_retry   92% 13 1 0   83% 6 1   89%
src/local_deep_research/database/rekey_lock.py _acquire_sidecar_lock_locked   94% 36 2 0   79% 14 3   90%
src/local_deep_research/database/rekey_lock.py acquire_rekey_lock   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py acquire_authorization_lease   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _epoch_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _pending_epoch_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/rekey_lock.py _read_epoch_file   100% 7 0 0   75% 4 1   91%
src/local_deep_research/database/rekey_lock.py _close_epoch_file   50% 4 2 0   100% 0 0   50%
src/local_deep_research/database/rekey_lock.py _read_epoch_token   83% 30 5 0   83% 6 1   83%
src/local_deep_research/database/rekey_lock.py read_rekey_epoch_state   100% 5 0 0   100% 2 0   100%
src/local_deep_research/database/rekey_lock.py read_rekey_epoch   100% 7 0 0   100% 2 0   100%
src/local_deep_research/database/rekey_lock.py _canonical_epoch   71% 7 2 0   100% 2 0   78%
src/local_deep_research/database/rekey_lock.py _sync_parent_directory   90% 10 1 0   75% 4 1   86%
src/local_deep_research/database/rekey_lock.py _write_epoch_token   93% 15 1 0   50% 2 1   88%
src/local_deep_research/database/rekey_lock.py begin_rekey_epoch   88% 8 1 0   75% 4 1   83%
src/local_deep_research/database/rekey_lock.py commit_rekey_epoch   100% 6 0 0   75% 4 1   90%
src/local_deep_research/database/rekey_lock.py clear_pending_rekey_epoch   100% 9 0 0   100% 4 0   100%
src/local_deep_research/database/rekey_lock.py advance_rekey_epoch   75% 8 2 0   50% 4 2   67%
src/local_deep_research/database/rekey_lock.py publish_new_database_epoch   80% 15 3 0   50% 2 1   76%
src/local_deep_research/database/rekey_lock.py read_or_initialize_rekey_epoch   83% 6 1 0   75% 4 1   80%
src/local_deep_research/database/rekey_lock.py (no function)   100% 114 0 0   100% 0 0   100%
src/local_deep_research/database/research_cascade.py collect_research_document_rag_targets   100% 14 0 0   80% 10 2   92%
src/local_deep_research/database/research_cascade.py _research_cascade_plan   94% 63 4 0   88% 42 5   91%
src/local_deep_research/database/research_cascade.py _ensure_outer_db_transaction   80% 10 2 0   67% 6 2   75%
src/local_deep_research/database/research_cascade.py _chunks   100% 3 0 0   100% 2 0   100%
src/local_deep_research/database/research_cascade.py _owned_trackers   100% 4 0 0   100% 2 0   100%
src/local_deep_research/database/research_cascade.py _tracker_references   100% 25 0 0   100% 16 0   100%
src/local_deep_research/database/research_cascade.py SharedDownloadIndex.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/database/research_cascade.py SharedDownloadIndex.build   100% 5 0 0   100% 0 0   100%
src/local_deep_research/database/research_cascade.py SharedDownloadIndex.mark_deleted   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/research_cascade.py SharedDownloadIndex.replacements   100% 18 0 0   100% 12 0   100%
src/local_deep_research/database/research_cascade.py _shared_download_replacements   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/research_cascade.py _shared_document_replacements   100% 5 0 0   100% 2 0   100%
src/local_deep_research/database/research_cascade.py delete_research_with_dependents   96% 76 3 0   97% 38 1   96%
src/local_deep_research/database/research_cascade.py delete_research_with_dependents._pk_columns   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/research_cascade.py delete_research_with_dependents._pk_filter   75% 4 1 0   50% 2 1   67%
src/local_deep_research/database/research_cascade.py delete_research_with_dependents._resolve_step   100% 8 0 0   100% 2 0   100%
src/local_deep_research/database/research_cascade.py (no function)   100% 25 0 0   100% 0 0   100%
src/local_deep_research/database/session_context.py DatabaseSessionUnavailableError.__init__   100% 2 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 telemetry_savepoint   88% 16 2 0   100% 6 0   91%
src/local_deep_research/database/session_context.py get_user_db_session   100% 45 0 0   100% 24 0   100%
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% 26 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   100% 10 0 0   88% 8 1   94%
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 _reset_lifecycle_lock   0% 1 1 0   100% 0 0   0%
src/local_deep_research/database/sqlcipher_compat.py _check_owner_thread   100% 4 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_compat.py _owner_checked   100% 4 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py _owner_checked.method   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py _same_object   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py _cursor_connection   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type   100% 20 0 0   80% 10 2   93%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type.LifecycleConnection.__init__   88% 8 1 0   50% 2 1   80%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type.LifecycleConnection.close   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type.LifecycleConnection._ldr_close   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type.LifecycleConnection.__del__   60% 5 2 0   100% 2 0   71%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type.cursor   100% 4 0 0   50% 2 1   83%
src/local_deep_research/database/sqlcipher_compat.py _guarded_connection_type.set_isolation_level   100% 3 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_compat.py wal_lifecycle_guard   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_compat.py connect_sqlcipher   100% 5 0 0   100% 4 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% 18 0 0   50% 2 1   95%
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% 13 0 0   100% 4 0   100%
src/local_deep_research/database/sqlcipher_utils.py create_database_salt   100% 13 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% 3 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_utils.py _contains_key_fragment   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_utils.py _rekey_failure_detail   100% 4 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_utils.py set_sqlcipher_rekey   100% 21 0 0   100% 4 0   100%
src/local_deep_research/database/sqlcipher_utils.py get_sqlcipher_busy_timeout_ms   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_utils.py sqlcipher_busy_timeout_pragma   100% 2 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   95% 21 1 0   83% 6 1   93%
src/local_deep_research/database/sqlcipher_utils.py _db_lock_error_types   67% 12 4 0   100% 0 0   67%
src/local_deep_research/database/sqlcipher_utils.py retry_on_db_lock   100% 8 0 1   100% 2 0   100%
src/local_deep_research/database/sqlcipher_utils.py _exception_chain   100% 9 0 0   100% 4 0   100%
src/local_deep_research/database/sqlcipher_utils.py is_wrong_key_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_utils.py is_operational_sqlite_error   100% 3 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_utils.py check_sqlcipher_key   100% 9 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_utils.py verify_sqlcipher_connection   100% 10 0 0   100% 2 0   100%
src/local_deep_research/database/sqlcipher_utils.py get_sqlcipher_version   100% 7 0 0   100% 0 0   100%
src/local_deep_research/database/sqlcipher_utils.py create_sqlcipher_connection   96% 26 1 0   88% 8 1   94%
src/local_deep_research/database/sqlcipher_utils.py (no function)   100% 63 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.get_scoped_session   100% 5 0 0   100% 4 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   100% 8 0 0   100% 6 0   100%
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% 37 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% 27 0 0   86% 14 2   95%
src/local_deep_research/database/thread_metrics.py ThreadSafeMetricsWriter.write_token_metrics   100% 2 0 0   100% 0 0   100%
src/local_deep_research/database/thread_metrics.py ThreadSafeMetricsWriter.add_token_metrics_to_session   100% 13 0 0   100% 4 0   100%
src/local_deep_research/database/thread_metrics.py (no function)   100% 18 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/bounded_pdf.py load_bounded_pdf   98% 44 1 0   94% 18 1   97%
src/local_deep_research/document_loaders/bounded_pdf.py (no function)   100% 10 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/bytes_loader.py load_from_bytes   87% 47 6 0   100% 16 0   90%
src/local_deep_research/document_loaders/bytes_loader.py extract_text_from_bytes   90% 20 2 0   100% 2 0   91%
src/local_deep_research/document_loaders/bytes_loader.py (no function)   100% 13 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/evernote_loader.py _EvernoteXMLParser.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/evernote_loader.py _EvernoteXMLParser.defused_start_doctype_decl   100% 2 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/evernote_loader.py EverNoteLoader.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/evernote_loader.py EverNoteLoader.lazy_load   75% 4 1 0   50% 2 1   67%
src/local_deep_research/document_loaders/evernote_loader.py EverNoteLoader._iter_notes   100% 26 0 0   95% 20 1   98%
src/local_deep_research/document_loaders/evernote_loader.py (no function)   100% 16 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% 98 4 0   73% 26 5   91%
src/local_deep_research/document_loaders/openpyxl_hardening.py _no_drawings   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/openpyxl_hardening.py disable_openpyxl_drawing_reads   82% 11 2 0   100% 4 0   87%
src/local_deep_research/document_loaders/openpyxl_hardening.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/text_encoding.py _fallback_encodings   100% 5 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/text_encoding.py detect_text_encoding   100% 13 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/text_encoding.py _file_encoding   100% 4 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/text_encoding.py _with_encoding   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/text_encoding.py EncodingAwareTextLoader.lazy_load   100% 2 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/text_encoding.py EncodingAwareCSVLoader.lazy_load   100% 2 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/text_encoding.py (no function)   100% 14 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/toml_loader.py _read_limited_text   100% 4 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/toml_loader.py TOMLLoader.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/toml_loader.py TOMLLoader.lazy_load   100% 8 0 0   100% 6 0   100%
src/local_deep_research/document_loaders/toml_loader.py (no function)   100% 10 0 0   100% 0 0   100%
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/document_loaders/zip_container_guard.py _max_compress_size   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _local_entry_range   89% 36 4 0   82% 22 4   86%
src/local_deep_research/document_loaders/zip_container_guard.py _local_zip64_sizes   73% 11 3 0   50% 6 3   65%
src/local_deep_research/document_loaders/zip_container_guard.py _check_data_descriptor   100% 9 0 0   75% 4 1   92%
src/local_deep_research/document_loaders/zip_container_guard.py _inflate_head   95% 39 2 0   92% 26 2   94%
src/local_deep_research/document_loaders/zip_container_guard.py _is_canonical_member_name   100% 4 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _is_media_head   91% 11 1 0   90% 10 1   90%
src/local_deep_research/document_loaders/zip_container_guard.py _looks_like_markup   100% 5 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_package_type   100% 21 0 0   100% 14 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _declared_central_directory_size   100% 7 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_central_directory_span   100% 4 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py validate_zip_container   100% 21 0 0   100% 10 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_entries   98% 42 1 0   97% 32 1   97%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.start_ns   100% 4 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.doctype   0% 1 1 0   100% 0 0   0%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.start   100% 5 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.expat_start   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget._count_names   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.end   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxScanTarget.close   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_namespaces   70% 10 3 0   75% 4 1   71%
src/local_deep_research/document_loaders/zip_container_guard.py _scan_xlsx_part   96% 26 1 0   92% 12 1   95%
src/local_deep_research/document_loaders/zip_container_guard.py _scan_xlsx_part.expat_feed   100% 3 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_scan_step   89% 9 1 0   50% 2 1   82%
src/local_deep_research/document_loaders/zip_container_guard.py _require_utf8_xml   100% 10 0 0   100% 8 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XmlTagSigns.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XmlTagSigns.feed   100% 7 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XmlTagSigns._check   100% 2 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XmlProlog.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XmlProlog.feed   100% 51 0 0   100% 34 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _CountedXmlStream.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _CountedXmlStream.read   94% 17 1 0   83% 6 1   91%
src/local_deep_research/document_loaders/zip_container_guard.py _read_counted_xml   100% 3 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_sheet_fan_out   92% 26 2 0   100% 0 0   92%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_sheet_list   92% 13 1 0   90% 10 1   91%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_loaded_parts   100% 16 0 0   100% 8 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_loaded_parts.add   100% 2 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _refuse_xlsx_nested_node   100% 2 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_list_cap   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _refuse_xlsx_list_entry   100% 5 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _refuse_xlsx_repeated_child   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxIndexedList.__init__   100% 5 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _XlsxIndexedList.add   100% 9 0 0   100% 6 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_numeric_fields   100% 26 0 0   100% 14 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_style_number   100% 12 0 0   100% 6 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_text_fields   100% 7 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_styles   100% 161 0 0   100% 92 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _model_xlsx_style_entry   100% 17 0 0   100% 10 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _xlsx_format_units   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _require_skeleton_size   100% 18 0 0   88% 8 1   96%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_workbook_tree   100% 19 0 0   100% 12 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_workbook_tree.entry   100% 10 0 0   83% 6 1   94%
src/local_deep_research/document_loaders/zip_container_guard.py _check_xlsx_defined_names   100% 10 0 0   100% 8 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _refuse_dtd   67% 3 1 0   50% 2 1   60%
src/local_deep_research/document_loaders/zip_container_guard.py _note_outside_root_node   100% 4 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _skeleton_xml   100% 11 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _part_rels   94% 16 1 0   90% 10 1   92%
src/local_deep_research/document_loaders/zip_container_guard.py _check_package_relationships   100% 41 0 0   100% 32 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _str_width   100% 6 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _main_part   86% 7 1 0   75% 4 1   82%
src/local_deep_research/document_loaders/zip_container_guard.py _content_types   92% 12 1 0   88% 8 1   90%
src/local_deep_research/document_loaders/zip_container_guard.py _content_type   100% 6 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _require_content_type   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_pptx_slide_fan_out   80% 20 4 0   100% 4 0   83%
src/local_deep_research/document_loaders/zip_container_guard.py _pptx_placeholder_work   100% 24 0 0   100% 12 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _pptx_placeholder_work.tree   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _pptx_placeholder_work.related   100% 6 0 0   100% 4 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _pptx_inherited_read_units   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _pptx_shape_tree   90% 48 5 0   84% 38 2   87%
src/local_deep_research/document_loaders/zip_container_guard.py _pptx_slide_targets   100% 19 0 2   100% 10 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _check_docx_section_fan_out   88% 33 4 0   100% 16 0   92%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_section_stats   99% 286 3 0   95% 170 9   97%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_section_stats.visits   92% 13 1 0   92% 12 1   92%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_section_stats.text_before   100% 3 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_section_stats.node_bytes   100% 10 0 0   100% 6 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _note_union_child   100% 14 0 0   100% 14 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _union_steps   100% 11 0 0   100% 6 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _union_units   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_part_union_steps   98% 46 1 0   88% 24 3   94%
src/local_deep_research/document_loaders/zip_container_guard.py _note_used_uris   100% 5 0 0   100% 6 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _OpenCell.__init__   100% 9 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _OpenRow.__init__   100% 13 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _OpenTable.__init__   100% 6 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _note_docx_table_child   100% 13 0 0   100% 12 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_merge_steps   100% 26 0 0   100% 12 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _merge_step   100% 1 0 0   100% 0 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _text_bytes   100% 3 0 0   100% 2 0   100%
src/local_deep_research/document_loaders/zip_container_guard.py _note_docx_grid_value   100% 25 0 0   88% 16 2   95%
src/local_deep_research/document_loaders/zip_container_guard.py _fold_docx_text_work   100% 42 0 0   89% 28 3   96%
src/local_deep_research/document_loaders/zip_container_guard.py _docx_skeleton_entries   92% 13 1 0   88% 8 1   90%
src/local_deep_research/document_loaders/zip_container_guard.py (no function)   100% 311 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% 48 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% 24 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/model_cache.py _freeze   80% 5 1 0   75% 4 1   78%
src/local_deep_research/embeddings/model_cache.py _artifact_stamp   100% 44 0 0   100% 18 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache._clear_locked   100% 5 0 0   100% 2 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache.clear   100% 6 0 0   100% 2 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache.prepare   100% 7 0 0   100% 2 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache._options   100% 3 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache._load_locked   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache._prepare_locked   100% 24 0 0   100% 6 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache.embed   100% 8 0 0   100% 4 0   100%
src/local_deep_research/embeddings/model_cache.py _ModelCache._reload_locked   94% 17 1 0   75% 8 2   88%
src/local_deep_research/embeddings/model_cache.py _ModelCache._run_serially   92% 12 1 0   83% 6 1   89%
src/local_deep_research/embeddings/model_cache.py SharedSentenceTransformerEmbeddings.__init__   100% 5 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py SharedSentenceTransformerEmbeddings.embed_documents   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py SharedSentenceTransformerEmbeddings.embed_query   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py SharedSentenceTransformerEmbeddings.close   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py shared_sentence_transformer_embeddings   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py clear_sentence_transformer_cache   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_cache.py (no function)   100% 39 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_loading.py ModelAccessLock.__init__   100% 5 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_loading.py ModelAccessLock.acquire   95% 21 1 0   90% 10 1   94%
src/local_deep_research/embeddings/model_loading.py ModelAccessLock.release   86% 7 1 0   75% 4 1   82%
src/local_deep_research/embeddings/model_loading.py ModelAccessLock.__enter__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_loading.py ModelAccessLock.__exit__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_loading.py ModelAccessLock.inference   100% 12 0 0   100% 4 0   100%
src/local_deep_research/embeddings/model_loading.py load_sentence_transformer   100% 2 0 0   100% 0 0   100%
src/local_deep_research/embeddings/model_loading.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% 24 0 0   100% 8 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% 29 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/openai.py OpenAIEmbeddingsProvider.create_embeddings   100% 77 0 0   100% 34 0   100%
src/local_deep_research/embeddings/providers/implementations/openai.py OpenAIEmbeddingsProvider.is_available   100% 13 0 0   100% 2 0   100%
src/local_deep_research/embeddings/providers/implementations/openai.py OpenAIEmbeddingsProvider.get_available_models   93% 44 3 0   93% 14 1   93%
src/local_deep_research/embeddings/providers/implementations/openai.py (no function)   100% 26 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/owned_openai_embeddings.py _aclose_http_clients   100% 12 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/owned_openai_embeddings.py close_openai_embedding_clients   82% 17 3 0   100% 2 0   84%
src/local_deep_research/embeddings/providers/implementations/owned_openai_embeddings.py close_openai_embedding_clients._close_in_thread   50% 4 2 0   100% 0 0   50%
src/local_deep_research/embeddings/providers/implementations/owned_openai_embeddings.py OwnedOpenAIEmbeddings.close   75% 4 1 0   75% 4 1   75%
src/local_deep_research/embeddings/providers/implementations/owned_openai_embeddings.py OwnedOpenAIEmbeddings.aclose   100% 4 0 0   100% 4 0   100%
src/local_deep_research/embeddings/providers/implementations/owned_openai_embeddings.py (no function)   100% 13 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider.create_embeddings   100% 61 0 0   100% 28 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._model_cache_directory   100% 4 0 0   100% 0 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._is_model_cached_locally   100% 17 0 2   100% 8 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._is_model_cached_locally.is_cached   100% 5 0 0   100% 2 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._cached_model_revision   100% 23 0 2   100% 12 0   100%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._has_model_cache_state   67% 9 3 0   50% 2 1   64%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._reject_shadowed_hub_model   67% 6 2 0   100% 2 0   75%
src/local_deep_research/embeddings/providers/implementations/sentence_transformers.py SentenceTransformersProvider._confined_local_model_path   90% 30 3 4   75% 16 4   85%
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% 38 0 0   100% 0 0   100%
src/local_deep_research/embeddings/sentence_transformer_models.py SentenceTransformerModelSpec.display_metadata   100% 1 0 0   100% 0 0   100%
src/local_deep_research/embeddings/sentence_transformer_models.py get_sentence_transformer_model_spec   100% 4 0 0   100% 2 0   100%
src/local_deep_research/embeddings/sentence_transformer_models.py (no function)   100% 11 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_messages.py get_known_research_error_message   100% 10 0 0   100% 8 0   100%
src/local_deep_research/error_handling/error_messages.py (no function)   100% 4 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% 8 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% 23 0 0   100% 0 0   100%
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)   91% 22 2 0   100% 0 0   91%
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   100% 6 0   100%
src/local_deep_research/error_handling/report_generator.py ErrorReportGenerator._format_partial_results   100% 35 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% 12 0 0   100% 8 0   100%
src/local_deep_research/error_handling/report_generator.py (no function)   100% 13 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% 6 0 0   100% 4 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.__init__   100% 5 0 0   100% 2 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._pandoc_supports_sandbox   100% 3 0 0   100% 0 0   100%
src/local_deep_research/exporters/odt_exporter.py ODTExporter.export   98% 49 1 0   94% 16 1   97%
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)   90% 30 3 0   100% 0 0   90%
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% 3 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% 24 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% 29 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% 8 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 _partition_decompressed_cap   100% 5 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py _normalize_digest   100% 8 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py iter_partitions   100% 35 0 0   100% 16 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py iter_partitions.decode   95% 38 2 0   91% 22 2   93%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py iter_partitions.decode.bomb_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/_openalex_common.py (no function)   100% 22 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/base.py atomic_replace   100% 1 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% 25 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/data_sources/doaj.py DOAJSource.fetch   92% 24 2 0   67% 6 2   87%
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   86% 36 5 0   62% 16 4   79%
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   88% 58 7 0   77% 22 5   85%
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 sqlite_readonly_uri   100% 5 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py journal_db_file_status   100% 21 0 0   100% 4 0   100%
src/local_deep_research/journal_quality/db.py journal_db_file_is_valid   100% 1 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% 17 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   100% 15 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB._validate_existing_db   100% 7 0 0   100% 4 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   100% 17 0 0   100% 6 0   100%
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   92% 12 1 0   50% 2 1   86%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_sources_batch   96% 23 1 0   90% 10 1   94%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_doaj   100% 13 0 0   100% 4 0   100%
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   100% 20 0 0   100% 14 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.is_whitelisted   100% 6 0 0   100% 4 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.lookup_institution   100% 18 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.score_from_affiliations   94% 32 2 0   86% 22 3   91%
src/local_deep_research/journal_quality/db.py JournalQualityDB.expand_abbreviation   94% 17 1 0   75% 8 2   88%
src/local_deep_research/journal_quality/db.py JournalQualityDB._lookup_source_row   100% 43 0 0   78% 36 8   90%
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   100% 5 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_quality_distribution   100% 5 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_source_distribution   100% 5 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_journals_page   100% 22 0 0   100% 12 0   100%
src/local_deep_research/journal_quality/db.py JournalQualityDB.get_institutions_page   100% 15 0 0   83% 6 1   95%
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   100% 3 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py build_db   79% 66 14 0   50% 12 4   74%
src/local_deep_research/journal_quality/db.py build_db._make_write_conn   100% 1 0 0   100% 0 0   100%
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_gzip_json   100% 9 0 0   100% 4 0   100%
src/local_deep_research/journal_quality/db.py _load_openalex   100% 8 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py _load_doaj   100% 9 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py _load_predatory   100% 12 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py _load_institutions   100% 8 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py _load_abbreviations   100% 8 0 0   100% 2 0   100%
src/local_deep_research/journal_quality/db.py _populate_predatory   100% 11 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/db.py _as_number   100% 8 0 0   100% 8 0   100%
src/local_deep_research/journal_quality/db.py _as_text   100% 5 0 0   100% 4 0   100%
src/local_deep_research/journal_quality/db.py _populate_sources   98% 84 2 0   93% 44 3   96%
src/local_deep_research/journal_quality/db.py _populate_institutions   94% 16 1 0   90% 10 1   92%
src/local_deep_research/journal_quality/db.py _populate_abbreviations   100% 11 0 0   100% 6 0   100%
src/local_deep_research/journal_quality/db.py build_reference_db   100% 1 0 0   100% 0 0   100%
src/local_deep_research/journal_quality/db.py (no function)   100% 100 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   88% 16 2 0   100% 2 0   89%
src/local_deep_research/journal_quality/downloader.py download_journal_data   87% 106 14 0   88% 26 3   87%
src/local_deep_research/journal_quality/downloader.py download_journal_data._sentinel_owner_alive   40% 15 9 0   50% 2 1   41%
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   100% 13 0 0   100% 2 0   100%
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   100% 20 0 0   90% 10 1   97%
src/local_deep_research/journal_quality/downloader.py (no function)   100% 29 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   97% 60 2 0   96% 52 2   96%
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% 18 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% 43 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   92% 13 1 0   83% 6 1   89%
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% 8 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   100% 1 0 0   100% 0 0   100%
src/local_deep_research/library/download_management/status_tracker.py ResourceStatusTracker.mark_failure   62% 8 3 0   75% 4 1   67%
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   62% 8 3 0   75% 4 1   67%
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   100% 20 0 0   100% 14 0   100%
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/cancellation.py get_current_research_id   80% 10 2 0   75% 4 1   79%
src/local_deep_research/llm/cancellation.py resolve_research_id   0% 3 3 0   0% 2 0   0%
src/local_deep_research/llm/cancellation.py is_termination_requested   62% 8 3 0   100% 2 0   70%
src/local_deep_research/llm/cancellation.py raise_if_terminated   100% 3 0 0   100% 2 0   100%
src/local_deep_research/llm/cancellation.py _try_bind   50% 4 2 0   100% 0 0   50%
src/local_deep_research/llm/cancellation.py bind_llm_to_research   57% 21 9 0   62% 8 3   59%
src/local_deep_research/llm/cancellation.py effective_research_id   70% 10 3 0   100% 4 0   79%
src/local_deep_research/llm/cancellation.py (no function)   100% 9 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_local_context_window   100% 3 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py get_context_window_for_provider   100% 8 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 _get_setting_value   100% 5 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py _validate_number   100% 16 0 0   100% 10 0   100%
src/local_deep_research/llm/providers/_helpers.py _resolve_bounded_number   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py resolve_request_timeout   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py resolve_max_retries   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py build_timeout   100% 2 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py build_httpx_timeout   100% 2 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/_helpers.py (no function)   100% 24 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 is_builtin_provider_factory   100% 4 0 0   100% 2 0   100%
src/local_deep_research/llm/providers/auto_discovery.py (no function)   100% 30 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/base.py normalize_provider   100% 5 0 0   100% 4 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% 7 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/base.py BaseLLMProvider.has_api_key   100% 6 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/base.py (no function)   100% 23 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   93% 28 2 0   100% 10 0   95%
src/local_deep_research/llm/providers/implementations/anthropic.py AnthropicProvider.list_models_for_api   100% 27 0 0   90% 10 1   97%
src/local_deep_research/llm/providers/implementations/anthropic.py (no function)   100% 20 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% 19 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/implementations/custom_anthropic_endpoint.py (no function)   100% 19 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% 21 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% 24 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% 28 0 0   100% 12 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% 11 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% 22 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% 11 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% 28 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% 20 0 0   100% 4 0   100%
src/local_deep_research/llm/providers/implementations/ollama.py OllamaProvider.create_llm   100% 25 0 0   100% 8 0   100%
src/local_deep_research/llm/providers/implementations/ollama.py OllamaProvider.is_available   91% 33 3 0   100% 4 0   92%
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% 32 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% 17 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/qwen.py QwenCloudProvider.requires_auth_for_models   100% 1 0 0   100% 0 0   100%
src/local_deep_research/llm/providers/implementations/qwen.py (no function)   100% 13 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   87% 23 3 0   83% 6 1   86%
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% 33 0 0   94% 16 1   98%
src/local_deep_research/llm/providers/openai_base.py OpenAICompatibleProvider.list_models   100% 13 0 0   100% 2 0   100%
src/local_deep_research/llm/providers/openai_base.py (no function)   100% 29 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   75% 16 4 0   100% 2 0   78%
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% 51 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   100% 10 0 0   100% 2 0   100%
src/local_deep_research/metrics/pricing/cost_calculator.py CostCalculator.calculate_cost_sync   100% 11 0 0   100% 4 0   100%
src/local_deep_research/metrics/pricing/cost_calculator.py CostCalculator.get_research_cost_summary   100% 2 0 0   100% 0 0   100%
src/local_deep_research/metrics/pricing/cost_calculator.py summarize_costs   100% 32 0 0   100% 12 0   100%
src/local_deep_research/metrics/pricing/cost_calculator.py (no function)   100% 14 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% 1 0 0   100% 0 0   100%
src/local_deep_research/metrics/pricing/pricing_fetcher.py PricingFetcher.get_static_model_pricing   100% 22 0 0   100% 16 0   100%
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% 13 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 _session_has_pending_orm_state   75% 8 2 0   100% 4 0   83%
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% 61 0 0   100% 20 0   100%
src/local_deep_research/metrics/search_tracker.py SearchTracker.record_search._write_search   100% 3 0 0   100% 0 0   100%
src/local_deep_research/metrics/search_tracker.py SearchTracker.get_search_metrics   100% 26 0 0   100% 12 0   100%
src/local_deep_research/metrics/search_tracker.py SearchTracker.get_research_search_metrics   100% 16 0 0   100% 0 0   100%
src/local_deep_research/metrics/search_tracker.py SearchTracker.get_search_time_series   95% 19 1 0   75% 8 2   89%
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% 18 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% 78 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% 65 1 0   98% 40 1   98%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback.on_llm_error   100% 10 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% 3 0 0   100% 2 0   100%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback._save_to_db   100% 88 0 0   100% 28 0   100%
src/local_deep_research/metrics/token_counter.py TokenCountingCallback._save_to_db._write_metrics   100% 1 0 0   100% 0 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% 119 0 0   94% 54 3   98%
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% 37 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 _lazy_log_preview   100% 1 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% 112 3 0   91% 44 4   96%
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% 14 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   88% 56 7 0   88% 40 5   88%
src/local_deep_research/news/api.py _validate_subscription_policy   100% 30 0 0   100% 10 0   100%
src/local_deep_research/news/api.py create_subscription   89% 28 3 0   100% 4 0   91%
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% 27 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% 30 0 0   100% 0 0   100%
src/local_deep_research/news/constants.py _is_whole_minutes_up_to   100% 1 0 0   100% 0 0   100%
src/local_deep_research/news/constants.py is_valid_refresh_interval   100% 1 0 0   100% 0 0   100%
src/local_deep_research/news/constants.py is_runnable_refresh_interval   100% 1 0 0   100% 0 0   100%
src/local_deep_research/news/constants.py validate_refresh_interval   100% 3 0 0   100% 2 0   100%
src/local_deep_research/news/constants.py validate_runnable_refresh_interval   100% 3 0 0   100% 2 0   100%
src/local_deep_research/news/constants.py _unsupported_update_fields_message   100% 5 0 0   100% 2 0   100%
src/local_deep_research/news/constants.py compact_subscription_update_error   100% 16 0 0   100% 14 0   100%
src/local_deep_research/news/constants.py normalize_compact_subscription_update   100% 9 0 0   100% 6 0   100%
src/local_deep_research/news/constants.py folder_update_error   100% 14 0 0   100% 12 0   100%
src/local_deep_research/news/constants.py normalize_folder_update   100% 4 0 0   100% 2 0   100%
src/local_deep_research/news/constants.py (no function)   100% 23 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% 3 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% 4 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% 8 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% 16 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% 6 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% 2 0 0   100% 0 0   100%
src/local_deep_research/news/utils/headline_generator.py generate_headline_async   100% 2 0 0   100% 0 0   100%
src/local_deep_research/news/utils/headline_generator.py _finalize_headline   100% 3 0 0   100% 2 0   100%
src/local_deep_research/news/utils/headline_generator.py _build_headline_prompt   100% 6 0 0   100% 2 0   100%
src/local_deep_research/news/utils/headline_generator.py _clean_headline   100% 6 0 0   100% 2 0   100%
src/local_deep_research/news/utils/headline_generator.py _generate_with_llm   100% 14 0 0   100% 2 0   100%
src/local_deep_research/news/utils/headline_generator.py _generate_with_llm_async   93% 14 1 0   50% 2 1   88%
src/local_deep_research/news/utils/headline_generator.py (no function)   100% 10 0 0   100% 0 0   100%
src/local_deep_research/news/utils/topic_generator.py generate_topics   100% 2 0 0   100% 0 0   100%
src/local_deep_research/news/utils/topic_generator.py generate_topics_async   100% 2 0 0   100% 0 0   100%
src/local_deep_research/news/utils/topic_generator.py _finalize_topics   100% 3 0 0   100% 2 0   100%
src/local_deep_research/news/utils/topic_generator.py _build_topic_prompt   100% 3 0 0   100% 0 0   100%
src/local_deep_research/news/utils/topic_generator.py _parse_topics_response   100% 15 0 0   100% 10 0   100%
src/local_deep_research/news/utils/topic_generator.py _generate_with_llm   100% 17 0 0   100% 2 0   100%
src/local_deep_research/news/utils/topic_generator.py _generate_with_llm_async   82% 17 3 0   50% 2 1   79%
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% 11 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% 54 0 0   100% 18 0   100%
src/local_deep_research/notifications/manager.py NotificationManager.test_service   100% 12 0 0   100% 8 0   100%
src/local_deep_research/notifications/manager.py NotificationManager._filter_urls_by_egress_policy   88% 56 7 0   95% 22 1   90%
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% 47 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   100% 12 0 0   100% 6 0   100%
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   79% 34 7 0   83% 12 2   80%
src/local_deep_research/notifications/service.py NotificationService._dispatch   89% 28 3 0   94% 16 1   91%
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   93% 44 3 0   96% 24 1   94%
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% 39 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   93% 56 4 0   88% 24 3   91%
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   80% 129 26 0   70% 70 7   76%
src/local_deep_research/report_generator.py IntegratedReportGenerator._strip_trailing_citation_blocks   83% 84 14 0   78% 58 13   81%
src/local_deep_research/report_generator.py IntegratedReportGenerator._strip_subsection_boilerplate   100% 33 0 0   100% 16 0   100%
src/local_deep_research/report_generator.py IntegratedReportGenerator._build_previous_context   100% 7 0 0   100% 4 0   100%
src/local_deep_research/report_generator.py IntegratedReportGenerator._research_and_generate_sections   93% 75 5 0   88% 34 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% 25 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% 56 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 _user_settings_snapshot   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/deletion/services/collection_deletion.py _remove_unfinished_rebuilds   60% 5 2 0   100% 0 0   60%
src/local_deep_research/research_library/deletion/services/collection_deletion.py _remote_drop_failure_result   100% 1 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% 68 2 0   100% 22 0   98%
src/local_deep_research/research_library/deletion/services/collection_deletion.py CollectionDeletionService.delete_collection_index_only   100% 38 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% 15 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.purge_deleted_research_documents   100% 9 0 0   100% 4 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% 36 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% 26 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 RemoteVectorStoreDropError.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py RemoteVectorStoreDropError.log_detail   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py _is_transient_drop_failure   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py remote_drop_failure_message   100% 6 0 0   100% 4 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py read_vector_cleanup_settings_snapshot   100% 10 0 0   100% 2 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   100% 11 0 0   100% 4 0   100%
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   81% 62 12 0   93% 28 2   84%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper._row_provider_key   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper._plan_vector_cleanup   100% 19 0 0   100% 10 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper._drop_planned_remote_collections   100% 20 0 0   100% 12 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper.drop_remote_vector_collections   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper.delete_rag_indices_for_collection   100% 22 0 0   100% 10 0   100%
src/local_deep_research/research_library/deletion/utils/cascade_helper.py CascadeHelper.update_download_tracker   100% 13 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% 49 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 attribute_arxiv_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.__init__   100% 7 0 0   75% 4 1   91%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.can_handle   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.download   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.download_with_result   100% 14 0 0   100% 8 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% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._pdf_url   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.download_text_with_source   100% 10 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.download_full_text   100% 17 0 0   100% 10 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.download_full_text._note_rate_limited   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.download_full_text._note_transport_failure   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._html_then_pdf_text   100% 18 0 0   100% 12 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._download_html_text   100% 22 0 0   100% 10 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._tex_for_math_element   100% 9 0 0   100% 8 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._outermost_tex_annotations   100% 7 0 0   100% 4 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._visible_math_text   100% 14 0 0   90% 10 1   96%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._rewrite_math_to_tex   100% 14 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._outermost_math_elements   100% 9 0 0   100% 4 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._is_matching_arxiv_paper_url   81% 16 3 0   88% 8 1   83%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._stayed_on_arxiv_html   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._html_text_beats_pdf_text   89% 9 1 0   83% 6 1   87%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._extract_arxiv_id   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader.get_metadata   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/arxiv.py ArxivDownloader._fetch_from_arxiv_api   96% 69 3 0   95% 42 2   95%
src/local_deep_research/research_library/downloaders/arxiv.py (no function)   100% 68 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/base.py rate_limit_authority   100% 14 0 0   100% 6 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% 7 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   100% 7 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/base.py BaseDownloader._is_pdf_content   69% 16 5 0   83% 6 1   73%
src/local_deep_research/research_library/downloaders/base.py BaseDownloader._ensure_decoded_body_cap   100% 12 0 0   83% 6 1   94%
src/local_deep_research/research_library/downloaders/base.py BaseDownloader._download_pdf   99% 79 1 0   97% 30 1   98%
src/local_deep_research/research_library/downloaders/base.py BaseDownloader.extract_text_from_pdf   100% 41 0 0   94% 16 1   98%
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% 48 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   96% 26 1 0   100% 10 0   97%
src/local_deep_research/research_library/downloaders/biorxiv.py (no function)   100% 16 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% 10 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 _flatten_html   100% 21 0 0   100% 14 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   79% 68 14 0   65% 26 5   76%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py _is_cache_hit_allowed   100% 13 0 9   100% 4 0   100%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py fetch_and_extract   92% 24 2 2   90% 10 1   91%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py fetch_and_extract._do_fetch   93% 29 2 0   100% 6 0   94%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py batch_fetch_and_extract   85% 60 9 4   95% 22 1   88%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py batch_fetch_and_extract._report_progress   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py batch_fetch_and_extract._get_shared_downloader   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py batch_fetch_and_extract._download_one   96% 24 1 0   100% 8 0   97%
src/local_deep_research/research_library/downloaders/extraction/pipeline.py (no function)   100% 40 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _node_is_available   100% 9 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _stranded_call_count   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _acquire_node_slot   100% 8 0 0   100% 4 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _release_node_slot   100% 11 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _reset_node_breaker   100% 4 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _extract_json   100% 27 0 0   100% 8 0   100%
src/local_deep_research/research_library/downloaders/extraction/readability_extractor.py _extract_json._run   100% 4 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% 20 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 _with_pdf_suffix   100% 9 0 0   100% 2 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   100% 44 0 0   100% 24 0   100%
src/local_deep_research/research_library/downloaders/generic.py GenericDownloader._download_pdf   100% 15 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/generic.py (no function)   100% 13 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/html.py _client_safe_html_message   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/html.py _as_markdown_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/html.py _fetch_failure_reason   100% 13 0 0   100% 12 0   100%
src/local_deep_research/research_library/downloaders/html.py _TerminalTransportError.__init__   100% 4 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% 28 0 0   94% 16 1   98%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader.download_with_result   97% 32 1 0   95% 20 1   96%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._fetch_html   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._fetch_html_with_final_url   100% 57 0 0   100% 14 0   100%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._fetch_html_with_final_url._terminal_failure   100% 12 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._fetch_response_with_retry   100% 21 0 1   100% 4 0   100%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._is_recoverable_text_content   100% 8 0 0   100% 6 0   100%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._consume_recovery   90% 10 1 0   75% 4 1   86%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._extract_stashed_pdf_text   58% 12 5 0   75% 4 1   62%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._format_recovered_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/html.py HTMLDownloader._extract_content   100% 11 0 0   100% 2 0   100%
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   100% 23 0 0   92% 12 1   97%
src/local_deep_research/research_library/downloaders/html.py (no function)   100% 40 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/openalex.py OpenAlexDownloader.__init__   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/openalex.py OpenAlexDownloader._scrub   100% 1 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% 49 0 0   94% 16 1   98%
src/local_deep_research/research_library/downloaders/openalex.py OpenAlexDownloader._get_pdf_url._send   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/downloaders/openalex.py OpenAlexDownloader._get_pdf_url._drop_rejected_key   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/openalex.py (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py _browser_transport_allowed   100% 2 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% 11 0 0   50% 4 2   87%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._playwright_route_guard   100% 50 0 0   100% 18 0   100%
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   96% 52 2 0   94% 18 1   96%
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   97% 37 1 0   94% 18 1   96%
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   100% 12 0 0   100% 4 0   100%
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   83% 18 3 0   50% 4 2   77%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_html   89% 9 1 0   83% 6 1   87%
src/local_deep_research/research_library/downloaders/playwright_html.py PlaywrightHTMLDownloader._fetch_with_crawl4ai   97% 38 1 0   100% 8 0   98%
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   85% 40 6 0   75% 4 1   84%
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% 12 0 0   50% 4 2   88%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader._host_rate_limited   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader._note_host_rate_limited   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader._get_playwright_downloader   100% 4 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   89% 18 2 0   83% 6 1   88%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader.download   93% 29 2 0   79% 14 3   88%
src/local_deep_research/research_library/downloaders/playwright_html.py AutoHTMLDownloader.download_with_result   75% 32 8 0   75% 16 2   75%
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% 55 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   97% 66 2 0   89% 36 4   94%
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   97% 30 1 0   93% 14 1   95%
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   95% 19 1 0   100% 8 0   96%
src/local_deep_research/research_library/downloaders/pubmed.py PubMedDownloader._get_pmc_id_from_pmid   96% 27 1 0   92% 12 1   95%
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% 25 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   93% 14 1 0   88% 8 1   91%
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% 30 0 0   90% 10 1   98%
src/local_deep_research/research_library/downloaders/semantic_scholar.py (no function)   100% 15 0 0   100% 0 0   100%
src/local_deep_research/research_library/extraction_catalog.py (no function)   100% 5 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 _offload_db   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py _offload_db._wrapped   100% 3 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   100% 6 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_llm_async   100% 14 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_llm_async._construct   100% 7 0 0   100% 2 0   100%
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._ainvoke_and_close   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._aclose_llm   100% 10 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._invoke_and_close   100% 3 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._close_llm   100% 4 0 0   100% 2 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   100% 11 0 0   100% 6 0   100%
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   100% 9 0 0   100% 4 0   100%
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   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_note_content   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._get_note   100% 4 0 0   100% 2 0   100%
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   100% 9 0 0   100% 2 0   100%
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   100% 18 0 0   100% 6 0   100%
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._change_summary_shortcut   100% 7 0 0   100% 6 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._build_change_summary_prompt   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.summarize_changes   100% 11 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.summarize_changes_sync   100% 11 0 0   100% 2 0   100%
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   100% 76 0 0   95% 42 2   98%
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   100% 44 0 0   88% 26 3   96%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.suggest_links   100% 10 0 0   100% 2 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.semantic_diff   100% 16 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService._fetch_notes_for_synthesis   100% 10 0 0   100% 4 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py NoteAIService.synthesize_notes   100% 31 0 0   100% 14 0   100%
src/local_deep_research/research_library/notes/services/note_ai_service.py (no function)   100% 82 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% 13 0 0   100% 4 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   82% 17 3 0   100% 2 0   84%
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   75% 8 2   92%
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/collection_rebuild.py document_fingerprint   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py collection_configuration   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py _index_state   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py _membership_state   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py rebuild_stage_prefix   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.__init__   93% 27 2 0   67% 6 2   88%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.prepare   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.write   94% 17 1 0   83% 6 1   91%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild._validate_sources   93% 15 1 0   92% 12 1   93%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild._validate_vectors   100% 8 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild._publish_rows   98% 41 1 0   90% 10 1   96%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.publish   100% 22 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild._check_cancelled   100% 2 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild._is_published   100% 5 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild._unlink   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.close   73% 15 4 0   75% 4 1   74%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.__enter__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py CollectionRebuild.__exit__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py remove_unfinished_rebuilds   100% 15 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/collection_rebuild.py (no function)   100% 40 0 2   100% 0 0   100%
src/local_deep_research/research_library/services/download_service.py RefillRank.viable   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/download_service.py _text_extraction_quality   100% 5 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/download_service.py _text_extraction_rank   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/download_service.py _arxiv_text_provenance   78% 9 2 0   83% 6 1   80%
src/local_deep_research/research_library/services/download_service.py _link_retry_to_canonical   100% 7 0 0   75% 4 1   91%
src/local_deep_research/research_library/services/download_service.py _has_reusable_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/download_service.py _client_safe_download_message   100% 1 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% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/download_service.py DownloadService._build_egress_context   50% 14 7 0   100% 2 0   56%
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% 15 0 0   100% 10 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   98% 43 1 0   96% 24 1   97%
src/local_deep_research/research_library/services/download_service.py DownloadService.queue_research_downloads.linked_to_another_resources_document   100% 1 0 0   100% 0 0   100%
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.refill_rank   100% 7 0 0   50% 2 1   89%
src/local_deep_research/research_library/services/download_service.py DownloadService._refilled_by_another_resource   100% 21 0 0   100% 14 0   100%
src/local_deep_research/research_library/services/download_service.py DownloadService._refilled_by_another_resource.rank_of   100% 4 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/download_service.py DownloadService.download_resource   100% 52 0 0   90% 20 2   97%
src/local_deep_research/research_library/services/download_service.py DownloadService._download_pdf   97% 270 7 0   92% 120 7   96%
src/local_deep_research/research_library/services/download_service.py DownloadService._extract_text_from_pdf   100% 76 0 0   94% 34 2   98%
src/local_deep_research/research_library/services/download_service.py DownloadService.download_as_text   97% 31 1 0   89% 18 2   94%
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% 9 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_arxiv_text_extraction   82% 56 10 0   90% 20 2   84%
src/local_deep_research/research_library/services/download_service.py DownloadService._load_cached_arxiv_pdf   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/download_service.py DownloadService._load_cached_pdf   92% 12 1 0   83% 6 1   89%
src/local_deep_research/research_library/services/download_service.py DownloadService._text_from_cached_pdf   100% 19 0 0   83% 6 1   96%
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   97% 30 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   99% 95 1 0   98% 42 1   99%
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% 91 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 _claim_document_snapshot   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _indexing_scope_error   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/library_rag_service.py resolve_collection_index_settings   100% 4 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 _get_collection_lock   100% 7 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/library_rag_service.py _hold_collection_lock   100% 14 0 0   100% 4 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__   89% 47 5 0   83% 6 1   89%
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_collection_configuration   100% 2 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   100% 6 0   100%
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   90% 52 5 0   86% 28 4   89%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._get_vector_index   52% 23 11 0   25% 4 1   48%
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% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._search_published   100% 11 0 0   100% 4 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% 7 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._embed_texts_cancellable   92% 13 1 0   90% 10 1   91%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._prepare_document   97% 31 1 0   90% 10 1   95%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._write_prepared_document   90% 73 7 0   87% 30 4   89%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_document   100% 5 0 0   100% 2 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   91% 131 12 0   94% 32 2   91%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_all_documents   100% 28 0 0   100% 16 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.remove_document_from_rag   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._remove_document_from_rag_locked   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_chunks_locked   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.purge_document_vectors   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._purge_document_vectors_locked   61% 28 11 0   75% 8 2   64%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._purge_document_vectors_locked._record   0% 1 1 0   100% 0 0   0%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._purge_document_vectors_locked._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% 25 0 0   100% 8 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.rebuild_collection   100% 15 0 0   100% 6 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_documents_parallel   89% 93 10 0   93% 46 3   91%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.index_documents_parallel._run_one   94% 17 1 0   90% 10 1   93%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.reconcile_collection_index   100% 39 0 0   88% 16 2   96%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService.has_indexed_documents   100% 8 0 0   100% 4 0   100%
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   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_rag_service.py LibraryRAGService._remove_documents_from_index_locked   84% 38 6 0   75% 16 4   81%
src/local_deep_research/research_library/services/library_rag_service.py (no function)   100% 123 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py _names_a_file   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py _tracker_describes_storage   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/library_service.py _missing_file_entry   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py _counts_as_downloaded   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py _sql_falsy   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py _fallback_resource_id   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py _display_resource_id   100% 2 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._remaining_content   100% 8 0 0   100% 6 0   100%
src/local_deep_research/research_library/services/library_service.py LibraryService._keep_text_report_missing_pdf   100% 5 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/library_service.py LibraryService._clear_missing_pdf   100% 6 0 0   100% 2 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   100% 1 0 0   100% 0 0   100%
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% 3 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   100% 35 0 0   88% 24 3   95%
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   95% 37 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   100% 1 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   96% 99 4 0   96% 52 2   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% 58 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% 8 0 0   100% 6 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py infer_storage_mode   100% 5 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py effective_storage_mode   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager.__init__   100% 7 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager._safe_path_in_root   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager._get_safe_file_path   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager.save_pdf   95% 22 1 0   88% 8 1   93%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager.load_pdf   100% 10 0 0   100% 4 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager.has_pdf   100% 10 0 0   100% 6 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager.pdf_exists   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager._infer_storage_mode   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/services/pdf_storage_manager.py PDFStorageManager._save_to_filesystem   100% 14 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% 13 0 0   100% 6 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   77% 22 5 0   83% 6 1   79%
src/local_deep_research/research_library/services/pdf_storage_manager.py (no function)   100% 36 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% 30 0 0   100% 8 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 _decode_ipv4_literal   100% 7 0 0   100% 2 0   100%
src/local_deep_research/research_library/utils/__init__.py _is_blocked_private_host   92% 24 2 0   100% 12 0   94%
src/local_deep_research/research_library/utils/__init__.py is_downloadable_domain   100% 23 0 0   100% 14 0   100%
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 resource_document_clause   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py document_awaits_pdf   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py document_awaits_pdf_clause   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py document_counts_as_downloaded   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py download_claim_is_live   80% 5 1 0   75% 4 1   78%
src/local_deep_research/research_library/utils/__init__.py find_tracker_by_url   100% 7 0 0   100% 4 0   100%
src/local_deep_research/research_library/utils/__init__.py find_tracker_for_document   100% 14 0 0   100% 12 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 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   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/utils/__init__.py _containment_base   100% 15 0 0   88% 8 1   96%
src/local_deep_research/research_library/utils/__init__.py _resolve_within_root   82% 11 2 0   50% 2 1   77%
src/local_deep_research/research_library/utils/__init__.py get_absolute_path_from_settings   100% 12 0 0   100% 6 0   100%
src/local_deep_research/research_library/utils/__init__.py get_containment_root_from_settings   75% 8 2 0   100% 2 0   80%
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% 51 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   100% 7 0 0   100% 2 0   100%
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   100% 1 0 0   100% 0 0   100%
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   100% 6 0 0   50% 2 1   88%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.__enter__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.__exit__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._request   97% 36 1 0   95% 20 1   96%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._library_version   100% 4 0 0   100% 0 0   100%
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   100% 7 0 0   100% 2 0   100%
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   100% 24 0 0   100% 12 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_collection_name   100% 6 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_top_item_versions   100% 34 0 0   93% 14 1   98%
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   100% 14 0 0   100% 4 0   100%
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   100% 15 0 0   100% 10 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.download_attachment   100% 23 0 0   100% 10 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._read_local_file   100% 15 0 0   100% 4 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient._fetch_file_unauthenticated   100% 15 0 0   100% 4 0   100%
src/local_deep_research/research_library/zotero/client.py ZoteroClient.get_attachment_fulltext   100% 14 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/client.py (no function)   100% 63 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py client_safe_zotero_message   60% 5 2 0   100% 0 0   60%
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   100% 13 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._make_client   100% 1 0 0   100% 0 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._resolve_library_id   100% 26 0 0   94% 16 1   98%
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   100% 15 0 0   100% 4 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.list_collections   100% 6 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService.list_groups   100% 6 0 0   100% 2 0   100%
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   100% 26 0 0   100% 8 0   100%
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   100% 142 0 0   96% 52 2   99%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._cleanup_removed_vectors   100% 23 0 0   75% 4 1   96%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._mark_failed   100% 10 0 0   50% 2 1   92%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._ensure_ldr_collection   100% 16 0 0   83% 6 1   95%
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   100% 10 0 0   88% 8 1   94%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._collect_annotations_text   100% 18 0 0   100% 6 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._safe_extract_text   100% 10 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._apply_metadata   100% 20 0 0   100% 12 0   100%
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   100% 10 0 0   88% 8 1   94%
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   100% 22 0 0   94% 16 1   97%
src/local_deep_research/research_library/zotero/sync_service.py ZoteroSyncService._filename_for   100% 10 0 0   100% 4 0   100%
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   100% 6 0 0   100% 2 0   100%
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   100% 20 0 0   93% 14 1   97%
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   100% 3 0 0   100% 2 0   100%
src/local_deep_research/research_library/zotero/sync_service.py (no function)   100% 101 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 _log_invalid_refresh_interval   100% 7 0 0   100% 2 0   100%
src/local_deep_research/scheduler/background.py _one_document_pass_per_user   100% 3 0 0   100% 0 0   100%
src/local_deep_research/scheduler/background.py _one_document_pass_per_user.run_unless_running   100% 8 0 0   100% 2 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% 8 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   94% 32 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   97% 59 2 0   95% 20 1   96%
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   96% 119 5 0   97% 32 1   96%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._reconcile_unindexed_documents   91% 79 7 0   86% 28 2   90%
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% 28 0 0   100% 10 0   100%
src/local_deep_research/scheduler/background.py BackgroundJobScheduler._check_subscription   92% 53 4 0   92% 12 1   92%
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% 93 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__   88% 74 9 2   81% 32 6   86%
src/local_deep_research/search_system.py AdvancedSearchSystem.close   77% 13 3 0   83% 6 1   79%
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   73% 15 4 0   38% 8 3   61%
src/local_deep_research/search_system.py AdvancedSearchSystem.analyze_topic   69% 29 9 0   67% 12 4   68%
src/local_deep_research/search_system.py AdvancedSearchSystem._arm_egress_backstop   78% 18 4 0   100% 4 0   82%
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% 28 0 0   100% 0 0   100%
src/local_deep_research/security/account_lockout.py AccountLockoutManager.__init__   100% 9 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._drop_expired   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/account_lockout.py AccountLockoutManager.record_failure   100% 19 0 0   100% 8 0   100%
src/local_deep_research/security/account_lockout.py AccountLockoutManager.record_success   100% 5 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% 15 0 0   100% 0 0   100%
src/local_deep_research/security/client_safe_errors.py client_safe_download_message   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/client_safe_errors.py (no function)   100% 3 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% 12 0 0   100% 6 0   100%
src/local_deep_research/security/data_sanitizer.py (no function)   100% 32 0 0   100% 0 0   100%
src/local_deep_research/security/directory_creation.py create_directory   100% 15 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% 18 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% 42 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   64% 14 5   75%
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 _destination_address   100% 9 0 0   100% 2 0   100%
src/local_deep_research/security/egress/policy.py _is_ambiguous_fake_ip   100% 5 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   88% 41 5 2   90% 30 3   89%
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% 18 0 0   100% 14 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 _urllib3_reads_same_host   67% 6 2 0   100% 0 0   67%
src/local_deep_research/security/egress/policy.py _classify_engine_url   90% 61 6 0   90% 42 2   90%
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   92% 48 4 3   100% 32 0   95%
src/local_deep_research/security/egress/policy.py _unrecorded_denial   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py host_not_classified_public   69% 13 4 0   100% 4 0   76%
src/local_deep_research/security/egress/policy.py _policy_host   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py url_host_is_declared_local   67% 9 3 0   75% 4 1   69%
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% 9 0 0   100% 6 0   100%
src/local_deep_research/security/egress/policy.py build_run_egress_context   100% 8 0 0   100% 2 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 coerce_policy_bool   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/egress/policy.py (no function)   100% 116 0 0   100% 0 0   100%
src/local_deep_research/security/egress/run_classification.py engine_label   100% 19 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   89% 18 2 0   90% 10 1   89%
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 resolve_engine_allow_private_result_fetch   71% 7 2 0   100% 2 0   78%
src/local_deep_research/security/egress/validators.py resolve_searxng_allow_private_result_fetch   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% 37 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% 34 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% 12 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% 25 0 0   100% 0 0   100%
src/local_deep_research/security/file_write_verifier.py _open_nofollow   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/file_write_verifier.py _open_nofollow_with_permissions   100% 10 0 0   50% 2 1   92%
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   95% 21 1 0   88% 8 1   93%
src/local_deep_research/security/file_write_verifier.py write_file_verified.private_opener   100% 1 0 0   100% 0 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% 14 0 0   100% 0 0   100%
src/local_deep_research/security/filename_sanitizer.py sanitize_filename   100% 36 0 0   96% 24 1   98%
src/local_deep_research/security/filename_sanitizer.py (no function)   100% 7 0 0   100% 0 0   100%
src/local_deep_research/security/ip_ranges.py (no function)   100% 4 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 raw_authority_host   100% 16 0 0   100% 10 0   100%
src/local_deep_research/security/legacy_ipv4.py has_percent_encoded_numeric_ipv4_authority   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/legacy_ipv4.py has_percent_escape_in_authority_host   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/legacy_ipv4.py _decode_percent_escapes   100% 9 0 0   100% 4 0   100%
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% 14 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   0% 1 1 0   100% 0 0   0%
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% 7 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _restore_query_wrapper   100% 6 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _query_needs_credential_guards   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_url_query_strings   98% 56 1 0   94% 34 2   97%
src/local_deep_research/security/log_sanitizer.py _scrub_to_fixed_point   100% 6 0 0   75% 4 1   90%
src/local_deep_research/security/log_sanitizer.py sanitize_error_message   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _sanitize_error_message_once   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _glued_offsets   100% 14 0 0   100% 6 0   100%
src/local_deep_research/security/log_sanitizer.py _log_patcher_spans   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _log_patcher_spans.span   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _fit_around_credentials   100% 16 0 0   100% 10 0   100%
src/local_deep_research/security/log_sanitizer.py _cover_cut_credentials   100% 12 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py _cover_query_cut_credentials   100% 16 0 0   100% 10 0   100%
src/local_deep_research/security/log_sanitizer.py _cover_query_cut_credentials.preserved_in_original   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _reveals_log_patcher_name   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _extend_over_split_credential   100% 34 0 0   100% 16 0   100%
src/local_deep_research/security/log_sanitizer.py _extend_over_split_credential.to_glued   80% 5 1 0   50% 2 1   71%
src/local_deep_research/security/log_sanitizer.py _extend_over_split_credential.to_text_end   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _extend_over_split_credential.runs_on   100% 7 0 0   83% 6 1   92%
src/local_deep_research/security/log_sanitizer.py _splice_across_controls   97% 36 1 0   95% 20 1   96%
src/local_deep_research/security/log_sanitizer.py _splice_across_controls.to_text   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _scrub_across_controls   100% 11 0 0   100% 6 0   100%
src/local_deep_research/security/log_sanitizer.py _scrub_across_controls.apply   100% 6 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _scrub_across_controls.query_matches   100% 2 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _literal_matches   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py scrub_error   100% 16 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py scrub_error.scrub_once   100% 7 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py sanitize_error_for_client   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py sanitize_error_for_agent   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py failure_reason_for_log   100% 7 0 0   100% 6 0   100%
src/local_deep_research/security/log_sanitizer.py sanitize_error_details   100% 13 0 0   100% 10 0   100%
src/local_deep_research/security/log_sanitizer.py _spread_quoted_value   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _space_before_closing   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _start_order_replacement_parts   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_start_order_match   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _first_pass_replacement_parts   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _join_replacement_parts   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_first_pass_match   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py redact_sensitive_assignments   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_sensitive_assignments_once   75% 4 1 0   50% 2 1   67%
src/local_deep_research/security/log_sanitizer.py _truncate_for_log_redaction   100% 9 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py log_length_before_truncation   71% 7 2 0   100% 2 0   78%
src/local_deep_research/security/log_sanitizer.py redact_log_message   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _template_parts   89% 9 1 0   88% 8 1   88%
src/local_deep_research/security/log_sanitizer.py _step   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _without_name_boundary   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _log_patcher_bare_passes   100% 11 0 0   100% 10 0   100%
src/local_deep_research/security/log_sanitizer.py _run_steps   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _substitute_tracked   96% 23 1 0   90% 10 1   94%
src/local_deep_research/security/log_sanitizer.py _strip_control_chars_tracked   100% 12 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_bounded_log_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_log_text   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _has_name_assignment_hint   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _result_without_name_assignments   91% 11 1 0   88% 8 1   89%
src/local_deep_research/security/log_sanitizer.py _redact_by_pipelines   100% 10 0 0   100% 6 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun.__init__   100% 8 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun.shaped   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun._cached   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun._substitute   100% 11 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun._collect_credential_spans   95% 20 1 0   83% 12 2   91%
src/local_deep_research/security/log_sanitizer.py _PipelineRun._run   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun.first_pass   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _PipelineRun.result   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _pipeline_credential_spans   100% 26 0 0   100% 12 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_log_text_union   100% 28 0 0   100% 20 0   100%
src/local_deep_research/security/log_sanitizer.py _type_is_one_of   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _followers_pattern   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _cuts_a_value   100% 6 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _redacted_value   100% 11 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_slash_dsn   80% 5 1 0   75% 4 1   78%
src/local_deep_research/security/log_sanitizer.py _redact_api_key_header   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_credential_param   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_quoted_key   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_additional_shapes   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_log_record_text   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py redact_for_log   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py bounded_redaction_chars   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py redact_head_for_log   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py redact_and_bound_for_log   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _is_sensitive_log_key   100% 5 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _is_structural_extra_key   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _is_empty_log_value   67% 3 1 0   50% 2 1   60%
src/local_deep_research/security/log_sanitizer.py _scrub_log_key   86% 14 2 0   67% 6 2   80%
src/local_deep_research/security/log_sanitizer.py _unique_log_key   86% 7 1 0   75% 4 1   82%
src/local_deep_research/security/log_sanitizer.py _scrub_log_bytes   91% 11 1 0   83% 6 1   88%
src/local_deep_research/security/log_sanitizer.py _scrub_log_leaf   95% 22 1 0   94% 16 1   95%
src/local_deep_research/security/log_sanitizer.py redact_log_extra   92% 13 1 0   88% 8 1   90%
src/local_deep_research/security/log_sanitizer.py _unprintable_placeholder   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _safe_log_str   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _exact_str   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _plain_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _redact_exception_text   100% 11 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _rendered_exception_notes   79% 14 3 0   83% 6 1   80%
src/local_deep_research/security/log_sanitizer.py _once_per_phase   100% 3 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _once_per_phase.memoized   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _decision_phase   100% 4 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _is_builtin_class   60% 5 2 0   100% 0 0   60%
src/local_deep_research/security/log_sanitizer.py _type_name   60% 5 2 0   100% 0 0   60%
src/local_deep_research/security/log_sanitizer.py _redact_name_text   67% 3 1 0   50% 2 1   60%
src/local_deep_research/security/log_sanitizer.py _redact_short_name   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py type_name_for_log   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _rendered_block   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _syntax_error_header_text   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _rendered_header_tails   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/log_sanitizer.py _named_text   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _type_header_changed   90% 10 1 0   88% 8 1   89%
src/local_deep_research/security/log_sanitizer.py _rendered_type_prefixes   89% 9 1 0   75% 4 1   85%
src/local_deep_research/security/log_sanitizer.py _notes_fitting_header   88% 17 2 0   70% 10 3   81%
src/local_deep_research/security/log_sanitizer.py _record_type_is_safe   69% 13 4 0   67% 6 2   68%
src/local_deep_research/security/log_sanitizer.py _type_names_are_clean   80% 5 1 0   75% 4 1   78%
src/local_deep_research/security/log_sanitizer.py _pickled_by_reference_runs_no_code   79% 14 3 0   70% 10 3   75%
src/local_deep_research/security/log_sanitizer.py _has_registered_reducer   68% 19 6 0   72% 18 3   70%
src/local_deep_research/security/log_sanitizer.py _pickle_lookup_runs_no_code   88% 26 3 0   86% 22 3   88%
src/local_deep_research/security/log_sanitizer.py _module_spec_read_is_plain   45% 11 6 0   40% 10 2   43%
src/local_deep_research/security/log_sanitizer.py _sys_modules_names_are_plain   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _module_import_runs_no_code   84% 25 4 0   82% 22 4   83%
src/local_deep_research/security/log_sanitizer.py _picklable_extra   67% 9 3 0   75% 4 1   69%
src/local_deep_research/security/log_sanitizer.py _is_plain_data   94% 18 1 0   92% 12 1   93%
src/local_deep_research/security/log_sanitizer.py _complex_pickles_as_stock   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _pickles   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _is_stable_text_value   100% 6 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _plain_names   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _plain_metaclass_is_builtin   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _metaclass_is_inert   92% 13 1 0   92% 12 1   92%
src/local_deep_research/security/log_sanitizer.py _group_args_are_its_members   80% 10 2 0   67% 6 2   75%
src/local_deep_research/security/log_sanitizer.py _exception_text_is_stable   92% 26 2 0   93% 28 2   93%
src/local_deep_research/security/log_sanitizer.py _rendered_fields   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/log_sanitizer.py _exception_class_is_stable   100% 10 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py _syntax_error_fields_out_of_range   100% 8 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py _syntax_error_renders_bounded   100% 19 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py _syntax_error_location_block   100% 6 0 0   100% 4 0   100%
src/local_deep_research/security/log_sanitizer.py _syntax_error_details_changed   89% 27 3 0   86% 22 3   88%
src/local_deep_research/security/log_sanitizer.py redact_log_exception   94% 32 2 0   81% 16 3   90%
src/local_deep_research/security/log_sanitizer.py _replace_record_exception   80% 5 1 0   75% 4 1   78%
src/local_deep_research/security/log_sanitizer.py _exception_redaction_failed   82% 11 2 0   100% 2 0   85%
src/local_deep_research/security/log_sanitizer.py _plan_redacted_exception   92% 59 5 0   95% 20 1   92%
src/local_deep_research/security/log_sanitizer.py _build_redacted_exception   100% 16 0 0   100% 8 0   100%
src/local_deep_research/security/log_sanitizer.py _exact_note_texts   78% 9 2 0   67% 6 2   73%
src/local_deep_research/security/log_sanitizer.py _node_is_kept_as_planned   82% 40 7 0   84% 32 5   83%
src/local_deep_research/security/log_sanitizer.py _rebuilt_exception   91% 23 2 0   100% 10 0   94%
src/local_deep_research/security/log_sanitizer.py redact_log_record   90% 20 2 0   100% 6 0   92%
src/local_deep_research/security/log_sanitizer.py _structural_extra_only   50% 4 2 0   100% 0 0   50%
src/local_deep_research/security/log_sanitizer.py (no function)   100% 298 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_ipv6_transition_address   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/network_utils.py is_private_peer_ip   100% 12 0 0   100% 6 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% 5 0 0   100% 0 0   100%
src/local_deep_research/security/notification_destination.py NotificationDestinationError.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/notification_destination.py NotificationDestinationError.__str__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/notification_destination.py normalize_host_for_transport   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/notification_destination.py normalize_host_for_transport.unescape   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/notification_destination.py _required_host   83% 18 3 0   88% 8 1   85%
src/local_deep_research/security/notification_destination.py _plugin_host   71% 7 2 0   100% 2 0   78%
src/local_deep_research/security/notification_destination.py parse_apprise_query   95% 19 1 0   90% 10 1   93%
src/local_deep_research/security/notification_destination.py _query_value   83% 6 1 0   75% 4 1   80%
src/local_deep_research/security/notification_destination.py _apprise_host   80% 5 1 0   75% 4 1   78%
src/local_deep_research/security/notification_destination.py _confirm_apprise_ipv6_host   88% 26 3 0   90% 10 1   89%
src/local_deep_research/security/notification_destination.py _apprise_ntfy_destination   83% 23 4 0   83% 12 2   83%
src/local_deep_research/security/notification_destination.py _apprise_matrix_details   83% 6 1 0   50% 2 1   75%
src/local_deep_research/security/notification_destination.py _email_template_smtp_hosts   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/notification_destination.py _apprise_mail_host   88% 17 2 0   67% 6 2   83%
src/local_deep_research/security/notification_destination.py _smtp_override_host   58% 12 5 0   50% 6 3   56%
src/local_deep_research/security/notification_destination.py parse_notification_destination   95% 42 2 0   92% 26 2   94%
src/local_deep_research/security/notification_destination.py (no function)   100% 32 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py _strip_notification_url_delimiters   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/notification_validator.py _is_ipv6_literal   100% 5 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py _decode_bracket_escapes   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py _has_label_separator   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py _strip_trailing_host_dots   100% 10 0 0   100% 6 0   100%
src/local_deep_research/security/notification_validator.py _authority_end   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/notification_validator.py _strip_fragment_host_dots   100% 13 0 0   100% 6 0   100%
src/local_deep_research/security/notification_validator.py _strip_fragment_userinfo   100% 6 0 0   100% 2 0   100%
src/local_deep_research/security/notification_validator.py _is_ipv6_url_fragment   100% 11 0 0   100% 6 0   100%
src/local_deep_research/security/notification_validator.py _names_legacy_numeric_host   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/notification_validator.py _matches_scheme_less_url_shape   100% 8 0 0   100% 6 0   100%
src/local_deep_research/security/notification_validator.py _is_scheme_less_url_fragment   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/notification_validator.py parse_notification_url_list   100% 19 0 0   100% 18 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   0% 5 5 0   100% 0 0   0%
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   94% 90 5 0   96% 48 2   95%
src/local_deep_research/security/notification_validator.py NotificationURLValidator._compute_hint   75% 4 1 0   50% 2 1   67%
src/local_deep_research/security/notification_validator.py NotificationURLValidator.validate_service_url_with_hint   100% 34 0 0   100% 16 0   100%
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% 15 0 0   100% 12 0   100%
src/local_deep_research/security/notification_validator.py (no function)   100% 79 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 resolve_allow_missing   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/path_validator.py _resolve_allow_missing_fallback   93% 15 1 0   75% 4 1   89%
src/local_deep_research/security/path_validator.py PathValidator.validate_safe_path   79% 38 8 0   100% 14 0   85%
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% 35 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py _BodyGuard.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py _BodyGuard.limit   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _BodyGuard.count   100% 10 0 0   83% 6 1   94%
src/local_deep_research/security/safe_requests.py _is_plain_method   100% 2 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py _size_guarded_class   100% 9 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _size_guarded_class.SizeGuarded.read   100% 7 0 0   100% 4 0   100%
src/local_deep_research/security/safe_requests.py _size_guarded_class.SizeGuarded.read_chunked   100% 7 0 0   100% 6 0   100%
src/local_deep_research/security/safe_requests.py _class_guard_list   83% 24 4 0   80% 10 2   82%
src/local_deep_research/security/safe_requests.py _wrap_instance_reads   100% 8 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _wrap_instance_reads.bounded_read   100% 3 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py _wrap_instance_reads.bounded_read_chunked   0% 3 3 0   0% 2 0   0%
src/local_deep_research/security/safe_requests.py _install_body_guard   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/safe_requests.py _check_response_size   100% 25 0 0   100% 10 0   100%
src/local_deep_research/security/safe_requests.py _finish_response   100% 8 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _discard_redirect_body   100% 5 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _discard_redirect_body_hook   100% 2 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py _with_redirect_body_hook   100% 8 0 0   75% 4 1   92%
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% 54 0 0   96% 24 1   99%
src/local_deep_research/security/safe_requests.py safe_post   96% 55 2 0   95% 20 1   96%
src/local_deep_research/security/safe_requests.py SafeSession.__init__   100% 9 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py SafeSession._preparing_next_only   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/safe_requests.py SafeSession.resolve_redirects   100% 7 0 0   100% 2 0   100%
src/local_deep_research/security/safe_requests.py SafeSession.rebuild_auth   100% 10 0 0   100% 8 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% 37 0 0   95% 22 1   98%
src/local_deep_research/security/safe_requests.py _parse_retry_after   100% 15 0 0   100% 4 0   100%
src/local_deep_research/security/safe_requests.py safe_get_with_retries   100% 35 0 0   100% 10 0   100%
src/local_deep_research/security/safe_requests.py (no function)   100% 60 0 2   100% 0 0   100%
src/local_deep_research/security/secure_logging.py log_exception_type   100% 1 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% 13 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% 40 0 0   100% 30 0   100%
src/local_deep_research/security/ssrf_validator.py validate_url   91% 67 6 0   90% 30 3   91%
src/local_deep_research/security/ssrf_validator.py assert_base_url_safe   100% 10 0 0   100% 4 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 _split_raw_authority   100% 7 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py _raw_authority_has_userinfo   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py _raw_after_authority   100% 1 0 0   100% 0 0   100%
src/local_deep_research/security/ssrf_validator.py authority_may_be_userinfo   100% 13 0 0   100% 6 0   100%
src/local_deep_research/security/ssrf_validator.py redact_url_for_log   95% 21 1 0   90% 10 1   94%
src/local_deep_research/security/ssrf_validator.py url_authority_without_userinfo   100% 16 0 0   100% 8 0   100%
src/local_deep_research/security/ssrf_validator.py (no function)   100% 37 0 0   100% 0 0   100%
src/local_deep_research/security/toml_limits.py _has_overlong_key   100% 10 0 0   100% 8 0   100%
src/local_deep_research/security/toml_limits.py check_toml_size   100% 2 0 0   100% 2 0   100%
src/local_deep_research/security/toml_limits.py loads_toml_within_limits   100% 8 0 0   100% 4 0   100%
src/local_deep_research/security/toml_limits.py (no function)   100% 13 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_redaction.py _name_variants   100% 14 0 0   100% 8 0   100%
src/local_deep_research/security/url_redaction.py _words_name_a_credential   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/url_redaction.py _is_credential_name_part   75% 4 1 0   50% 2 1   67%
src/local_deep_research/security/url_redaction.py is_credential_param_name   100% 3 0 0   100% 2 0   100%
src/local_deep_research/security/url_redaction.py _redact_param_list   100% 14 0 0   100% 10 0   100%
src/local_deep_research/security/url_redaction.py _redact_path   100% 9 0 0   100% 6 0   100%
src/local_deep_research/security/url_redaction.py _drop_schemeless_userinfo   100% 4 0 0   100% 2 0   100%
src/local_deep_research/security/url_redaction.py _authority_is_well_formed   79% 14 3 0   70% 10 3   75%
src/local_deep_research/security/url_redaction.py redact_url_credentials   100% 22 0 0   100% 14 0   100%
src/local_deep_research/security/url_redaction.py (no function)   100% 30 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.is_safe_http_link   100% 10 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% 33 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% 3 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% 8 0 0   100% 6 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% 8 0 0   100% 6 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% 5 0 0   100% 0 0   100%
src/local_deep_research/settings/env_settings.py IntegerSetting._convert_value   100% 24 0 0   100% 14 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   92% 25 2 0   86% 14 2   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% 11 0 0   100% 4 0   100%
src/local_deep_research/settings/env_settings.py SettingsRegistry.get_strict   100% 16 0 0   100% 6 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% 51 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py SettingsValueError.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/settings/exceptions.py SettingsValueError.diagnostic   100% 1 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__   83% 6 1 0   75% 4 1   80%
src/local_deep_research/settings/exceptions.py (no function)   100% 17 0 0   100% 0 0   100%
src/local_deep_research/settings/logger.py log_settings   100% 26 0 0   94% 16 1   98%
src/local_deep_research/settings/logger.py _looks_like_url   100% 4 0 0   100% 2 0   100%
src/local_deep_research/settings/logger.py _redact_url_values   88% 8 1 0   83% 6 1   86%
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% 28 0 0   100% 8 0   100%
src/local_deep_research/settings/manager.py is_operator_only_setting   100% 6 0 0   100% 4 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% 8 0 0   100% 6 0   100%
src/local_deep_research/settings/manager.py _parse_json_value   100% 8 0 0   100% 4 0   100%
src/local_deep_research/settings/manager.py _parse_multiselect   100% 13 0 0   100% 10 0   100%
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   79% 39 8 0   73% 30 4   77%
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 _policy_audit_allowed_values   88% 8 1 0   83% 6 1   86%
src/local_deep_research/settings/manager.py _policy_audit_value   89% 9 1 0   88% 8 1   88%
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 _reject_json_constant   100% 1 0 0   100% 0 0   100%
src/local_deep_research/settings/manager.py _parse_environment_boolean   100% 6 0 0   100% 4 0   100%
src/local_deep_research/settings/manager.py get_typed_setting_value   100% 26 0 0   100% 12 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   93% 28 2 0   88% 16 2   91%
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   100% 11 0 0   100% 4 0   100%
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% 11 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   100% 31 0 0   100% 18 0   100%
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   94% 77 5 0   90% 48 5   92%
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   100% 31 0 0   100% 20 0   100%
src/local_deep_research/settings/manager.py SettingsManager.get_settings_snapshot   90% 10 1 0   83% 6 1   88%
src/local_deep_research/settings/manager.py SettingsManager.create_or_update_setting   97% 59 2 0   93% 30 2   96%
src/local_deep_research/settings/manager.py SettingsManager.delete_setting   100% 20 0 0   90% 10 1   97%
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   71% 14 4 0   100% 4 0   78%
src/local_deep_research/settings/manager.py SettingsManager.import_settings   100% 72 0 0   97% 38 1   99%
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   92% 24 2 0   80% 10 2   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% 84 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% 9 0 0   100% 2 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% 15 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._contained_path   100% 9 0 0   100% 2 0   100%
src/local_deep_research/storage/file.py FileReportStorage._get_report_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/storage/file.py FileReportStorage._get_metadata_path   100% 1 0 0   100% 0 0   100%
src/local_deep_research/storage/file.py FileReportStorage.save_report   100% 12 0 0   100% 2 0   100%
src/local_deep_research/storage/file.py FileReportStorage.get_report   100% 9 0 0   100% 2 0   100%
src/local_deep_research/storage/file.py FileReportStorage.get_report_with_metadata   79% 14 3 0   100% 4 0   83%
src/local_deep_research/storage/file.py FileReportStorage.list_reports   100% 11 0 0   100% 2 0   100%
src/local_deep_research/storage/file.py FileReportStorage._load_metadata   100% 9 0 0   100% 2 0   100%
src/local_deep_research/storage/file.py FileReportStorage.delete_report   100% 13 0 0   100% 4 0   100%
src/local_deep_research/storage/file.py FileReportStorage.report_exists   100% 1 0 0   100% 0 0   100%
src/local_deep_research/storage/file.py (no function)   100% 18 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 _parentheses_are_balanced   100% 9 0 0   100% 8 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _destination_is_refused   100% 9 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _authority_head_has_userinfo   100% 3 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _spells_hidden_userinfo   100% 14 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _safe_link_destination   94% 17 1 0   92% 12 1   93%
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 strip_appended_sources_sentinel   100% 6 0 0   100% 4 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 _escape_latex_text   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   83% 6 1   93%
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   96% 26 1 0   95% 20 1   96%
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   100% 15 0 0   100% 10 0   100%
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   67% 6 2 0   100% 2 0   75%
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   96% 23 1 0   100% 10 0   97%
src/local_deep_research/text_optimization/citation_formatter.py _defuse_quarto_cells   100% 6 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _reference_is_hazardous   91% 11 1 0   83% 6 1   88%
src/local_deep_research/text_optimization/citation_formatter.py _break_entities   100% 19 0 0   100% 10 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _defuse_quarto_text   100% 4 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _defuse_quarto_body   100% 5 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _quarto_title_markdown   100% 2 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _yaml_double_quote   100% 2 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _yaml_double_quote._escape   77% 13 3 0   70% 10 3   74%
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% 18 0 0   100% 4 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% 18 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _ris_flatten   100% 1 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _ris_readings   100% 18 0 0   100% 12 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _ris_spells_userinfo   100% 10 0 0   100% 8 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _safe_ris_url   91% 23 2 0   86% 14 2   89%
src/local_deep_research/text_optimization/citation_formatter.py _ris_field_text   100% 3 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _ris_value_starts_userinfo   94% 16 1 0   92% 12 1   93%
src/local_deep_research/text_optimization/citation_formatter.py _ris_multiline_line_carries_userinfo   93% 43 3 0   89% 28 3   92%
src/local_deep_research/text_optimization/citation_formatter.py _ris_multiline_line_carries_userinfo.common_edge   100% 5 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _ris_line_carries_userinfo   100% 12 0 0   100% 6 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _cut_title_clause   100% 9 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% 48 0 0   96% 28 1   99%
src/local_deep_research/text_optimization/citation_formatter.py RISExporter._create_ris_entry   98% 87 2 0   100% 44 0   98%
src/local_deep_research/text_optimization/citation_formatter.py RISExporter._create_ris_entry.cut_is_safe   100% 4 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _escape_latex_body_text   100% 1 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _split_math_segments   100% 61 0 0   100% 30 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _math_span_is_safe   95% 38 2 0   93% 28 2   94%
src/local_deep_research/text_optimization/citation_formatter.py _escape_markdown_math_span   100% 1 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _defuse_report_math_for_quarto   100% 6 0 0   100% 4 0   100%
src/local_deep_research/text_optimization/citation_formatter.py _link_destination_ends   100% 11 0 0   100% 8 0   100%
src/local_deep_research/text_optimization/citation_formatter.py LaTeXExporter.__init__   100% 4 0 0   100% 0 0   100%
src/local_deep_research/text_optimization/citation_formatter.py LaTeXExporter.export_to_latex   100% 30 0 0   100% 14 0   100%
src/local_deep_research/text_optimization/citation_formatter.py LaTeXExporter.export_to_latex.cite_group   100% 4 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py LaTeXExporter._sources_entries   100% 4 0 0   100% 2 0   100%
src/local_deep_research/text_optimization/citation_formatter.py LaTeXExporter._unlink_citations   100% 32 0 0   100% 20 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% 1 0 0   100% 0 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% 17 0 0   100% 6 0   100%
src/local_deep_research/text_optimization/citation_formatter.py (no function)   100% 158 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/arxiv.py _normalize_http_hostname   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/arxiv.py _normalized_http_hostname   100% 7 0 0   100% 2 0   100%
src/local_deep_research/utilities/arxiv.py is_arxiv_family_url   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/arxiv.py is_ar5iv_url   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/arxiv.py is_arxiv_paper_url   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/arxiv.py extract_arxiv_id   100% 17 0 0   100% 8 0   100%
src/local_deep_research/utilities/arxiv.py (no function)   100% 15 0 0   100% 0 0   100%
src/local_deep_research/utilities/arxiv_api.py ArxivPaper.authors   100% 1 0 0   0% 2 2   33%
src/local_deep_research/utilities/arxiv_api.py ArxivPaper.pdf_url   100% 1 0 0   50% 2 1   67%
src/local_deep_research/utilities/arxiv_api.py _Readable.read   100% 1 0 0   50% 2 1   67%
src/local_deep_research/utilities/arxiv_api.py _ItemSource.items   100% 1 0 0   50% 2 1   67%
src/local_deep_research/utilities/arxiv_api.py arxiv_api_request_gate   100% 8 0 0   100% 4 0   100%
src/local_deep_research/utilities/arxiv_api.py _GatedArxivSession.get   60% 10 4 0   25% 4 1   50%
src/local_deep_research/utilities/arxiv_api.py _policy_arxiv_client   100% 8 0 0   100% 2 0   100%
src/local_deep_research/utilities/arxiv_api.py _install_gated_session   100% 7 0 0   100% 2 0   100%
src/local_deep_research/utilities/arxiv_api.py _strip_optional   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/arxiv_api.py _strip_feed_text   100% 9 0 0   100% 2 0   100%
src/local_deep_research/utilities/arxiv_api.py fetch_arxiv_results   82% 11 2 0   75% 4 1   80%
src/local_deep_research/utilities/arxiv_api.py (no function)   100% 67 0 3   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 _with_scheme_for_arxiv_host   93% 14 1 0   88% 8 1   91%
src/local_deep_research/utilities/citation_normalizer.py _extract_arxiv_id   100% 5 0 0   100% 2 0   100%
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% 23 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/download_url.py normalize_url_for_hash   100% 15 0 0   100% 2 0   100%
src/local_deep_research/utilities/download_url.py get_url_hash   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/download_url.py _legacy_normalize_download_service   90% 10 1 0   75% 4 1   86%
src/local_deep_research/utilities/download_url.py _legacy_normalize_library_service   83% 6 1 0   50% 2 1   75%
src/local_deep_research/utilities/download_url.py get_legacy_url_hashes   92% 12 1 0   67% 6 2   83%
src/local_deep_research/utilities/download_url.py get_url_hash_candidates   100% 6 0 0   100% 4 0   100%
src/local_deep_research/utilities/download_url.py (no function)   100% 9 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 short_id   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/formatting.py (no function)   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/host_match.py http_authority_host   100% 8 0 0   100% 2 0   100%
src/local_deep_research/utilities/host_match.py is_host_or_subdomain   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/host_match.py (no function)   100% 3 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   100% 13 0 0   92% 12 1   96%
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 invoke_llm_sync   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/llm_utils.py ainvoke_llm   100% 1 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% 16 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% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/log_utils.py _truncation_suffix   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/log_utils.py _exception_context   90% 42 4 0   81% 26 5   87%
src/local_deep_research/utilities/log_utils.py _truncate_for_frontend   100% 3 0 0   100% 2 0   100%
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 _sanitize_record   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/log_utils.py install_log_redaction   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/log_utils.py config_logger   100% 18 0 0   100% 6 0   100%
src/local_deep_research/utilities/log_utils.py (no function)   100% 53 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/metric_write_health.py MetricWriteHealth.__init__   100% 5 0 0   100% 2 0   100%
src/local_deep_research/utilities/metric_write_health.py MetricWriteHealth.record   100% 10 0 0   100% 6 0   100%
src/local_deep_research/utilities/metric_write_health.py MetricWriteHealth.snapshot   100% 5 0 0   100% 2 0   100%
src/local_deep_research/utilities/metric_write_health.py record_metric_write_drop   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/metric_write_health.py get_metric_write_health   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/metric_write_health.py (no function)   100% 16 0 0   100% 0 0   100%
src/local_deep_research/utilities/office_conversion.py _normalized_ext   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/office_conversion.py _kill_process_group   100% 3 0 2   100% 0 0   100%
src/local_deep_research/utilities/office_conversion.py convert_legacy_office_bytes   87% 52 7 0   83% 18 3   86%
src/local_deep_research/utilities/office_conversion.py is_legacy_office_extension   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/office_conversion.py converted_extension   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/office_conversion.py (no function)   100% 22 0 0   100% 0 0   100%
src/local_deep_research/utilities/openalex_enrichment.py normalize_openalex_api_key   100% 18 0 0   100% 10 0   100%
src/local_deep_research/utilities/openalex_enrichment.py bounded_error_body   100% 7 0 0   100% 6 0   100%
src/local_deep_research/utilities/openalex_enrichment.py send_with_key_fallback   100% 14 0 0   100% 6 0   100%
src/local_deep_research/utilities/openalex_enrichment.py send_with_key_fallback._drop_and_resend_keyless   100% 5 0 0   75% 4 1   89%
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% 59 1 0   96% 28 1   98%
src/local_deep_research/utilities/openalex_enrichment.py enrich_results_with_source_ids._drop_rejected_key   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/openalex_enrichment.py enrich_results_with_source_ids._send   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/openalex_enrichment.py (no function)   100% 16 0 0   100% 0 0   100%
src/local_deep_research/utilities/pandoc_conversion.py _kill_process_group   100% 3 0 2   100% 0 0   100%
src/local_deep_research/utilities/pandoc_conversion.py _normalized_ext   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/pandoc_conversion.py is_pandoc_backed_extension   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/pandoc_conversion.py resolve_pandoc_binary   100% 8 0 0   50% 2 1   90%
src/local_deep_research/utilities/pandoc_conversion.py _probe_rts_heap_cap   100% 5 0 0   100% 0 0   100%
src/local_deep_research/utilities/pandoc_conversion.py _pandoc_accepts_rts_heap_cap   100% 9 0 0   100% 4 0   100%
src/local_deep_research/utilities/pandoc_conversion.py _set_address_space_limit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/pandoc_conversion.py _memory_cap   71% 7 2 0   75% 4 1   73%
src/local_deep_research/utilities/pandoc_conversion.py pandoc_convert_bytes_to_html   90% 49 5 0   94% 16 1   91%
src/local_deep_research/utilities/pandoc_conversion.py (no function)   100% 38 0 2   100% 0 0   100%
src/local_deep_research/utilities/pdf_extraction_limits.py (no function)   100% 5 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_page_walk.py iter_pdfplumber_pages   89% 19 2 0   100% 2 0   90%
src/local_deep_research/utilities/pdf_page_walk.py (no function)   100% 3 0 2   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _resident_bytes   45% 11 6 0   50% 2 1   46%
src/local_deep_research/utilities/pdf_stream_release.py _measured   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _font_tables   100% 12 0 0   100% 8 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _cached_value   92% 12 1 0   83% 6 1   89%
src/local_deep_research/utilities/pdf_stream_release.py _parser_input_bytes   85% 48 7 0   79% 24 3   83%
src/local_deep_research/utilities/pdf_stream_release.py _parser_input_bytes.decoded   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _parser_input_bytes.resolved   40% 5 3 0   100% 0 0   40%
src/local_deep_research/utilities/pdf_stream_release.py _log_disabled   100% 7 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _limit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _sole_holder_refcount   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _count_elements   100% 30 0 0   100% 22 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _is_objstm_entry   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _require_container   100% 2 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _Pending.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py _collect_at_walk_end   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser.__init__   100% 27 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._count_fonts   88% 16 2 0   67% 6 2   82%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._count_fonts.get_font   100% 14 0 0   75% 4 1   94%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._font_built   82% 38 7 0   86% 14 2   83%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._let_go_of_tables   100% 25 0 0   92% 12 1   97%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._font_parsed   92% 37 3 0   92% 24 2   92%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._grown   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._may_collect   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._collect   100% 12 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._collect_if_due   50% 2 1 0   50% 2 1   50%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._parts   100% 7 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser.before_page   100% 13 0 0   100% 4 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._estimate   100% 26 0 0   100% 18 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser.after_page   100% 43 0 0   100% 14 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._rewind_streams   100% 15 0 0   100% 8 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser.close   50% 4 2 0   100% 0 0   50%
src/local_deep_research/utilities/pdf_stream_release.py PdfplumberWalkReleaser._disable   82% 11 2 0   100% 2 0   85%
src/local_deep_research/utilities/pdf_stream_release.py PypdfWalkReleaser.__init__   100% 6 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PypdfWalkReleaser._cache   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PypdfWalkReleaser.before_page   100% 10 0 0   100% 4 0   100%
src/local_deep_research/utilities/pdf_stream_release.py PypdfWalkReleaser.after_page   91% 34 3 0   100% 22 0   95%
src/local_deep_research/utilities/pdf_stream_release.py PypdfWalkReleaser._disable   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/pdf_stream_release.py (no function)   100% 62 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/research_content_cache.py normalize_collection_scope   80% 10 2 0   75% 8 2   78%
src/local_deep_research/utilities/research_content_cache.py _normalize_chunk_display   86% 7 1 0   75% 4 1   82%
src/local_deep_research/utilities/research_content_cache.py content_cache_key   95% 22 1 6   92% 12 1   94%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.__init__   100% 11 0 0   100% 0 0   100%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.get   100% 8 0 0   100% 2 0   100%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache._evict_if_needed   86% 7 1 0   75% 4 1   82%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.put   84% 19 3 0   70% 10 3   79%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.get_or_fetch   100% 30 0 0   100% 12 0   100%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache._validation_memo_key   67% 6 2 0   50% 4 2   60%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.get_validation   80% 5 1 0   50% 2 1   71%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.set_validation   0% 13 13 0   0% 8 0   0%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.validated   58% 24 10 0   70% 10 3   62%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.clear   100% 9 0 0   100% 0 0   100%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.stats   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/research_content_cache.py ResearchContentCache.__len__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/research_content_cache.py bind_cache_to_research   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/research_content_cache.py unbind_cache_from_research   80% 5 1 0   75% 4 1   78%
src/local_deep_research/utilities/research_content_cache.py get_cache_for_research   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/research_content_cache.py get_current_cache   92% 12 1 4   83% 6 1   89%
src/local_deep_research/utilities/research_content_cache.py resolve_cache   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/research_content_cache.py (no function)   100% 31 0 0   100% 0 0   100%
src/local_deep_research/utilities/resource_utils.py safe_close   100% 12 0 0   100% 8 0   100%
src/local_deep_research/utilities/resource_utils.py (no function)   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_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 _URLCandidateBudget.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py _URLCandidateBudget.consume   100% 3 0 0   100% 2 0   100%
src/local_deep_research/utilities/search_utilities.py _normalize_bare_library_prefix   100% 1 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py resolve_uncited_sources_mode   64% 11 4 0   67% 6 2   65%
src/local_deep_research/utilities/search_utilities.py _strip_fence_prefix   100% 16 0 0   90% 10 1   96%
src/local_deep_research/utilities/search_utilities.py _is_fence_line   100% 11 0 0   100% 6 0   100%
src/local_deep_research/utilities/search_utilities.py _is_fence_closer_line   100% 3 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py _find_fence_positions   0% 7 7 0   0% 4 0   0%
src/local_deep_research/utilities/search_utilities.py _strip_marker_blocks   96% 23 1 0   94% 18 1   95%
src/local_deep_research/utilities/search_utilities.py _strip_fenced_code   100% 7 0 0   100% 4 0   100%
src/local_deep_research/utilities/search_utilities.py _is_all_uppercase_tag   100% 2 0 0   100% 0 0   100%
src/local_deep_research/utilities/search_utilities.py _is_ignorable_prose_singleton   89% 9 1 0   83% 6 1   87%
src/local_deep_research/utilities/search_utilities.py _is_malformed_numeric_content   94% 17 1 0   94% 16 1   94%
src/local_deep_research/utilities/search_utilities.py _peel_url_candidate   90% 21 2 0   70% 10 3   84%
src/local_deep_research/utilities/search_utilities.py _url_citation_candidates   93% 81 6 0   87% 54 7   90%
src/local_deep_research/utilities/search_utilities.py _has_malformed_numeric_brackets   100% 13 0 0   100% 12 0   100%
src/local_deep_research/utilities/search_utilities.py _mask_replay_ip_literal   67% 6 2 0   100% 0 0   67%
src/local_deep_research/utilities/search_utilities.py _citation_url_matches   95% 40 2 0   89% 28 3   93%
src/local_deep_research/utilities/search_utilities.py _mask_ip_literal_authority   88% 26 3 0   86% 14 2   88%
src/local_deep_research/utilities/search_utilities.py _parse_bracket_content   66% 35 12 0   75% 20 5   69%
src/local_deep_research/utilities/search_utilities.py extract_cited_indices_and_urls   87% 63 8 0   91% 32 3   88%
src/local_deep_research/utilities/search_utilities.py filter_cited_links   87% 38 5 0   91% 22 2   88%
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   99% 87 1 0   98% 52 1   99%
src/local_deep_research/utilities/search_utilities.py format_findings   95% 77 4 0   100% 32 0   96%
src/local_deep_research/utilities/search_utilities.py (no function)   100% 72 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_positive_int   100% 15 0 0   100% 8 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 resolve_boolean_setting   100% 14 0 0   100% 12 0   100%
src/local_deep_research/utilities/type_utils.py overlay_snapshot_value   100% 4 0 0   100% 2 0   100%
src/local_deep_research/utilities/type_utils.py _is_strict_scope   87% 15 2 0   100% 8 0   91%
src/local_deep_research/utilities/type_utils.py overlay_runtime_settings   89% 9 1 0   88% 8 1   88%
src/local_deep_research/utilities/type_utils.py resolve_snippets_only   100% 19 0 0   100% 16 0   100%
src/local_deep_research/utilities/type_utils.py (no function)   100% 10 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 _is_wayback_replay_url   100% 15 0 0   100% 8 0   100%
src/local_deep_research/utilities/url_utils.py canonical_url_key   94% 50 3 0   96% 26 1   95%
src/local_deep_research/utilities/url_utils.py content_web_cache_key   81% 48 9 0   79% 24 5   81%
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% 33 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 BaseVectorStore.drop_collection   100% 0 0 1   100% 0 0   100%
src/local_deep_research/vector_stores/base.py (no function)   100% 37 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 _normalize_provider_key   100% 1 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/config.py provider_is_local_file   100% 4 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/config.py only_local_file_providers_registered   100% 2 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% 12 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   86% 14 2   93%
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% 39 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   72% 36 10 0   100% 14 0   80%
src/local_deep_research/vector_stores/legacy_cleanup.py _find_legacy_docstores._onerror   100% 3 0 0   100% 0 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py _delete_file   92% 12 1 0   100% 0 0   92%
src/local_deep_research/vector_stores/legacy_cleanup.py _write_sidecar_atomic   76% 34 8 0   83% 6 1   78%
src/local_deep_research/vector_stores/legacy_cleanup.py _extract_map   100% 20 0 0   100% 6 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py migrate_legacy_docstores   100% 38 0 0   100% 18 0   100%
src/local_deep_research/vector_stores/legacy_cleanup.py rekey_index_file   98% 65 1 0   96% 28 1   98%
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   100% 16 0 0   100% 10 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _purge_redundant_pkl   100% 11 0 0   100% 2 0   100%
src/local_deep_research/vector_stores/legacy_rekey.py _quarantine_and_reset   100% 20 0 0   90% 10 1   97%
src/local_deep_research/vector_stores/legacy_rekey.py rekey_user_indexes   99% 99 1 0   96% 26 1   98%
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 _normalise_forwarded_allow_ips   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/app.py _run_with_uvicorn   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/app.py (no function)   92% 13 1 0   50% 2 1   87%
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 _evict_collection_engines_cache   60% 5 2 0   100% 0 0   60%
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% 61 0 0   100% 18 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% 16 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% 15 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% 23 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 request_database_scope   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py _record_reopen_fault   100% 3 0 0   50% 2 1   80%
src/local_deep_research/web/dependencies/auth.py clear_session_if_unrecoverable   100% 12 0 0   100% 8 0   100%
src/local_deep_research/web/dependencies/auth.py _revoke_server_session   100% 12 0 0   75% 4 1   94%
src/local_deep_research/web/dependencies/auth.py end_rejected_session   82% 11 2 0   75% 4 1   80%
src/local_deep_research/web/dependencies/auth.py database_unavailable_exception   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py _database_connection_status   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/auth.py require_auth   100% 13 0 0   100% 8 0   100%
src/local_deep_research/web/dependencies/auth.py _server_session_valid   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/auth.py get_db_session_dep   100% 12 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% 34 0 0   95% 22 1   98%
src/local_deep_research/web/dependencies/auth.py (no function)   100% 28 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/csrf.py _log_path_preview   100% 2 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 get_auth_context   100% 4 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% 74 3 0   96% 28 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% 17 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 is_json_request   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% 7 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _log_startup   83% 12 2 0   100% 2 0   86%
src/local_deep_research/web/dependencies/rate_limit.py _forwarded_allow_entries   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _normalise_forwarded_allow_ips   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _warn_uvicorn_parser_unavailable   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _LocalTrustedHosts.__init__   88% 16 2 0   100% 6 0   91%
src/local_deep_research/web/dependencies/rate_limit.py _strip_v6_scope   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _family_blocks   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _family_is_fully_covered   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _allow_list_covers_whole_families   100% 11 0 0   100% 6 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _describe_unrestricted_allow_list   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _classify_allow_list   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _warn_about_imprecise_allow_list_entries   100% 20 0 0   100% 8 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 _parsed_forwarded_allow_entries   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _peer_in_forwarded_allow_list   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _peer_may_supply_forwarding_headers   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _strip_forwarded_port   91% 23 2 0   80% 10 2   88%
src/local_deep_research/web/dependencies/rate_limit.py _select_trusted_hop   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _get_forwarded_for   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _forwarded_address   100% 20 0 0   100% 12 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _get_client_ip   100% 33 0 0   96% 26 1   98%
src/local_deep_research/web/dependencies/rate_limit.py _resolve_legacy_storage_uri   92% 13 1 0   83% 6 1   89%
src/local_deep_research/web/dependencies/rate_limit.py _redact_storage_uri   100% 16 0 0   100% 8 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _storage_uri_scheme   100% 2 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 async_shared_limit   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py async_shared_limit.decorator   90% 10 1 0   75% 4 1   86%
src/local_deep_research/web/dependencies/rate_limit.py async_shared_limit.decorator.wrapper   92% 13 1 0   90% 10 1   91%
src/local_deep_research/web/dependencies/rate_limit.py set_request_api_rate_limit   100% 18 0 0   93% 14 1   97%
src/local_deep_research/web/dependencies/rate_limit.py _reset_invalid_value_warnings   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _api_user_key   100% 4 0 0   100% 2 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 _api_custom_limit_active   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _api_default_exempt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _api_custom_exempt   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py _api_custom_limit_value   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/rate_limit.py api_rate_limit   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/rate_limit.py (no function)   100% 159 0 3   100% 28 0   100%
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 _get_api_research_executor   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/threadpool.py _shutdown_api_research_executor   0% 5 5 0   0% 2 0   0%
src/local_deep_research/web/dependencies/threadpool.py _get_model_discovery_executor   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/dependencies/threadpool.py _shutdown_model_discovery_executor   0% 5 5 0   0% 2 0   0%
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% 5 0 0   100% 2 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 run_db_sync   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py run_research_sync   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py run_model_discovery_sync   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/dependencies/threadpool.py (no function)   100% 39 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 _render_branded_error_page   100% 15 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _database_unavailable_page   88% 8 1 0   83% 6 1   86%
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   64% 132 47 0   64% 22 8   64%
src/local_deep_research/web/fastapi_app.py _is_private_ip   100% 11 0 0   100% 6 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.response_headers   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.__call__   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py SecurityHeadersMiddleware.__call__.send_wrapper   100% 9 0 0   100% 4 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% 17 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware.__call__   100% 35 0 0   100% 16 0   100%
src/local_deep_research/web/fastapi_app.py BodySizeLimitMiddleware.__call__.recv_limited   100% 6 0 0   100% 4 0   100%
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% 5 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware._maybe_warn_untrusted_forwarded_proto   100% 21 0 0   100% 18 0   100%
src/local_deep_research/web/fastapi_app.py SecureCookieMiddleware._maybe_warn_insecure_public   100% 6 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   90% 39 4 0   100% 0 0   90%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_request_validation_error   94% 16 1 0   70% 10 3   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% 6 0 0   100% 4 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.unhandled_exception   83% 6 1 0   50% 2 1   75%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_json_decode_error   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _register_exception_handlers.handle_client_disconnect   100% 3 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_database_unavailable   100% 4 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 _register_exception_handlers.handle_settings_value_error   100% 9 0 0   100% 4 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__   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware._call_http   94% 32 2 0   100% 8 0   95%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware._call_http._MinimalRequest.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py DatabaseMiddleware._call_http.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% 8 0 0   100% 0 0   100%
src/local_deep_research/web/fastapi_app.py _setup_rate_limiting._rate_limit_exceeded   100% 16 0 0   100% 2 0   100%
src/local_deep_research/web/fastapi_app.py _add_static_routes   100% 9 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   100% 4 0 0   100% 2 0   100%
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% 14 0 0   100% 6 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   95% 42 2 0   75% 12 3   91%
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% 123 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   92% 26 2 0   88% 16 2   90%
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   100% 34 0 0   100% 18 0   100%
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   92% 83 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   94% 97 6 0   83% 46 8   90%
src/local_deep_research/web/queue/processor_v2.py (no function)   100% 65 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% 1 0 0   100% 0 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% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/api.py api_add_resource._impl   100% 24 0 0   100% 8 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% 41 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% 22 0 0   100% 22 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   79% 28 6 0   67% 6 2   76%
src/local_deep_research/web/routers/api_v1.py api_quick_summary   100% 47 0 0   100% 20 0   100%
src/local_deep_research/web/routers/api_v1.py api_generate_report   100% 46 0 0   100% 18 0   100%
src/local_deep_research/web/routers/api_v1.py api_analyze_documents   100% 36 0 0   100% 14 0   100%
src/local_deep_research/web/routers/api_v1.py (no function)   96% 55 2 0   100% 0 0   96%
src/local_deep_research/web/routers/auth.py get_csrf_token   100% 7 0 0   100% 2 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 _opens_chat_page   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _drop_chat_query   78% 9 2 0   100% 2 0   82%
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   93% 56 4 0   83% 12 2   91%
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   92% 84 7 0   92% 12 1   92%
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% 93 12 0   92% 26 2   88%
src/local_deep_research/web/routers/auth.py logout   84% 37 6 0   83% 12 2   84%
src/local_deep_research/web/routers/auth.py check_auth   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey   100% 13 0 0   100% 2 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.unregister_scheduler   75% 4 1 0   50% 2 1   67%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.pop_per_user_locks   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.evict_collection_engines   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.destroy_sessions   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.clear_session_passwords   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.clear_thread_credentials   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.disconnect_sockets   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/auth.py _revoke_user_credentials_after_rekey.clear_request_session   100% 1 0 0   100% 0 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   95% 58 3 0   95% 20 1   95%
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% 66 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% 48 0 0   88% 16 2   97%
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% 2 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   100% 18 0 0   75% 8 2   92%
src/local_deep_research/web/routers/chat.py _drop_foreign_chat_query   100% 11 0 0   100% 6 0   100%
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   100% 24 0 0   100% 8 0   100%
src/local_deep_research/web/routers/chat.py generate_session_title   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py generate_session_title._impl   100% 19 0 0   100% 6 0   100%
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   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web/routers/chat.py update_session._impl   100% 39 0 0   94% 16 1   98%
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% 21 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   100% 116 0 2   97% 32 1   99%
src/local_deep_research/web/routers/chat.py _check_chat_research_slot_locked   100% 27 0 0   93% 14 1   98%
src/local_deep_research/web/routers/chat.py _enforce_chat_session_research_slot   100% 8 0 0   100% 4 0   100%
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   100% 12 0 0   100% 0 0   100%
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   99% 120 1 0   88% 26 3   97%
src/local_deep_research/web/routers/chat.py (no function)   100% 78 0 0   100% 0 0   100%
src/local_deep_research/web/routers/context_overflow_api.py get_context_overflow_metrics   100% 61 0 0   100% 14 0   100%
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% 16 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   79% 131 27 0   86% 22 1   80%
src/local_deep_research/web/routers/followup.py (no function)   100% 20 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 _scrub_server_paths   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/routers/history.py get_research_status   100% 25 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% 39 0 0   100% 0 0   100%
src/local_deep_research/web/routers/library.py _string_list_error   100% 9 0 0   100% 8 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% 47 5 0   100% 0 0   89%
src/local_deep_research/web/routers/library.py document_details_page   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/library.py download_manager_page   92% 25 2 0   100% 2 0   93%
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% 20 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   100% 15 0 0   100% 8 0   100%
src/local_deep_research/web/routers/library.py download_bulk.generate   93% 95 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   100% 11 0 0   100% 6 0   100%
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 _one_resource_per_awaiting_document   100% 30 0 0   100% 16 0   100%
src/local_deep_research/web/routers/library.py queue_all_undownloaded   92% 53 4 0   89% 18 2   92%
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   100% 12 0 0   100% 6 0   100%
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   100% 12 0 0   100% 6 0   100%
src/local_deep_research/web/routers/library.py download_source._download_sync   100% 35 0 0   100% 12 0   100%
src/local_deep_research/web/routers/library.py (no function)   100% 93 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% 12 0 0   100% 10 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% 20 0 0   100% 10 0   100%
src/local_deep_research/web/routers/library_delete.py delete_collection_index   100% 14 0 0   100% 8 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% 38 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   100% 5 0 0   100% 2 0   100%
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   100% 19 0 0   100% 8 0   100%
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   71% 7 2 0   100% 2 0   78%
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   97% 90 3 0   87% 46 6   93%
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   100% 35 0 0   100% 6 0   100%
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   100% 37 0 0   95% 20 1   98%
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   100% 26 0 0   100% 16 0   100%
src/local_deep_research/web/routers/metrics.py api_save_research_rating._save_sync   100% 11 0 0   100% 6 0   100%
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% 20 0 0   100% 6 0   100%
src/local_deep_research/web/routers/metrics.py api_research_costs   100% 18 0 0   100% 6 0   100%
src/local_deep_research/web/routers/metrics.py api_cost_analytics   100% 39 0 0   100% 14 0   100%
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 _domain_rejection_reason   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/routers/metrics.py api_classify_domains   100% 18 0 0   100% 12 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 _resolve_persisted_egress_scope   100% 10 0 0   100% 2 0   100%
src/local_deep_research/web/routers/metrics.py _egress_scope_forbids_public_fetch   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py _resolve_effective_egress_scope   78% 9 2 0   50% 4 2   69%
src/local_deep_research/web/routers/metrics.py _journal_ref_db_read_would_download   84% 19 3 0   100% 4 0   87%
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% 35 0 0   92% 12 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   100% 33 0 0   100% 8 0   100%
src/local_deep_research/web/routers/metrics.py _ref_db_lookup   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/routers/metrics.py _get_ref_db_or_none   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/routers/metrics.py _resolve_paper_quality   100% 8 0 0   100% 6 0   100%
src/local_deep_research/web/routers/metrics.py _lookup_journal_llm_quality   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web/routers/metrics.py api_user_research_journals   100% 41 0 0   100% 16 0   100%
src/local_deep_research/web/routers/metrics.py api_research_journals   100% 43 0 0   100% 18 0   100%
src/local_deep_research/web/routers/metrics.py (no function)   100% 114 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   100% 31 0 0   100% 6 0   100%
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   90% 20 2 0   100% 10 0   93%
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% 30 0 0   100% 8 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% 42 2 0   100% 8 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% 8 0 0   100% 4 0   100%
src/local_deep_research/web/routers/news_flask_api.py update_folder._impl   75% 12 3 0   75% 4 1   75%
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% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/news_flask_api.py _update_subscription_folder_sync   93% 28 2 0   100% 10 0   95%
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% 112 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% 16 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% 10 0 0   100% 2 0   100%
src/local_deep_research/web/routers/news_pages.py (no function)   100% 21 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   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web/routers/notes.py _RedactingRepr.__init__   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _RedactingRepr._redacted   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py _RedactingRepr.repr_str   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py _RedactingRepr.repr_instance   50% 12 6 0   50% 4 2   50%
src/local_deep_research/web/routers/notes.py _log_value_preview   100% 10 0 0   100% 8 0   100%
src/local_deep_research/web/routers/notes.py _bound_dict_shaped_walk   100% 37 0 0   95% 22 1   98%
src/local_deep_research/web/routers/notes.py _llm_not_configured_response   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _parse_json_off_loop   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py _notes_json_body   96% 25 1 0   93% 14 1   95%
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   100% 14 0 0   100% 4 0   100%
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% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py list_notes   100% 23 0 0   100% 4 0   100%
src/local_deep_research/web/routers/notes.py create_note   90% 20 2 0   100% 8 0   93%
src/local_deep_research/web/routers/notes.py semantic_search_notes   100% 23 0 0   100% 4 0   100%
src/local_deep_research/web/routers/notes.py ask_context   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py search_notes_for_linking   76% 17 4 0   100% 2 0   79%
src/local_deep_research/web/routers/notes.py get_note   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py update_note   100% 22 0 0   100% 10 0   100%
src/local_deep_research/web/routers/notes.py delete_note   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py get_note_collections   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py add_note_to_collection   100% 17 0 0   100% 8 0   100%
src/local_deep_research/web/routers/notes.py remove_note_from_collection   100% 12 0 0   100% 4 0   100%
src/local_deep_research/web/routers/notes.py get_note_research   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py link_research_to_note   93% 27 2 0   100% 12 0   95%
src/local_deep_research/web/routers/notes.py patch_note_research   100% 15 0 0   100% 6 0   100%
src/local_deep_research/web/routers/notes.py reorder_note_research   95% 20 1 0   90% 10 1   93%
src/local_deep_research/web/routers/notes.py get_research_notes   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py create_research_note   100% 15 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py save_research_as_note   91% 35 3 0   100% 8 0   93%
src/local_deep_research/web/routers/notes.py _validated_annotation_fields   100% 17 0 0   100% 12 0   100%
src/local_deep_research/web/routers/notes.py _comment_note_title   100% 4 0 0   100% 2 0   100%
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   83% 18 3 0   100% 4 0   86%
src/local_deep_research/web/routers/notes.py delete_research_annotation   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py get_document_notes   88% 8 1 0   50% 2 1   80%
src/local_deep_research/web/routers/notes.py create_document_note   100% 15 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py get_document_annotations   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py create_document_annotation   82% 22 4 0   75% 4 1   81%
src/local_deep_research/web/routers/notes.py delete_document_annotation   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py index_note_to_collection   100% 21 0 0   100% 10 0   100%
src/local_deep_research/web/routers/notes.py get_similar_notes   83% 12 2 0   100% 2 0   86%
src/local_deep_research/web/routers/notes.py summarize_note   100% 12 0 0   100% 4 0   100%
src/local_deep_research/web/routers/notes.py extract_research_questions   92% 12 1 0   100% 4 0   94%
src/local_deep_research/web/routers/notes.py suggest_tags   100% 21 0 0   100% 8 0   100%
src/local_deep_research/web/routers/notes.py extract_key_concepts   92% 12 1 0   100% 4 0   94%
src/local_deep_research/web/routers/notes.py get_backlinks   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py get_outgoing_links   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py get_suggested_links   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py accept_suggested_link   94% 16 1 0   83% 6 1   91%
src/local_deep_research/web/routers/notes.py get_unlinked_mentions   100% 8 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py similar_passages   100% 16 0 0   100% 6 0   100%
src/local_deep_research/web/routers/notes.py fact_check_note   100% 15 0 0   100% 6 0   100%
src/local_deep_research/web/routers/notes.py _grade_note_claims   100% 25 0 0   100% 10 0   100%
src/local_deep_research/web/routers/notes.py _grade_note_claims._load_research   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web/routers/notes.py _grade_note_claims._fetch_report_and_sources   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/routers/notes.py _grade_note_claims._persist_verdicts   100% 13 0 0   100% 2 0   100%
src/local_deep_research/web/routers/notes.py grade_note_fact_check   88% 16 2 0   100% 6 0   91%
src/local_deep_research/web/routers/notes.py resolve_link   100% 20 0 0   100% 8 0   100%
src/local_deep_research/web/routers/notes.py preview_synthesis   100% 21 0 0   100% 10 0   100%
src/local_deep_research/web/routers/notes.py synthesize_notes   100% 31 0 0   100% 14 0   100%
src/local_deep_research/web/routers/notes.py synthesize_notes._create_note_and_record_synthesis   100% 20 0 0   100% 2 0   100%
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   90% 21 2 0   100% 6 0   93%
src/local_deep_research/web/routers/notes.py get_semantic_diff._load_diff_versions   92% 13 1 0   88% 8 1   90%
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   67% 15 5 0   62% 8 1   65%
src/local_deep_research/web/routers/notes.py (no function)   100% 214 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% 6 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% 18 0 0   83% 6 1   96%
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   97% 34 1 0   92% 12 1   96%
src/local_deep_research/web/routers/rag.py test_embedding._run_embedding_test   100% 13 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py get_available_models   97% 35 1 0   100% 6 0   98%
src/local_deep_research/web/routers/rag.py get_available_models._embeddings_model_fetch_allowed   100% 12 0 0   100% 4 0   100%
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   92% 24 2 0   100% 4 0   93%
src/local_deep_research/web/routers/rag.py index_all.generate   88% 52 6 0   94% 18 1   90%
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   90% 41 4 0   100% 6 0   91%
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   95% 37 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% 40 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% 138 10 0   95% 38 2   93%
src/local_deep_research/web/routers/rag.py _collection_rebuild_info   100% 3 0 0   100% 0 0   100%
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 _indexing_conflict   100% 13 0 0   100% 8 0   100%
src/local_deep_research/web/routers/rag.py _register_sse_indexer   100% 9 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _unregister_sse_indexer   100% 7 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _unregister_background_indexer   100% 4 0 0   50% 2 1   83%
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 _query_documents_to_index   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py index_collection   92% 26 2 0   100% 2 0   93%
src/local_deep_research/web/routers/rag.py index_collection.generate   86% 88 12 0   88% 24 1   87%
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   85% 13 2 0   100% 0 0   85%
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% 35 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 _client_indexing_error   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _client_reconciliation_reason   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _reconciliation_skipped_message   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _reconciled_failures_message   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _remote_drop_failure   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py _client_task_failure_message   100% 12 0 0   100% 8 0   100%
src/local_deep_research/web/routers/rag.py _sanitized_indexing_errors   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/rag.py _client_indexing_summary   88% 8 1 0   83% 6 1   86%
src/local_deep_research/web/routers/rag.py _client_indexing_result   100% 13 0 0   90% 10 1   96%
src/local_deep_research/web/routers/rag.py _client_indexing_task_error   100% 16 0 0   93% 14 1   97%
src/local_deep_research/web/routers/rag.py _background_index_worker   100% 61 0 0   100% 12 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   100% 35 0 0   96% 26 1   98%
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% 37 0 0   100% 4 0   100%
src/local_deep_research/web/routers/rag.py _start_background_index_sync._ctx_worker   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/rag.py get_index_status   100% 30 0 0   100% 8 0   100%
src/local_deep_research/web/routers/rag.py cancel_indexing   100% 30 0 0   100% 12 0   100%
src/local_deep_research/web/routers/rag.py (no function)   100% 164 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py redirect_static   100% 9 0 0   100% 4 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 _string_field_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py _non_string_request_field   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web/routers/research.py _settings_value_error_response   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py _extract_research_params   100% 49 0 0   100% 28 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   92% 48 4 0   92% 12 1   92%
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% 25 0 0   100% 14 0   100%
src/local_deep_research/web/routers/research.py _unrunnable_subscription_response   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web/routers/research.py _start_research_sync   88% 228 28 0   85% 72 9   87%
src/local_deep_research/web/routers/research.py terminate_research   94% 50 3 0   88% 16 2   92%
src/local_deep_research/web/routers/research.py _unlink_report_file_if_inside_root   88% 24 3 0   100% 6 0   90%
src/local_deep_research/web/routers/research.py delete_research   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py delete_research.delete_once   93% 27 2 0   92% 12 1   92%
src/local_deep_research/web/routers/research.py clear_history   100% 6 0 0   100% 0 0   100%
src/local_deep_research/web/routers/research.py clear_history.clear_once   100% 28 0 0   100% 14 0   100%
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 _blocked_key_path   100% 17 0 0   100% 10 0   100%
src/local_deep_research/web/routers/research.py _find_blocked_keys   100% 24 0 0   100% 16 0   100%
src/local_deep_research/web/routers/research.py save_raw_config   100% 33 0 0   100% 10 0   100%
src/local_deep_research/web/routers/research.py get_history   86% 36 5 0   90% 10 1   87%
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   71% 31 9 0   83% 6 1   73%
src/local_deep_research/web/routers/research.py get_research_status   96% 55 2 0   100% 26 0   98%
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   87% 62 8 0   90% 20 2   88%
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% 118 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_decision   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py _model_discovery_provider_allowed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _configured_egress_scope   82% 11 2 0   67% 6 2   76%
src/local_deep_research/web/routers/settings.py _provider_disabled_reason   100% 15 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py _provider_options_for_snapshot   100% 8 0 0   100% 2 0   100%
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 _model_discovery_settings_unchanged   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web/routers/settings.py validate_setting   97% 34 1 0   96% 28 1   97%
src/local_deep_research/web/routers/settings.py _strict_read_rejection   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py coerce_setting_for_write   100% 17 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py _container_embeds_sentinel   100% 9 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py _container_exceeds_max_depth   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web/routers/settings.py _container_too_deep_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _container_rejection_error   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _values_equal   82% 17 3 0   81% 16 3   82%
src/local_deep_research/web/routers/settings.py _non_sentinel_fields_match   78% 18 4 0   78% 18 2   78%
src/local_deep_research/web/routers/settings.py _merge_redacted_container   100% 34 0 0   100% 22 0   100%
src/local_deep_research/web/routers/settings.py _resolve_container_secret_write   100% 10 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py _coerced_for_guard   100% 23 0 0   93% 14 1   97%
src/local_deep_research/web/routers/settings.py _reconciled_container_value_for_write   100% 6 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py _is_secret_empty_noop   88% 8 1 0   83% 6 1   86%
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% 8 0 0   100% 6 0   100%
src/local_deep_research/web/routers/settings.py _embeds_sentinel_on_create   100% 7 0 0   100% 6 0   100%
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   98% 180 3 0   97% 104 3   98%
src/local_deep_research/web/routers/settings.py save_all_settings   100% 6 0 0   100% 4 0   100%
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   97% 70 2 0   96% 28 1   97%
src/local_deep_research/web/routers/settings.py save_settings   89% 28 3 0   79% 14 3   86%
src/local_deep_research/web/routers/settings.py _log_post_save_settings_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _settings_value_error_response   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_get_all_settings   100% 23 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   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py _get_available_models   98% 154 3 0   94% 66 4   97%
src/local_deep_research/web/routers/settings.py _get_available_models.check_cancelled   100% 2 0 0   100% 2 0   100%
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   94% 31 2 11   100% 10 0   95%
src/local_deep_research/web/routers/settings.py _apply_guarded_url_overlay   86% 22 3 3   100% 10 0   91%
src/local_deep_research/web/routers/settings.py api_get_available_search_engines   89% 54 6 0   81% 16 3   87%
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 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% 7 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_reset_engine_rate_limiting._reset_db   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _cleanup_rate_limit_estimates_sync   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py _cleanup_rate_limit_estimates_sync._cleanup_db   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_cleanup_rate_limiting   100% 22 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% 16 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   86% 7 1 0   75% 4 1   82%
src/local_deep_research/web/routers/settings.py _is_host_free_notification_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/routers/settings.py api_test_notification_url   100% 22 0 0   100% 8 0   100%
src/local_deep_research/web/routers/settings.py api_get_db_setting   100% 23 0 0   100% 4 0   100%
src/local_deep_research/web/routers/settings.py api_update_setting   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web/routers/settings.py _api_update_setting_sync   99% 116 1 0   97% 64 2   98%
src/local_deep_research/web/routers/settings.py api_delete_setting   100% 24 0 0   100% 12 0   100%
src/local_deep_research/web/routers/settings.py (no function)   100% 169 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% 8 0 0   100% 4 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   80% 10 2 0   100% 4 0   86%
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% 7 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% 13 0 0   100% 8 0   100%
src/local_deep_research/web/routes/research_validation.py (no function)   100% 14 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   96% 51 2 0   100% 14 0   97%
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% 17 0 0   100% 0 0   100%
src/local_deep_research/web/services/pdf_service.py _ensure_weasyprint   71% 17 5 0   100% 2 0   74%
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 _SafeUrlFetcher.__call__   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/services/pdf_service.py _empty_resource_for   86% 7 1 0   50% 2 1   78%
src/local_deep_research/web/services/pdf_service.py _SkippingUrlFetcher.__init__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/pdf_service.py _SkippingUrlFetcher.__call__   100% 7 0 0   100% 0 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% 17 0 0   100% 2 0   100%
src/local_deep_research/web/services/pdf_service.py PDFService._render_pdf   100% 21 0 0   75% 4 1   96%
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% 38 0 0   100% 0 0   100%
src/local_deep_research/web/services/report_assembly_service.py _current_user_uncited_mode   64% 11 4 0   75% 4 1   67%
src/local_deep_research/web/services/report_assembly_service.py _research_metadata   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/services/report_assembly_service.py _research_settings_snapshot   60% 5 2 0   100% 0 0   60%
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 _resolve_saved_uncited_mode   100% 12 0 0   90% 10 1   95%
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% 22 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py _resolve_error_rewrite_base_url   100% 20 0 0   93% 14 1   97%
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 _ensure_settings_snapshot   88% 8 1 0   83% 6 1   86%
src/local_deep_research/web/services/research_service.py _merge_completion_metadata   100% 5 0 0   50% 2 1   86%
src/local_deep_research/web/services/research_service.py _is_error_shaped_content   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/research_service.py _extract_synthesized_answer   100% 7 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% 15 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   100% 26 0 0   88% 8 1   97%
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   100% 25 0 0   100% 10 0   100%
src/local_deep_research/web/services/research_service.py _make_chat_stream_callback.stream_callback   100% 20 0 0   90% 10 1   97%
src/local_deep_research/web/services/research_service.py _save_partial_chat_message_on_terminate   93% 29 2 0   100% 14 0   95%
src/local_deep_research/web/services/research_service.py run_research_process   90% 549 56 0   87% 186 16   89%
src/local_deep_research/web/services/research_service.py run_research_process.progress_callback   93% 102 7 0   91% 66 6   92%
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   100% 39 0 0   100% 12 0   100%
src/local_deep_research/web/services/research_service.py (no function)   100% 87 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   91% 34 3 0   86% 28 2   89%
src/local_deep_research/web/services/settings_service.py (no function)   100% 16 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _resolve_socketio_cors   100% 8 0 0   100% 6 0   100%
src/local_deep_research/web/services/socketio_asgi.py _log_socketio_cors_policy   88% 8 1 0   83% 6 1   86%
src/local_deep_research/web/services/socketio_asgi.py log_socketio_cors_policy   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _research_id_preview   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _install_origin_rejection_logging   100% 12 0 0   100% 0 0   100%
src/local_deep_research/web/services/socketio_asgi.py _install_origin_rejection_logging._log_error_once   92% 13 1 0   88% 8 1   90%
src/local_deep_research/web/services/socketio_asgi.py _install_origin_rejection_logging._log_error_once._bounded   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/services/socketio_asgi.py _install_origin_rejection_logging._engineio_will_log   100% 6 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% 44 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   83% 6 1   94%
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% 58 0 0   100% 2 0   100%
src/local_deep_research/web/static_files.py _combined_theme_css   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web/static_files.py static_file_response   88% 25 3 0   90% 10 1   89%
src/local_deep_research/web/static_files.py (no function)   100% 11 0 0   100% 0 0   100%
src/local_deep_research/web/template_config.py _LDRTemplates.TemplateResponse   97% 66 2 0   73% 30 6   90%
src/local_deep_research/web/template_config.py (no function)   83% 18 3 0   100% 0 0   83%
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.declared_custom_properties   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   96% 26 1 0   92% 12 1   95%
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% 21 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% 16 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/download_headers.py build_content_disposition   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web/utils/download_headers.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/utils/pagination.py parse_bounded_offset   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web/utils/pagination.py (no function)   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web/utils/path_ids.py validated_uuid_path_param   100% 7 0 0   100% 0 0   100%
src/local_deep_research/web/utils/path_ids.py (no function)   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web/utils/range_response.py in_memory_range_response   100% 37 0 0   100% 16 0   100%
src/local_deep_research/web/utils/range_response.py (no function)   100% 5 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 _warn_once   86% 7 1 0   75% 4 1   82%
src/local_deep_research/web/utils/vite_helper.py _for_log   75% 4 1 0   50% 2 1   67%
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.manifest   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.manifest   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._manifest_fingerprint   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._rejected_fingerprint   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._manifest_failure   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._verified_entries   0% 1 1 0   100% 0 0   0%
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% 5 0 0   100% 0 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   95% 22 1 0   92% 12 1   94%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._fallback_assets   100% 13 0 0   100% 6 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._refresh_manifest_if_stale   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._adopt_manifest_from_disk   100% 27 0 0   100% 8 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._fail_closed   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._is_contained_file   71% 14 4 0   75% 8 2   73%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._entry_problem   92% 26 2 0   93% 14 1   92%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._closure_problem   90% 42 4 0   89% 36 4   90%
src/local_deep_research/web/utils/vite_helper.py ViteHelper._lazy_closure_problem   82% 11 2 0   80% 10 2   81%
src/local_deep_research/web/utils/vite_helper.py ViteHelper.assets_are_missing   100% 7 0 0   100% 4 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% 11 0 0   100% 2 0   100%
src/local_deep_research/web/utils/vite_helper.py (no function)   100% 60 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% 149 17 0   88% 58 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_report_backup_unavailable   100% 4 0 0   100% 2 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% 7 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_availability.py retry_after_seconds   95% 20 1 0   83% 6 1   92%
src/local_deep_research/web_search_engines/engine_availability.py retry_after_from_error   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engine_availability.py http_status   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engine_availability.py is_query_error   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py failure_from_exception   100% 20 0 0   100% 18 0   100%
src/local_deep_research/web_search_engines/engine_availability.py _is_auth_refusal   78% 9 2 0   100% 2 0   82%
src/local_deep_research/web_search_engines/engine_availability.py _retries_exhausted_on_429   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engine_availability.py UnrecordedFailure.describe   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py EngineDisablement.describe   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.__init__   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability._emit   89% 9 1 0   100% 4 0   92%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.disable   100% 24 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.disabled   100% 10 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.note_cancelled   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.cancelled   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.now   0% 1 1 0   100% 0 0   0%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.record_success   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.waiting   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.wait_budget_remaining   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.end_cooldowns   100% 4 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.seconds_until_retry   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.note_metrics_name   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.metrics_name   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py SearchEngineAvailability.state   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py engine_failure   83% 6 1 0   75% 4 1   80%
src/local_deep_research/web_search_engines/engine_availability.py engine_for_tool   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engine_availability.py search_engines_for_tools   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py search_exhausted   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engine_availability.py available_tool_names   83% 6 1 0   75% 4 1   80%
src/local_deep_research/web_search_engines/engine_availability.py (no function)   100% 64 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% 9 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 _recovery_headroom_slots   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _count_evictable_unlocked   89% 9 1 0   88% 8 1   88%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _capacity_pressure_unlocked   100% 27 0 0   100% 12 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _emit_capacity_log   100% 12 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _eviction_sort_key   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% 9 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py _get_url_state   100% 9 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% 7 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/_searxng_rate_limiter.py (no function)   100% 30 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 make_fetch_progress_adapter   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py make_fetch_progress_adapter._on_fetch_progress   100% 12 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.__init__   100% 14 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._resolve_cache   100% 6 0 4   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.set_fetch_progress_callback   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.last_search_failure   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._effective_allow_private_ips   100% 13 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._refuse_private_uncounted   100% 9 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._url_quality_prompt   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._keep_selected   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._url_filter_error_message   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._unfiltered_fallback   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.check_urls   100% 13 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._check_urls_async   85% 13 2 0   50% 4 2   76%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.run   98% 47 1 0   96% 26 1   97%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults._get_full_content   98% 41 1 0   100% 22 0   98%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.close   100% 3 0 0   50% 2 1   80%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.__enter__   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/full_search.py FullSearchResults.__exit__   100% 2 0 0   100% 0 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% 42 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% 5 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._fetch_full_text   100% 19 0 0   100% 12 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine.close   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._log_full_text_error   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._get_previews   100% 17 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py ArXivSearchEngine._get_full_content   100% 50 0 0   100% 16 0   100%
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% 31 0 0   83% 6 1   97%
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% 35 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_brave.py BraveSearchEngine.__init__   100% 12 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% 53 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_elasticsearch.py ElasticsearchSearchEngine._cloud_id_forbidden_by_scope   70% 10 3 0   100% 0 0   70%
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   93% 27 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% 23 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% 38 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_federal_register.py FederalRegisterSearchEngine.__init__   100% 3 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._new_search_run_state   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._get_previews   96% 51 2 0   86% 14 2   94%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._get_full_content   84% 92 15 0   77% 26 6   82%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._normalize_document_types   100% 11 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._is_zero_match   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._raise_if_rate_limited   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._raise_if_list_ended_off_host   100% 2 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._ended_off_host   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._preview_fields   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._drain_without_fetching   90% 10 1 0   75% 4 1   86%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._request_timeout   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._is_allowed_raw_text_url   82% 11 2 0   100% 6 0   88%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._normalize_full_content   100% 18 0 0   100% 12 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py FederalRegisterSearchEngine._truncate_full_content   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_federal_register.py (no function)   100% 59 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% 41 0 0   100% 22 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_github.py GitHubSearchEngine.search_repository   100% 24 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% 41 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% 24 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_guardian.py GuardianSearchEngine._adapt_dates_for_query_type   100% 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% 44 0 0   100% 12 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   91% 46 4 0   86% 22 3   90%
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% 23 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% 81 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   98% 42 1 0   88% 16 2   95%
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% 8 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   100% 1 0 0   100% 0 0   100%
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__   92% 24 2 0   100% 6 0   93%
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% 19 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine.__init__   100% 37 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._request_works   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._note_openalex_key_rejected   100% 6 0 0   50% 2 1   88%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._drop_rejected_api_key   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._reapply_rate_limit   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_openalex.py OpenAlexSearchEngine._get_previews   100% 64 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% 28 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% 42 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% 35 0 0   92% 12 1   98%
src/local_deep_research/web_search_engines/engines/search_engine_paperless.py PaperlessSearchEngine.run   85% 20 3 0   62% 8 1   79%
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% 31 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% 49 2 0   88% 24 3   93%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._simplify_query   100% 12 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._is_historical_focused   100% 20 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% 30 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_article_summaries   98% 42 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% 31 0 0   75% 12 3   93%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_pmc_full_text.add_section_content   100% 13 0 0   83% 12 2   92%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_previews   96% 84 3 0   80% 54 11   90%
src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py PubMedSearchEngine._get_full_content   97% 87 3 0   80% 60 12   90%
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% 39 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% 10 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% 49 0 0   100% 12 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   97% 87 3 0   91% 32 3   95%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py SearXNGSearchEngine._parse_json_results   96% 27 1 0   92% 12 1   95%
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   100% 1 0 0   100% 0 0   100%
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   71% 14 4 0   100% 2 0   75%
src/local_deep_research/web_search_engines/engines/search_engine_searxng.py (no function)   100% 39 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine.__init__   97% 34 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   95% 19 1 0   88% 8 1   93%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._optimize_query   100% 17 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py SemanticScholarSearchEngine._direct_search   100% 25 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% 36 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py SerpAPISearchEngine.__init__   100% 11 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% 9 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serper.py SerperSearchEngine._get_previews   100% 46 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_serply.py SerplySearchEngine.__init__   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serply.py SerplySearchEngine._snippet   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_serply.py SerplySearchEngine._get_previews   88% 32 4 0   100% 6 0   89%
src/local_deep_research/web_search_engines/engines/search_engine_serply.py (no function)   100% 22 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% 8 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% 8 0 0   100% 0 0   100%
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   98% 110 2 0   95% 58 3   97%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine._extract_urls_from_query.first_in_run   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine._extract_urls_from_query.host_separator_in   100% 3 0 0   100% 0 0   100%
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% 32 0 0   100% 14 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py WaybackSearchEngine._get_previews   100% 25 0 0   100% 12 0   100%
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% 21 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% 18 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wayback.py (no function)   100% 30 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_webz.py WebzSearchEngine.__init__   100% 23 0 0   100% 14 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_webz.py WebzSearchEngine._validate_filters   94% 35 2 0   94% 32 2   94%
src/local_deep_research/web_search_engines/engines/search_engine_webz.py WebzSearchEngine._check_response   100% 3 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_webz.py WebzSearchEngine._get_previews   98% 64 1 0   100% 30 0   99%
src/local_deep_research/web_search_engines/engines/search_engine_webz.py (no function)   100% 30 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% 17 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% 15 0 0   100% 4 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% 36 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% 57 0 0   100% 8 0   100%
src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py WikipediaSearchEngine._get_full_content   100% 29 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% 18 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% 23 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 RateLimitError.__init__   100% 2 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   92% 24 2 0   94% 18 1   93%
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% 6 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% 29 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__   71% 7 2 0   50% 2 1   67%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._effective_research_id   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._check_terminated   100% 4 0 0   100% 2 0   100%
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% 21 0 0   100% 14 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.invoke   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.ainvoke   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._scrub_or_raise   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._call_rate_limited   95% 19 1 0   83% 6 1   92%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._call_rate_limited._with_retry   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.stream   100% 20 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.stream._source   100% 4 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_upstream   100% 7 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._aclose_upstream   92% 13 1 0   88% 8 1   90%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._handle_close_error   75% 4 1 0   100% 2 0   83%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.astream   91% 22 2 0   100% 4 0   92%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._acall_rate_limited   95% 19 1 0   83% 6 1   92%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._acall_rate_limited._with_retry   100% 4 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper._configs_for_inputs   100% 5 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.batch   100% 10 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.abatch   60% 10 4 0   50% 4 0   57%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.bind_tools   69% 13 4 0   50% 2 1   67%
src/local_deep_research/web_search_engines/rate_limiting/llm/wrapper.py create_rate_limited_llm_wrapper.RateLimitedLLMWrapper.with_structured_output   71% 7 2 0   100% 0 0   71%
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% 15 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._resolve_session   87% 15 2 0   100% 6 0   90%
src/local_deep_research/web_search_engines/rate_limiting/tracker.py AdaptiveRateLimitTracker._isolated_begin_nested   89% 28 3 0   90% 10 1   89%
src/local_deep_research/web_search_engines/rate_limiting/tracker.py AdaptiveRateLimitTracker._restore_pending_state   29% 17 12 0   62% 8 1   40%
src/local_deep_research/web_search_engines/rate_limiting/tracker.py AdaptiveRateLimitTracker._ensure_estimates_loaded   100% 31 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% 65 0 0   100% 20 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% 24 1 0   90% 10 1   94%
src/local_deep_research/web_search_engines/rate_limiting/tracker.py AdaptiveRateLimitTracker.reset_engine   84% 32 5 0   79% 14 3   83%
src/local_deep_research/web_search_engines/rate_limiting/tracker.py AdaptiveRateLimitTracker.reset_engine._reset_db   100% 4 0 0   100% 0 0   100%
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   82% 28 5 0   75% 12 3   80%
src/local_deep_research/web_search_engines/rate_limiting/tracker.py AdaptiveRateLimitTracker.cleanup_old_data._cleanup_db   100% 6 0 0   100% 0 0   100%
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% 34 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 _finish_reason   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/relevance_filter.py _empty_completion_is_deterministic   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/relevance_filter.py _describe_empty_completion   100% 4 0 0   100% 0 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   92% 99 8 0   91% 44 4   92%
src/local_deep_research/web_search_engines/relevance_filter.py _invoke_text   97% 38 1 0   94% 16 1   96%
src/local_deep_research/web_search_engines/relevance_filter.py (no function)   100% 25 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 metrics_engine_name   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._new_search_run_state   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._search_run_state_var   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._get_search_run_state   100% 6 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._search_failed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._search_failed   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._rate_limited_after_previews   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._rate_limited_after_previews   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._note_openalex_key_rejected   100% 2 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% 25 0 0   100% 6 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.get_content_cache   100% 6 0 4   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._collection_scope_for_item   80% 20 4 2   69% 16 5   75%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._is_library_chunk_link   86% 7 1 4   50% 2 1   78%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._get_cache_egress_context   95% 21 1 3   83% 6 1   93%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._is_cache_url_allowed   94% 32 2 11   86% 14 2   91%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._is_cache_url_allowed._compute   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._fill_full_content_from_cache   87% 31 4 2   89% 18 2   88%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._store_full_content_in_cache   86% 21 3 2   81% 16 3   84%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._get_full_content_cached   81% 21 4 2   90% 10 1   84%
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   100% 8 0   100%
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% 10 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine.run   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._run_search   100% 42 0 0   100% 12 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._run_search._run_with_retry   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._run_search._execute_search   97% 64 2 0   100% 22 0   98%
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._resolve_openalex_enrichment_key   100% 10 0 0   100% 6 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._record_search_failure   100% 4 0 0   100% 2 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   86% 21 3 0   100% 4 0   88%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine.set_fetch_progress_callback   100% 4 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_base.py BaseSearchEngine._init_full_search   62% 8 3 0   50% 2 1   60%
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% 125 0 2   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engine_factory.py _resolve_setting   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engine_factory.py _normalize_language_code   100% 8 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/search_engine_factory.py _to_extraction_language_name   93% 14 1 0   92% 12 1   92%
src/local_deep_research/web_search_engines/search_engine_factory.py _resolve_extraction_language   100% 13 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/search_engine_factory.py create_search_engine   93% 222 16 0   88% 142 17   91%
src/local_deep_research/web_search_engines/search_engine_factory.py _create_full_search_wrapper   90% 71 7 0   83% 48 6   87%
src/local_deep_research/web_search_engines/search_engine_factory.py get_search   80% 66 13 0   82% 40 3   81%
src/local_deep_research/web_search_engines/search_engine_factory.py (no function)   100% 27 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engines_config.py _advance_collection_cache_generation   100% 1 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/search_engines_config.py invalidate_collection_engines_cache   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engines_config.py evict_collection_engines_cache   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/search_engines_config.py _get_setting   100% 17 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   95% 73 4 0   100% 28 0   96%
src/local_deep_research/web_search_engines/search_engines_config.py list_eligible_engine_configs   88% 48 6 0   94% 34 2   90%
src/local_deep_research/web_search_engines/search_engines_config.py _engine_class_is_available   65% 20 7 0   75% 4 1   67%
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% 29 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/wayback_client.py _archive_target_key   100% 5 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/wayback_client.py validate_capture_fetch_url   100% 7 0 0   83% 6 1   92%
src/local_deep_research/web_search_engines/wayback_client.py capture_metadata_from_replay_url   100% 21 0 0   100% 10 0   100%
src/local_deep_research/web_search_engines/wayback_client.py capture_metadata_from_replay_url.has_replay_path   100% 2 0 0   100% 0 0   100%
src/local_deep_research/web_search_engines/wayback_client.py validate_archive_url   100% 8 0 0   100% 4 0   100%
src/local_deep_research/web_search_engines/wayback_client.py normalize_archive_date   100% 7 0 0   100% 6 0   100%
src/local_deep_research/web_search_engines/wayback_client.py get_availability_response   100% 5 0 0   100% 2 0   100%
src/local_deep_research/web_search_engines/wayback_client.py lookup_archive_snapshot   97% 36 1 0   95% 20 1   96%
src/local_deep_research/web_search_engines/wayback_client.py (no function)   100% 16 0 0   100% 0 0   100%
Total     95% 78278 3553 187   92% 25936 1792   95%

No items found using the specified filter.