local-deep-research 0.5.0__tar.gz → 0.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/PKG-INFO +1 -1
  2. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/pyproject.toml +1 -1
  3. local_deep_research-0.5.2/src/local_deep_research/__version__.py +1 -0
  4. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/migrations.py +16 -1
  5. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/models.py +31 -31
  6. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/models/database.py +13 -23
  7. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/research_routes.py +65 -113
  8. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/research_service.py +112 -158
  9. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_api_basic.py +8 -65
  10. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_rest_api.py +0 -61
  11. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_rest_api_simple.py +9 -73
  12. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/test_custom_context.py +2 -2
  13. local_deep_research-0.5.0/src/local_deep_research/__version__.py +0 -1
  14. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/LICENSE +0 -0
  15. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/README.md +0 -0
  16. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/__init__.py +0 -0
  17. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/__init__.py +0 -0
  18. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/answer_decoding/__init__.py +0 -0
  19. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/answer_decoding/browsecomp_answer_decoder.py +0 -0
  20. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/README.md +0 -0
  21. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/__init__.py +0 -0
  22. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/adaptive_explorer.py +0 -0
  23. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/base_explorer.py +0 -0
  24. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/constraint_guided_explorer.py +0 -0
  25. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/diversity_explorer.py +0 -0
  26. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/parallel_explorer.py +0 -0
  27. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidate_exploration/progressive_explorer.py +0 -0
  28. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidates/__init__.py +0 -0
  29. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/candidates/base_candidate.py +0 -0
  30. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/README.md +0 -0
  31. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/__init__.py +0 -0
  32. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/base_constraint_checker.py +0 -0
  33. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/constraint_checker.py +0 -0
  34. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/constraint_satisfaction_tracker.py +0 -0
  35. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/dual_confidence_checker.py +0 -0
  36. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/evidence_analyzer.py +0 -0
  37. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/intelligent_constraint_relaxer.py +0 -0
  38. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/rejection_engine.py +0 -0
  39. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/strict_checker.py +0 -0
  40. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraint_checking/threshold_checker.py +0 -0
  41. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraints/__init__.py +0 -0
  42. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraints/base_constraint.py +0 -0
  43. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/constraints/constraint_analyzer.py +0 -0
  44. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/__init__.py +0 -0
  45. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/base_evidence.py +0 -0
  46. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/evaluator.py +0 -0
  47. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/evidence/requirements.py +0 -0
  48. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/__init__.py +0 -0
  49. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/base_filter.py +0 -0
  50. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py +0 -0
  51. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py +0 -0
  52. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/findings/base_findings.py +0 -0
  53. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/findings/repository.py +0 -0
  54. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/knowledge/__init__.py +0 -0
  55. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/knowledge/base_knowledge.py +0 -0
  56. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +0 -0
  57. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/query_generation/adaptive_query_generator.py +0 -0
  58. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/__init__.py +0 -0
  59. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/atomic_fact_question.py +0 -0
  60. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/base_question.py +0 -0
  61. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/browsecomp_question.py +0 -0
  62. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/decomposition_question.py +0 -0
  63. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/entity_aware_question.py +0 -0
  64. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/questions/standard_question.py +0 -0
  65. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/repositories/__init__.py +0 -0
  66. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/search_optimization/cross_constraint_manager.py +0 -0
  67. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/source_management/diversity_manager.py +0 -0
  68. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/__init__.py +0 -0
  69. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/adaptive_decomposition_strategy.py +0 -0
  70. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/base_strategy.py +0 -0
  71. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/browsecomp_entity_strategy.py +0 -0
  72. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/browsecomp_optimized_strategy.py +0 -0
  73. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/concurrent_dual_confidence_strategy.py +0 -0
  74. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/constrained_search_strategy.py +0 -0
  75. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/constraint_parallel_strategy.py +0 -0
  76. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/direct_search_strategy.py +0 -0
  77. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/dual_confidence_strategy.py +0 -0
  78. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/dual_confidence_with_rejection.py +0 -0
  79. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/early_stop_constrained_strategy.py +0 -0
  80. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/entity_aware_source_strategy.py +0 -0
  81. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/evidence_based_strategy.py +0 -0
  82. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/evidence_based_strategy_v2.py +0 -0
  83. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/focused_iteration_strategy.py +0 -0
  84. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/improved_evidence_based_strategy.py +0 -0
  85. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/iterative_reasoning_strategy.py +0 -0
  86. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +0 -0
  87. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/llm_driven_modular_strategy.py +0 -0
  88. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/modular_strategy.py +0 -0
  89. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/parallel_constrained_strategy.py +0 -0
  90. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +0 -0
  91. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +0 -0
  92. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/recursive_decomposition_strategy.py +0 -0
  93. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/smart_decomposition_strategy.py +0 -0
  94. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/smart_query_strategy.py +0 -0
  95. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/source_based_strategy.py +0 -0
  96. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/strategies/standard_strategy.py +0 -0
  97. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/__init__.py +0 -0
  98. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/base_tool.py +0 -0
  99. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +0 -0
  100. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/question_tools/__init__.py +0 -0
  101. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/advanced_search_system/tools/search_tools/__init__.py +0 -0
  102. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/api/__init__.py +0 -0
  103. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/api/benchmark_functions.py +0 -0
  104. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/api/research_functions.py +0 -0
  105. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/README.md +0 -0
  106. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/__init__.py +0 -0
  107. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/benchmark_functions.py +0 -0
  108. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/cli/__init__.py +0 -0
  109. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/cli/benchmark_commands.py +0 -0
  110. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/cli.py +0 -0
  111. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/comparison/__init__.py +0 -0
  112. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/comparison/evaluator.py +0 -0
  113. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/__init__.py +0 -0
  114. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/base.py +0 -0
  115. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/browsecomp.py +0 -0
  116. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/custom_dataset_template.py +0 -0
  117. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/simpleqa.py +0 -0
  118. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets/utils.py +0 -0
  119. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/datasets.py +0 -0
  120. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/efficiency/__init__.py +0 -0
  121. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/efficiency/resource_monitor.py +0 -0
  122. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/efficiency/speed_profiler.py +0 -0
  123. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/__init__.py +0 -0
  124. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/base.py +0 -0
  125. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/browsecomp.py +0 -0
  126. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/composite.py +0 -0
  127. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/evaluators/simpleqa.py +0 -0
  128. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/graders.py +0 -0
  129. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/README.md +0 -0
  130. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/__init__.py +0 -0
  131. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/calculation.py +0 -0
  132. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/reporting.py +0 -0
  133. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics/visualization.py +0 -0
  134. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/metrics.py +0 -0
  135. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/__init__.py +0 -0
  136. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/api.py +0 -0
  137. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/metrics.py +0 -0
  138. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/optimization/optuna_optimizer.py +0 -0
  139. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/runners.py +0 -0
  140. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/benchmarks/templates.py +0 -0
  141. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handler.py +0 -0
  142. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/__init__.py +0 -0
  143. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/base_citation_handler.py +0 -0
  144. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/forced_answer_citation_handler.py +0 -0
  145. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/precision_extraction_handler.py +0 -0
  146. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/citation_handlers/standard_citation_handler.py +0 -0
  147. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/config/__init__.py +0 -0
  148. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/config/llm_config.py +0 -0
  149. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/config/search_config.py +0 -0
  150. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/defaults/.env.template +0 -0
  151. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/defaults/__init__.py +0 -0
  152. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/defaults/default_settings.json +0 -0
  153. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/__init__.py +0 -0
  154. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/database.py +0 -0
  155. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/db_models.py +0 -0
  156. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_add_provider_to_token_usage.py +0 -0
  157. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_call_stack_tracking.py +0 -0
  158. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_enhanced_tracking.py +0 -0
  159. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/migrate_research_ratings.py +0 -0
  160. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/models.py +0 -0
  161. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/__init__.py +0 -0
  162. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/cost_calculator.py +0 -0
  163. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/pricing_cache.py +0 -0
  164. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/pricing/pricing_fetcher.py +0 -0
  165. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/query_utils.py +0 -0
  166. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/search_tracker.py +0 -0
  167. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/metrics/token_counter.py +0 -0
  168. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/migrate_db.py +0 -0
  169. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/report_generator.py +0 -0
  170. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/search_system.py +0 -0
  171. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/setup_data_dir.py +0 -0
  172. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/test_migration.py +0 -0
  173. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/__init__.py +0 -0
  174. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/db_utils.py +0 -0
  175. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/enums.py +0 -0
  176. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/es_utils.py +0 -0
  177. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/llm_utils.py +0 -0
  178. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/log_utils.py +0 -0
  179. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/search_cache.py +0 -0
  180. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/search_utilities.py +0 -0
  181. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/setup_utils.py +0 -0
  182. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/threading_utils.py +0 -0
  183. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/utilities/url_utils.py +0 -0
  184. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/__init__.py +0 -0
  185. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/api.py +0 -0
  186. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/app.py +0 -0
  187. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/app_factory.py +0 -0
  188. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/README.md +0 -0
  189. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/migrate_to_ldr_db.py +0 -0
  190. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/database/schema_upgrade.py +0 -0
  191. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/models/settings.py +0 -0
  192. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/api_routes.py +0 -0
  193. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/benchmark_routes.py +0 -0
  194. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/globals.py +0 -0
  195. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/history_routes.py +0 -0
  196. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/metrics_routes.py +0 -0
  197. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/routes/settings_routes.py +0 -0
  198. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/resource_service.py +0 -0
  199. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/settings_manager.py +0 -0
  200. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/settings_service.py +0 -0
  201. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/services/socket_service.py +0 -0
  202. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/css/custom_dropdown.css +0 -0
  203. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/css/settings.css +0 -0
  204. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/css/styles.css +0 -0
  205. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/custom_dropdown.js +0 -0
  206. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/detail.js +0 -0
  207. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/details.js +0 -0
  208. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/fallback/formatting.js +0 -0
  209. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/fallback/ui.js +0 -0
  210. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/history.js +0 -0
  211. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/logpanel.js +0 -0
  212. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/progress.js +0 -0
  213. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/research.js +0 -0
  214. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/results.js +0 -0
  215. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/settings.js +0 -0
  216. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/components/settings_sync.js +0 -0
  217. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/main.js +0 -0
  218. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/research_form.js +0 -0
  219. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/api.js +0 -0
  220. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/audio.js +0 -0
  221. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/formatting.js +0 -0
  222. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/keyboard.js +0 -0
  223. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/pdf.js +0 -0
  224. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/socket.js +0 -0
  225. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/js/services/ui.js +0 -0
  226. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/sounds/README.md +0 -0
  227. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/sounds/error.mp3 +0 -0
  228. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/static/sounds/success.mp3 +0 -0
  229. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/base.html +0 -0
  230. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/custom_dropdown.html +0 -0
  231. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/log_panel.html +0 -0
  232. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/mobile_nav.html +0 -0
  233. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/settings_form.html +0 -0
  234. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/components/sidebar.html +0 -0
  235. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/cost_analytics.html +0 -0
  236. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/details.html +0 -0
  237. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/history.html +0 -0
  238. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/metrics.html +0 -0
  239. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/progress.html +0 -0
  240. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/research.html +0 -0
  241. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/results.html +0 -0
  242. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/pages/star_reviews.html +0 -0
  243. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/templates/settings_dashboard.html +0 -0
  244. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/utils/__init__.py +0 -0
  245. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/utils/formatters.py +0 -0
  246. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web/utils/templates.py +0 -0
  247. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/__init__.py +0 -0
  248. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/default_search_engines.py +0 -0
  249. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/__init__.py +0 -0
  250. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/full_search.py +0 -0
  251. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/meta_search_engine.py +0 -0
  252. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py +0 -0
  253. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_brave.py +0 -0
  254. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_ddg.py +0 -0
  255. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py +0 -0
  256. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_github.py +0 -0
  257. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py +0 -0
  258. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_guardian.py +0 -0
  259. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_local.py +0 -0
  260. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_local_all.py +0 -0
  261. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py +0 -0
  262. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_searxng.py +0 -0
  263. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +0 -0
  264. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py +0 -0
  265. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_wayback.py +0 -0
  266. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +0 -0
  267. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/search_engine_base.py +0 -0
  268. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/search_engine_factory.py +0 -0
  269. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/src/local_deep_research/web_search_engines/search_engines_config.py +0 -0
  270. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/CI_INTEGRATION.md +0 -0
  271. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/README.md +0 -0
  272. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/TESTING_COMPARISON.md +0 -0
  273. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/TESTING_PROPOSAL.md +0 -0
  274. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/__init__.py +0 -0
  275. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/README.md +0 -0
  276. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/__init__.py +0 -0
  277. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/api_tests/test_api_pytest.py +0 -0
  278. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/conftest.py +0 -0
  279. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/debug_url_utils.py +0 -0
  280. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/download_stuff_for_local.py +0 -0
  281. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/IMPLEMENTATION_GUIDE_241.md +0 -0
  282. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/README.md +0 -0
  283. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/feature_tests/__init__.py +0 -0
  284. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fix_tests/README.md +0 -0
  285. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fix_tests/test_duplicate_links_fix.py +0 -0
  286. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fixtures/README.md +0 -0
  287. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/fixtures/search_engine_mocks.py +0 -0
  288. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/README.md +0 -0
  289. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/run_quick_health_check.py +0 -0
  290. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/test_endpoints_health.py +0 -0
  291. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/health_check/test_endpoints_health.sh +0 -0
  292. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/mock_fixtures.py +0 -0
  293. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/mock_llm_config.py +0 -0
  294. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/mock_modules.py +0 -0
  295. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/run_all_tests.py +0 -0
  296. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/search_engines/test_wikipedia_search.py +0 -0
  297. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/searxng/__init__.py +0 -0
  298. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/searxng/test_searxng.py +0 -0
  299. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/__init__.py +0 -0
  300. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/compare_strategies_visual.py +0 -0
  301. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/test_adaptive_strategy.py +0 -0
  302. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/test_iterative_reasoning.py +0 -0
  303. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/strategies/test_search_system_iterative.py +0 -0
  304. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_ci_config.py +0 -0
  305. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_citation_handler.py +0 -0
  306. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_google_pse.py +0 -0
  307. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_report_generator.py +0 -0
  308. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_research_strategy_orm.py +0 -0
  309. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_search_engines_enhanced.py +0 -0
  310. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_search_system.py +0 -0
  311. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_settings_manager.py +0 -0
  312. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_url_utils.py +0 -0
  313. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_url_utils_simple.py +0 -0
  314. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_utils.py +0 -0
  315. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/test_wikipedia_url_security.py +0 -0
  316. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/README.md +0 -0
  317. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/__init__.py +0 -0
  318. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/run_all_tests.js +0 -0
  319. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_charts.js +0 -0
  320. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_cost_analytics.js +0 -0
  321. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics.js +0 -0
  322. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_browser.js +0 -0
  323. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_chart.js +0 -0
  324. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_charts.js +0 -0
  325. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_metrics_only.js +0 -0
  326. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_network_requests.js +0 -0
  327. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_pages_browser.js +0 -0
  328. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_research_results.js +0 -0
  329. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_settings_errors.js +0 -0
  330. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_settings_page.js +0 -0
  331. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_settings_save.js +0 -0
  332. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_star_reviews.js +0 -0
  333. {local_deep_research-0.5.0 → local_deep_research-0.5.2}/tests/ui_tests/test_star_reviews_debug.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: local-deep-research
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: AI-powered research assistant with deep, iterative analysis using LLMs and web searches
5
5
  Author-Email: LearningCircuit <185559241+LearningCircuit@users.noreply.github.com>, HashedViking <6432677+HashedViking@users.noreply.github.com>
6
6
  License: MIT License
@@ -67,7 +67,7 @@ dependencies = [
67
67
  "kaleido==0.2.1",
68
68
  "aiohttp>=3.9.0",
69
69
  ]
70
- version = "0.5.0"
70
+ version = "0.5.2"
71
71
 
72
72
  [project.license]
73
73
  file = "LICENSE"
@@ -0,0 +1 @@
1
+ __version__ = "0.5.2"
@@ -2,7 +2,14 @@ from loguru import logger
2
2
  from sqlalchemy import inspect
3
3
 
4
4
  from ..services.settings_manager import SettingsManager
5
- from .models import Base, Journal, Setting, ResearchLog
5
+ from .models import (
6
+ Base,
7
+ Journal,
8
+ Setting,
9
+ ResearchLog,
10
+ Research,
11
+ ResearchHistory,
12
+ )
6
13
 
7
14
 
8
15
  def import_default_settings_file(db_session):
@@ -52,6 +59,14 @@ def run_migrations(engine, db_session=None):
52
59
  logger.info("Creating research logs table.")
53
60
  Base.metadata.create_all(engine, tables=[ResearchLog.__table__])
54
61
 
62
+ if not inspector.has_table(Research.__tablename__):
63
+ logger.info("Creating research table.")
64
+ Base.metadata.create_all(engine, tables=[Research.__table__])
65
+
66
+ if not inspector.has_table(ResearchHistory.__tablename__):
67
+ logger.info("Creating research table.")
68
+ Base.metadata.create_all(engine, tables=[ResearchHistory.__table__])
69
+
55
70
  # Import existing settings from files
56
71
  if db_session:
57
72
  import_default_settings_file(db_session)
@@ -34,6 +34,37 @@ class ResearchStatus(enum.Enum):
34
34
  CANCELLED = "cancelled"
35
35
 
36
36
 
37
+ class ResearchHistory(Base):
38
+ """Represents the research table."""
39
+
40
+ __tablename__ = "research_history"
41
+
42
+ # Unique identifier for each record.
43
+ id = Column(Integer, primary_key=True, autoincrement=True)
44
+ # The search query.
45
+ query = Column(Text, nullable=False)
46
+ # The mode of research (e.g., 'quick_summary', 'detailed_report').
47
+ mode = Column(Text, nullable=False)
48
+ # Current status of the research.
49
+ status = Column(Text, nullable=False)
50
+ # The timestamp when the research started.
51
+ created_at = Column(Text, nullable=False)
52
+ # The timestamp when the research was completed.
53
+ completed_at = Column(Text)
54
+ # Duration of the research in seconds.
55
+ duration_seconds = Column(Integer)
56
+ # Path to the generated report.
57
+ report_path = Column(Text)
58
+ # Additional metadata about the research.
59
+ research_meta = Column(JSON)
60
+ # Latest progress log message.
61
+ progress_log = Column(JSON)
62
+ # Current progress of the research (as a percentage).
63
+ progress = Column(Integer)
64
+ # Title of the research report.
65
+ title = Column(Text)
66
+
67
+
37
68
  class Research(Base):
38
69
  __tablename__ = "research"
39
70
 
@@ -54,14 +85,6 @@ class Research(Base):
54
85
  end_time = Column(DateTime, nullable=True)
55
86
  error_message = Column(Text, nullable=True)
56
87
 
57
- # Relationships
58
- report = relationship(
59
- "ResearchReport",
60
- back_populates="research",
61
- uselist=False,
62
- cascade="all, delete-orphan",
63
- )
64
-
65
88
 
66
89
  class ResearchLog(Base):
67
90
  __tablename__ = "app_logs"
@@ -88,29 +111,6 @@ class ResearchLog(Base):
88
111
  )
89
112
 
90
113
 
91
- class ResearchReport(Base):
92
- __tablename__ = "research_report"
93
-
94
- id = Column(Integer, primary_key=True, index=True)
95
- research_id = Column(
96
- Integer,
97
- ForeignKey("research.id", ondelete="CASCADE"),
98
- nullable=False,
99
- unique=True,
100
- )
101
- content = Column(Text, nullable=True)
102
- created_at = Column(DateTime, server_default=func.now(), nullable=False)
103
- updated_at = Column(
104
- DateTime, server_default=func.now(), onupdate=func.now(), nullable=False
105
- )
106
- report_metadata = Column(
107
- JSON, nullable=True
108
- ) # Additional metadata about the report
109
-
110
- # Relationships
111
- research = relationship("Research", back_populates="report")
112
-
113
-
114
114
  class SettingType(enum.Enum):
115
115
  APP = "app"
116
116
  LLM = "llm"
@@ -43,26 +43,6 @@ def init_db():
43
43
  conn = get_db_connection()
44
44
  cursor = conn.cursor()
45
45
 
46
- # Create the table if it doesn't exist
47
- cursor.execute(
48
- """
49
- CREATE TABLE IF NOT EXISTS research_history (
50
- id INTEGER PRIMARY KEY AUTOINCREMENT,
51
- query TEXT NOT NULL,
52
- mode TEXT NOT NULL,
53
- status TEXT NOT NULL,
54
- created_at TEXT NOT NULL,
55
- completed_at TEXT,
56
- duration_seconds INTEGER,
57
- report_path TEXT,
58
- metadata TEXT,
59
- progress_log TEXT,
60
- progress INTEGER,
61
- title TEXT
62
- )
63
- """
64
- )
65
-
66
46
  # Create a dedicated table for research logs
67
47
  cursor.execute(
68
48
  """
@@ -101,7 +81,7 @@ def init_db():
101
81
  columns = [column[1] for column in cursor.fetchall()]
102
82
 
103
83
  if "duration_seconds" not in columns:
104
- print(
84
+ logger.info(
105
85
  "Adding missing 'duration_seconds' column to research_history table"
106
86
  )
107
87
  cursor.execute(
@@ -110,16 +90,26 @@ def init_db():
110
90
 
111
91
  # Check if the progress column exists, add it if missing
112
92
  if "progress" not in columns:
113
- print("Adding missing 'progress' column to research_history table")
93
+ logger.info(
94
+ "Adding missing 'progress' column to research_history table"
95
+ )
114
96
  cursor.execute(
115
97
  "ALTER TABLE research_history ADD COLUMN progress INTEGER"
116
98
  )
117
99
 
118
100
  # Check if the title column exists, add it if missing
119
101
  if "title" not in columns:
120
- print("Adding missing 'title' column to research_history table")
102
+ logger.info("Adding missing 'title' column to research_history table")
121
103
  cursor.execute("ALTER TABLE research_history ADD COLUMN title TEXT")
122
104
 
105
+ # Check if the metadata column exists, and rename it to "research_meta"
106
+ # if it does.
107
+ if "metadata" in columns:
108
+ logger.info("Renaming 'metadata' column to 'research_meta'")
109
+ cursor.execute(
110
+ "ALTER TABLE research_history RENAME COLUMN metadata TO research_meta"
111
+ )
112
+
123
113
  # Enable foreign key support
124
114
  cursor.execute("PRAGMA foreign_keys = ON")
125
115
 
@@ -15,13 +15,18 @@ from flask import (
15
15
  )
16
16
  from loguru import logger
17
17
 
18
- from ..models.database import calculate_duration, get_db_connection
18
+ from ..models.database import (
19
+ calculate_duration,
20
+ get_db_connection,
21
+ )
19
22
  from ..services.research_service import (
20
23
  run_research_process,
21
24
  start_research_process,
22
25
  )
23
26
  from ..utils.templates import render_template_with_defaults
24
27
  from .globals import active_research, termination_flags
28
+ from ..database.models import ResearchHistory, ResearchLog
29
+ from ...utilities.db_utils import get_db_session
25
30
 
26
31
  # Create a Blueprint for the research application
27
32
  research_bp = Blueprint("research", __name__, url_prefix="/research")
@@ -220,20 +225,19 @@ def start_research():
220
225
  "questions_per_iteration": questions_per_iteration,
221
226
  }
222
227
 
223
- cursor.execute(
224
- "INSERT INTO research_history (query, mode, status, created_at, progress_log, metadata) VALUES (?, ?, ?, ?, ?, ?)",
225
- (
226
- query,
227
- mode,
228
- "in_progress",
229
- created_at,
230
- json.dumps([{"time": created_at, "progress": 0}]),
231
- json.dumps(research_settings),
232
- ),
233
- )
234
- research_id = cursor.lastrowid
235
- conn.commit()
236
- conn.close()
228
+ db_session = get_db_session()
229
+ with db_session:
230
+ research = ResearchHistory(
231
+ query=query,
232
+ mode=mode,
233
+ status="in_progress",
234
+ created_at=created_at,
235
+ progress_log=[{"time": created_at, "progress": 0}],
236
+ research_meta=research_settings,
237
+ )
238
+ db_session.add(research)
239
+ db_session.commit()
240
+ research_id = research.id
237
241
 
238
242
  # Start the research process with the selected parameters
239
243
  research_thread = start_research_process(
@@ -612,59 +616,30 @@ def get_history():
612
616
 
613
617
  @research_bp.route("/api/research/<int:research_id>")
614
618
  def get_research_details(research_id):
615
- """Get full details of a research"""
619
+ """Get full details of a research using ORM"""
616
620
  try:
617
- conn = get_db_connection()
618
- cursor = conn.cursor()
619
- cursor.execute(
620
- """SELECT id, query, status, progress, mode,
621
- created_at, completed_at, report_path, metadata
622
- FROM research_history WHERE id = ?""",
623
- (research_id,),
621
+ db_session = get_db_session()
622
+ research = (
623
+ db_session.query(ResearchHistory)
624
+ .filter(ResearchHistory.id == research_id)
625
+ .first()
624
626
  )
625
- result = cursor.fetchone()
626
627
 
627
- if result is None:
628
- conn.close()
628
+ if not research:
629
629
  return jsonify({"error": "Research not found"}), 404
630
630
 
631
- # Unpack the result
632
- (
633
- research_id,
634
- query,
635
- status,
636
- progress,
637
- mode,
638
- created_at,
639
- completed_at,
640
- report_path,
641
- metadata_str,
642
- ) = result
643
-
644
- # Parse metadata if it exists
645
- metadata = {}
646
- if metadata_str:
647
- try:
648
- metadata = json.loads(metadata_str)
649
- except json.JSONDecodeError:
650
- logger.warning(
651
- f"Invalid JSON in metadata for research {research_id}"
652
- )
653
-
654
- conn.close()
655
-
656
631
  return jsonify(
657
632
  {
658
- "id": research_id,
659
- "query": query,
660
- "status": status,
661
- "progress": progress,
662
- "progress_percentage": progress or 0,
663
- "mode": mode,
664
- "created_at": created_at,
665
- "completed_at": completed_at,
666
- "report_path": report_path,
667
- "metadata": metadata,
633
+ "id": research.id,
634
+ "query": research.query,
635
+ "status": research.status,
636
+ "progress": research.progress,
637
+ "progress_percentage": research.progress or 0,
638
+ "mode": research.mode,
639
+ "created_at": research.created_at,
640
+ "completed_at": research.completed_at,
641
+ "report_path": research.report_path,
642
+ "metadata": research.research_meta,
668
643
  }
669
644
  )
670
645
  except Exception as e:
@@ -676,50 +651,36 @@ def get_research_details(research_id):
676
651
  def get_research_logs(research_id):
677
652
  """Get logs for a specific research"""
678
653
  try:
679
- conn = get_db_connection()
680
- cursor = conn.cursor()
681
-
682
654
  # First check if the research exists
683
- cursor.execute(
684
- "SELECT id FROM research_history WHERE id = ?", (research_id,)
685
- )
686
- if cursor.fetchone() is None:
687
- conn.close()
688
- return jsonify({"error": "Research not found"}), 404
689
-
690
- # Get logs from research_logs table
691
- cursor.execute(
692
- """SELECT id, message, timestamp, log_type, progress, metadata
693
- FROM research_logs
694
- WHERE research_id = ?
695
- ORDER BY timestamp ASC""",
696
- (research_id,),
697
- )
655
+ db_session = get_db_session()
656
+ with db_session:
657
+ research = (
658
+ db_session.query(ResearchHistory)
659
+ .filter_by(id=research_id)
660
+ .first()
661
+ )
662
+ if not research:
663
+ return jsonify({"error": "Research not found"}), 404
664
+
665
+ # Get logs from research_logs table
666
+ log_results = (
667
+ db_session.query(ResearchLog)
668
+ .filter_by(research_id=research_id)
669
+ .order_by(ResearchLog.timestamp)
670
+ .all()
671
+ )
698
672
 
699
673
  logs = []
700
- for row in cursor.fetchall():
701
- log_id, message, timestamp, log_type, progress, metadata_str = row
702
-
703
- # Parse metadata if it exists
704
- metadata = {}
705
- if metadata_str:
706
- try:
707
- metadata = json.loads(metadata_str)
708
- except json.JSONDecodeError:
709
- pass
710
-
674
+ for row in log_results:
711
675
  logs.append(
712
676
  {
713
- "id": log_id,
714
- "message": message,
715
- "timestamp": timestamp,
716
- "log_type": log_type,
717
- "progress": progress,
718
- "metadata": metadata,
677
+ "id": row.id,
678
+ "message": row.message,
679
+ "timestamp": row.timestamp,
680
+ "log_type": row.level,
719
681
  }
720
682
  )
721
683
 
722
- conn.close()
723
684
  return jsonify(logs)
724
685
 
725
686
  except Exception as e:
@@ -730,27 +691,18 @@ def get_research_logs(research_id):
730
691
  @research_bp.route("/api/report/<int:research_id>")
731
692
  def get_research_report(research_id):
732
693
  """Get the research report content"""
733
- from ..database.models import Research
734
- from ...utilities.db_utils import get_db_session
735
-
736
694
  session = get_db_session()
737
695
  try:
738
696
  # Query using ORM
739
- research = session.query(Research).filter_by(id=research_id).first()
697
+ research = (
698
+ session.query(ResearchHistory).filter_by(id=research_id).first()
699
+ )
740
700
 
741
701
  if research is None:
742
702
  return jsonify({"error": "Research not found"}), 404
743
703
 
744
704
  # Parse metadata if it exists
745
- metadata = {}
746
- if research.metadata:
747
- try:
748
- metadata = json.loads(research.metadata)
749
- except json.JSONDecodeError:
750
- logger.warning(
751
- f"Invalid JSON in metadata for research {research_id}"
752
- )
753
-
705
+ metadata = research.research_meta
754
706
  # Check if report file exists
755
707
  if not research.report_path or not os.path.exists(research.report_path):
756
708
  return jsonify({"error": "Report file not found"}), 404
@@ -771,11 +723,11 @@ def get_research_report(research_id):
771
723
  "content": content,
772
724
  "metadata": {
773
725
  "query": research.query,
774
- "mode": research.mode.value if research.mode else None,
775
- "created_at": research.created_at.isoformat()
726
+ "mode": research.mode if research.mode else None,
727
+ "created_at": research.created_at
776
728
  if research.created_at
777
729
  else None,
778
- "completed_at": research.completed_at.isoformat()
730
+ "completed_at": research.completed_at
779
731
  if research.completed_at
780
732
  else None,
781
733
  "report_path": research.report_path,