realtimex-deeptutor 0.5.0.post2__tar.gz → 0.5.0.post3__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 (301) hide show
  1. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/PKG-INFO +1 -1
  2. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/pyproject.toml +2 -2
  3. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/PKG-INFO +1 -1
  4. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/SOURCES.txt +9 -0
  5. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/top_level.txt +1 -0
  6. realtimex_deeptutor-0.5.0.post3/scripts/__init__.py +1 -0
  7. realtimex_deeptutor-0.5.0.post3/scripts/audit_prompts.py +179 -0
  8. realtimex_deeptutor-0.5.0.post3/scripts/check_install.py +460 -0
  9. realtimex_deeptutor-0.5.0.post3/scripts/generate_roster.py +327 -0
  10. realtimex_deeptutor-0.5.0.post3/scripts/install_all.py +653 -0
  11. realtimex_deeptutor-0.5.0.post3/scripts/migrate_kb.py +655 -0
  12. realtimex_deeptutor-0.5.0.post3/scripts/start.py +807 -0
  13. realtimex_deeptutor-0.5.0.post3/scripts/start_web.py +632 -0
  14. realtimex_deeptutor-0.5.0.post3/scripts/sync_prompts_from_en.py +147 -0
  15. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/cli/start.py +58 -66
  16. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/unified_config.py +2 -2
  17. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/LICENSE +0 -0
  18. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/README.md +0 -0
  19. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor/__init__.py +0 -0
  20. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/dependency_links.txt +0 -0
  21. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/entry_points.txt +0 -0
  22. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/realtimex_deeptutor.egg-info/requires.txt +0 -0
  23. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/setup.cfg +0 -0
  24. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/__init__.py +0 -0
  25. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/__init__.py +0 -0
  26. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/base_agent.py +0 -0
  27. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/__init__.py +0 -0
  28. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/chat_agent.py +0 -0
  29. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/prompts/en/chat_agent.yaml +0 -0
  30. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/prompts/zh/chat_agent.yaml +0 -0
  31. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/chat/session_manager.py +0 -0
  32. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/__init__.py +0 -0
  33. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/edit_agent.py +0 -0
  34. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/narrator_agent.py +0 -0
  35. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/en/edit_agent.yaml +0 -0
  36. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/en/narrator_agent.yaml +0 -0
  37. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/zh/edit_agent.yaml +0 -0
  38. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/co_writer/prompts/zh/narrator_agent.yaml +0 -0
  39. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/__init__.py +0 -0
  40. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/__init__.py +0 -0
  41. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/chat_agent.py +0 -0
  42. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/interactive_agent.py +0 -0
  43. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/locate_agent.py +0 -0
  44. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/agents/summary_agent.py +0 -0
  45. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/guide_manager.py +0 -0
  46. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/chat_agent.yaml +0 -0
  47. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/interactive_agent.yaml +0 -0
  48. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/locate_agent.yaml +0 -0
  49. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/en/summary_agent.yaml +0 -0
  50. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/chat_agent.yaml +0 -0
  51. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/interactive_agent.yaml +0 -0
  52. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/locate_agent.yaml +0 -0
  53. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/guide/prompts/zh/summary_agent.yaml +0 -0
  54. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/__init__.py +0 -0
  55. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/idea_generation_workflow.py +0 -0
  56. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/material_organizer_agent.py +0 -0
  57. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/en/idea_generation.yaml +0 -0
  58. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/en/material_organizer.yaml +0 -0
  59. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/zh/idea_generation.yaml +0 -0
  60. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/ideagen/prompts/zh/material_organizer.yaml +0 -0
  61. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/__init__.py +0 -0
  62. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/__init__.py +0 -0
  63. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/generate_agent.py +0 -0
  64. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/relevance_analyzer.py +0 -0
  65. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/agents/retrieve_agent.py +0 -0
  66. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/coordinator.py +0 -0
  67. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/example.py +0 -0
  68. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/coordinator.yaml +0 -0
  69. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/generate_agent.yaml +0 -0
  70. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/relevance_analyzer.yaml +0 -0
  71. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/en/retrieve_agent.yaml +0 -0
  72. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/coordinator.yaml +0 -0
  73. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/generate_agent.yaml +0 -0
  74. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/relevance_analyzer.yaml +0 -0
  75. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/question/prompts/zh/retrieve_agent.yaml +0 -0
  76. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/__init__.py +0 -0
  77. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/decompose_agent.py +0 -0
  78. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/manager_agent.py +0 -0
  79. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/note_agent.py +0 -0
  80. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/rephrase_agent.py +0 -0
  81. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/reporting_agent.py +0 -0
  82. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/agents/research_agent.py +0 -0
  83. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/data_structures.py +0 -0
  84. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/main.py +0 -0
  85. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/decompose_agent.yaml +0 -0
  86. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/manager_agent.yaml +0 -0
  87. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/note_agent.yaml +0 -0
  88. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/rephrase_agent.yaml +0 -0
  89. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/reporting_agent.yaml +0 -0
  90. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/en/research_agent.yaml +0 -0
  91. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/decompose_agent.yaml +0 -0
  92. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/manager_agent.yaml +0 -0
  93. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/note_agent.yaml +0 -0
  94. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/rephrase_agent.yaml +0 -0
  95. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/reporting_agent.yaml +0 -0
  96. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/prompts/zh/research_agent.yaml +0 -0
  97. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/research_pipeline.py +0 -0
  98. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/__init__.py +0 -0
  99. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/citation_manager.py +0 -0
  100. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/json_utils.py +0 -0
  101. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/research/utils/token_tracker.py +0 -0
  102. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/__init__.py +0 -0
  103. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/analysis_loop/__init__.py +0 -0
  104. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/analysis_loop/investigate_agent.py +0 -0
  105. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/analysis_loop/note_agent.py +0 -0
  106. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/main_solver.py +0 -0
  107. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/__init__.py +0 -0
  108. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/citation_memory.py +0 -0
  109. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/investigate_memory.py +0 -0
  110. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/memory/solve_memory.py +0 -0
  111. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/analysis_loop/investigate_agent.yaml +0 -0
  112. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/analysis_loop/note_agent.yaml +0 -0
  113. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/manager_agent.yaml +0 -0
  114. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/precision_answer_agent.yaml +0 -0
  115. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/response_agent.yaml +0 -0
  116. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/solve_agent.yaml +0 -0
  117. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/en/solve_loop/tool_agent.yaml +0 -0
  118. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/analysis_loop/investigate_agent.yaml +0 -0
  119. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/analysis_loop/note_agent.yaml +0 -0
  120. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/manager_agent.yaml +0 -0
  121. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/precision_answer_agent.yaml +0 -0
  122. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/response_agent.yaml +0 -0
  123. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/solve_agent.yaml +0 -0
  124. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/prompts/zh/solve_loop/tool_agent.yaml +0 -0
  125. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/session_manager.py +0 -0
  126. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/__init__.py +0 -0
  127. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/citation_manager.py +0 -0
  128. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/manager_agent.py +0 -0
  129. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/precision_answer_agent.py +0 -0
  130. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/response_agent.py +0 -0
  131. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/solve_agent.py +0 -0
  132. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/solve_loop/tool_agent.py +0 -0
  133. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/__init__.py +0 -0
  134. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/config_validator.py +0 -0
  135. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/display_manager.py +0 -0
  136. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/error_handler.py +0 -0
  137. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/json_utils.py +0 -0
  138. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/performance_monitor.py +0 -0
  139. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/agents/solve/utils/token_tracker.py +0 -0
  140. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/__init__.py +0 -0
  141. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/main.py +0 -0
  142. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/__init__.py +0 -0
  143. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/agent_config.py +0 -0
  144. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/chat.py +0 -0
  145. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/co_writer.py +0 -0
  146. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/config.py +0 -0
  147. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/dashboard.py +0 -0
  148. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/guide.py +0 -0
  149. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/ideagen.py +0 -0
  150. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/knowledge.py +0 -0
  151. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/notebook.py +0 -0
  152. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/question.py +0 -0
  153. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/realtimex.py +0 -0
  154. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/research.py +0 -0
  155. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/settings.py +0 -0
  156. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/solve.py +0 -0
  157. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/routers/system.py +0 -0
  158. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/run_server.py +0 -0
  159. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/history.py +0 -0
  160. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/log_interceptor.py +0 -0
  161. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/notebook_manager.py +0 -0
  162. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/progress_broadcaster.py +0 -0
  163. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/api/utils/task_id_manager.py +0 -0
  164. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/cli/__init__.py +0 -0
  165. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/__init__.py +0 -0
  166. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/accessors.py +0 -0
  167. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/constants.py +0 -0
  168. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/defaults.py +0 -0
  169. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/schema.py +0 -0
  170. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/config/settings.py +0 -0
  171. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/core/errors.py +0 -0
  172. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/__init__.py +0 -0
  173. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/add_documents.py +0 -0
  174. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/config.py +0 -0
  175. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/example_add_documents.py +0 -0
  176. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/extract_numbered_items.py +0 -0
  177. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/initializer.py +0 -0
  178. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/kb.py +0 -0
  179. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/manager.py +0 -0
  180. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/progress_tracker.py +0 -0
  181. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/knowledge/start_kb.py +0 -0
  182. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/__init__.py +0 -0
  183. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/adapters/__init__.py +0 -0
  184. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/adapters/lightrag.py +0 -0
  185. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/adapters/llamaindex.py +0 -0
  186. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/config.py +0 -0
  187. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/__init__.py +0 -0
  188. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/console.py +0 -0
  189. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/file.py +0 -0
  190. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/handlers/websocket.py +0 -0
  191. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/logger.py +0 -0
  192. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/stats/__init__.py +0 -0
  193. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/logging/stats/llm_stats.py +0 -0
  194. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/__init__.py +0 -0
  195. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/__init__.py +0 -0
  196. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/knowledge_base_config.py +0 -0
  197. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/config/loader.py +0 -0
  198. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/__init__.py +0 -0
  199. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/__init__.py +0 -0
  200. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/base.py +0 -0
  201. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/cohere.py +0 -0
  202. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/jina.py +0 -0
  203. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/ollama.py +0 -0
  204. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/openai_compatible.py +0 -0
  205. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/adapters/realtimex.py +0 -0
  206. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/client.py +0 -0
  207. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/config.py +0 -0
  208. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/embedding/provider.py +0 -0
  209. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/__init__.py +0 -0
  210. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/capabilities.py +0 -0
  211. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/client.py +0 -0
  212. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/cloud_provider.py +0 -0
  213. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/config.py +0 -0
  214. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/error_mapping.py +0 -0
  215. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/exceptions.py +0 -0
  216. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/factory.py +0 -0
  217. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/local_provider.py +0 -0
  218. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/providers/anthropic.py +0 -0
  219. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/providers/base_provider.py +0 -0
  220. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/providers/open_ai.py +0 -0
  221. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/realtimex_provider.py +0 -0
  222. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/registry.py +0 -0
  223. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/telemetry.py +0 -0
  224. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/types.py +0 -0
  225. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/llm/utils.py +0 -0
  226. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/prompt/__init__.py +0 -0
  227. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/prompt/manager.py +0 -0
  228. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/__init__.py +0 -0
  229. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/__init__.py +0 -0
  230. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/base.py +0 -0
  231. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/__init__.py +0 -0
  232. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/base.py +0 -0
  233. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/fixed.py +0 -0
  234. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/numbered_item.py +0 -0
  235. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/chunkers/semantic.py +0 -0
  236. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/embedders/__init__.py +0 -0
  237. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/embedders/base.py +0 -0
  238. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/embedders/openai.py +0 -0
  239. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/__init__.py +0 -0
  240. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/base.py +0 -0
  241. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/graph.py +0 -0
  242. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/lightrag.py +0 -0
  243. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/indexers/vector.py +0 -0
  244. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/__init__.py +0 -0
  245. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/base.py +0 -0
  246. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/markdown.py +0 -0
  247. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/pdf.py +0 -0
  248. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/parsers/text.py +0 -0
  249. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/__init__.py +0 -0
  250. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/base.py +0 -0
  251. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/dense.py +0 -0
  252. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/hybrid.py +0 -0
  253. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/retrievers/lightrag.py +0 -0
  254. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/components/routing.py +0 -0
  255. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/factory.py +0 -0
  256. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipeline.py +0 -0
  257. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/__init__.py +0 -0
  258. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/lightrag.py +0 -0
  259. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/llamaindex.py +0 -0
  260. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/raganything.py +0 -0
  261. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/pipelines/raganything_docling.py +0 -0
  262. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/service.py +0 -0
  263. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/types.py +0 -0
  264. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/utils/__init__.py +0 -0
  265. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/rag/utils/image_migration.py +0 -0
  266. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/__init__.py +0 -0
  267. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/base.py +0 -0
  268. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/consolidation.py +0 -0
  269. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/__init__.py +0 -0
  270. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/baidu.py +0 -0
  271. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/exa.py +0 -0
  272. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/jina.py +0 -0
  273. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/perplexity.py +0 -0
  274. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/serper.py +0 -0
  275. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/providers/tavily.py +0 -0
  276. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/search/types.py +0 -0
  277. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/settings/__init__.py +0 -0
  278. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/settings/interface_settings.py +0 -0
  279. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/setup/__init__.py +0 -0
  280. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/setup/init.py +0 -0
  281. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/tts/__init__.py +0 -0
  282. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/services/tts/config.py +0 -0
  283. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/__init__.py +0 -0
  284. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/code_executor.py +0 -0
  285. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/paper_search_tool.py +0 -0
  286. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/query_item_tool.py +0 -0
  287. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/__init__.py +0 -0
  288. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/exam_mimic.py +0 -0
  289. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/pdf_parser.py +0 -0
  290. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/question/question_extractor.py +0 -0
  291. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/rag_tool.py +0 -0
  292. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/tex_chunker.py +0 -0
  293. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/tex_downloader.py +0 -0
  294. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/tools/web_search.py +0 -0
  295. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/config_manager.py +0 -0
  296. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/document_validator.py +0 -0
  297. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/error_rate_tracker.py +0 -0
  298. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/error_utils.py +0 -0
  299. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/json_parser.py +0 -0
  300. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/network/circuit_breaker.py +0 -0
  301. {realtimex_deeptutor-0.5.0.post2 → realtimex_deeptutor-0.5.0.post3}/src/utils/realtimex.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: realtimex-deeptutor
3
- Version: 0.5.0.post2
3
+ Version: 0.5.0.post3
4
4
  Summary: RealTimeX DeepTutor - Intelligent learning companion with multi-agent collaboration and LightRAG
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "realtimex-deeptutor"
10
- version = "0.5.0.post2"
10
+ version = "0.5.0.post3"
11
11
  description = "RealTimeX DeepTutor - Intelligent learning companion with multi-agent collaboration and LightRAG"
12
12
  requires-python = ">=3.10"
13
13
  readme = "README.md"
@@ -90,7 +90,7 @@ deeptutor-backend = "src.api.run_server:main"
90
90
 
91
91
  [tool.setuptools.packages.find]
92
92
  where = ["."]
93
- include = ["src*", "realtimex_deeptutor*"]
93
+ include = ["src*", "realtimex_deeptutor*", "scripts*"]
94
94
 
95
95
  [tool.setuptools.package-data]
96
96
  # Include non-Python files in the package distribution
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: realtimex-deeptutor
3
- Version: 0.5.0.post2
3
+ Version: 0.5.0.post3
4
4
  Summary: RealTimeX DeepTutor - Intelligent learning companion with multi-agent collaboration and LightRAG
5
5
  License: Apache-2.0
6
6
  Requires-Python: >=3.10
@@ -8,6 +8,15 @@ realtimex_deeptutor.egg-info/dependency_links.txt
8
8
  realtimex_deeptutor.egg-info/entry_points.txt
9
9
  realtimex_deeptutor.egg-info/requires.txt
10
10
  realtimex_deeptutor.egg-info/top_level.txt
11
+ scripts/__init__.py
12
+ scripts/audit_prompts.py
13
+ scripts/check_install.py
14
+ scripts/generate_roster.py
15
+ scripts/install_all.py
16
+ scripts/migrate_kb.py
17
+ scripts/start.py
18
+ scripts/start_web.py
19
+ scripts/sync_prompts_from_en.py
11
20
  src/__init__.py
12
21
  src/agents/__init__.py
13
22
  src/agents/base_agent.py
@@ -0,0 +1 @@
1
+ # Scripts package - included for package distribution
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ Audit prompt parity between prompts/en and prompts/zh|prompts/cn.
6
+
7
+ Checks:
8
+ - Missing/extra keys (recursive)
9
+ - Placeholder drift in string templates (e.g. {question}, {context})
10
+
11
+ Usage:
12
+ python scripts/audit_prompts.py
13
+ python scripts/audit_prompts.py --fail
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ from dataclasses import dataclass
20
+ from pathlib import Path
21
+ import re
22
+ import sys
23
+ from typing import Any, Iterable
24
+
25
+ import yaml
26
+
27
+ PROJECT_ROOT = Path(__file__).resolve().parents[1]
28
+ AGENTS_DIR = PROJECT_ROOT / "src" / "agents"
29
+
30
+ # Template placeholders are expected to be like {topic}, {knowledge_title}, etc.
31
+ # Avoid false positives from LaTeX (\frac{1}{3}) and Mermaid (B{{Processing}}).
32
+ PLACEHOLDER_RE = re.compile(r"(?<!\{)\{[A-Za-z_][A-Za-z0-9_]*\}(?!\})")
33
+
34
+
35
+ def _load_yaml(path: Path) -> Any:
36
+ with open(path, encoding="utf-8") as f:
37
+ return yaml.safe_load(f) or {}
38
+
39
+
40
+ def _iter_yaml_files(root: Path) -> Iterable[Path]:
41
+ if not root.exists():
42
+ return []
43
+ return sorted([p for p in root.rglob("*.yaml") if p.is_file()])
44
+
45
+
46
+ def _get_placeholders(value: Any) -> set[str]:
47
+ found: set[str] = set()
48
+ if isinstance(value, str):
49
+ found |= set(PLACEHOLDER_RE.findall(value))
50
+ elif isinstance(value, dict):
51
+ for v in value.values():
52
+ found |= _get_placeholders(v)
53
+ elif isinstance(value, list):
54
+ for v in value:
55
+ found |= _get_placeholders(v)
56
+ return found
57
+
58
+
59
+ def _collect_keys(value: Any, prefix: str = "") -> set[str]:
60
+ """
61
+ Collect dotted key paths for all dict nodes.
62
+ Leaves (non-dict) are also included as paths.
63
+ """
64
+ keys: set[str] = set()
65
+ if isinstance(value, dict):
66
+ for k, v in value.items():
67
+ path = f"{prefix}.{k}" if prefix else str(k)
68
+ keys.add(path)
69
+ keys |= _collect_keys(v, path)
70
+ elif isinstance(value, list):
71
+ # Lists: we don't expand indices; still consider it a leaf container.
72
+ if prefix:
73
+ keys.add(prefix)
74
+ else:
75
+ if prefix:
76
+ keys.add(prefix)
77
+ return keys
78
+
79
+
80
+ @dataclass
81
+ class Diff:
82
+ missing_zh: list[str]
83
+ extra_zh: list[str]
84
+ placeholder_missing_zh: list[str]
85
+ placeholder_extra_zh: list[str]
86
+
87
+
88
+ def _diff(en_obj: Any, zh_obj: Any) -> Diff:
89
+ en_keys = _collect_keys(en_obj)
90
+ zh_keys = _collect_keys(zh_obj)
91
+
92
+ en_ph = _get_placeholders(en_obj)
93
+ zh_ph = _get_placeholders(zh_obj)
94
+
95
+ return Diff(
96
+ missing_zh=sorted(en_keys - zh_keys),
97
+ extra_zh=sorted(zh_keys - en_keys),
98
+ placeholder_missing_zh=sorted(en_ph - zh_ph),
99
+ placeholder_extra_zh=sorted(zh_ph - en_ph),
100
+ )
101
+
102
+
103
+ def main() -> int:
104
+ parser = argparse.ArgumentParser()
105
+ parser.add_argument("--fail", action="store_true", help="exit non-zero on any issue")
106
+ args = parser.parse_args()
107
+
108
+ if not AGENTS_DIR.exists():
109
+ print(f"Agents directory not found: {AGENTS_DIR}", file=sys.stderr)
110
+ return 2
111
+
112
+ issues = 0
113
+
114
+ for module_dir in sorted([p for p in AGENTS_DIR.iterdir() if p.is_dir()]):
115
+ prompts_dir = module_dir / "prompts"
116
+ en_dir = prompts_dir / "en"
117
+ if not en_dir.exists():
118
+ continue
119
+
120
+ # Prefer zh if exists, else cn if exists (but we also compare against cn if present)
121
+ zh_dir = prompts_dir / "zh"
122
+ cn_dir = prompts_dir / "cn"
123
+
124
+ for en_file in _iter_yaml_files(en_dir):
125
+ rel = en_file.relative_to(en_dir)
126
+ candidates = []
127
+ if zh_dir.exists():
128
+ candidates.append(("zh", zh_dir / rel))
129
+ if cn_dir.exists():
130
+ candidates.append(("cn", cn_dir / rel))
131
+
132
+ if not candidates:
133
+ continue
134
+
135
+ en_obj = _load_yaml(en_file)
136
+
137
+ for lang_name, zh_file in candidates:
138
+ if not zh_file.exists():
139
+ issues += 1
140
+ print(f"[MISSING {lang_name}] {module_dir.name}: {rel.as_posix()}")
141
+ continue
142
+
143
+ zh_obj = _load_yaml(zh_file)
144
+ d = _diff(en_obj, zh_obj)
145
+
146
+ if d.missing_zh or d.extra_zh or d.placeholder_missing_zh or d.placeholder_extra_zh:
147
+ issues += 1
148
+ print(f"[DIFF {lang_name}] {module_dir.name}: {rel.as_posix()}")
149
+ if d.missing_zh:
150
+ print(" - missing keys:")
151
+ for k in d.missing_zh[:50]:
152
+ print(f" - {k}")
153
+ if len(d.missing_zh) > 50:
154
+ print(f" ... ({len(d.missing_zh) - 50} more)")
155
+ if d.extra_zh:
156
+ print(" - extra keys:")
157
+ for k in d.extra_zh[:50]:
158
+ print(f" - {k}")
159
+ if len(d.extra_zh) > 50:
160
+ print(f" ... ({len(d.extra_zh) - 50} more)")
161
+ if d.placeholder_missing_zh:
162
+ print(" - missing placeholders:")
163
+ for p in d.placeholder_missing_zh:
164
+ print(f" - {p}")
165
+ if d.placeholder_extra_zh:
166
+ print(" - extra placeholders:")
167
+ for p in d.placeholder_extra_zh:
168
+ print(f" - {p}")
169
+
170
+ if issues == 0:
171
+ print("OK: prompts are structurally aligned (keys/placeholders).")
172
+ return 0
173
+
174
+ print(f"Found {issues} prompt parity issue(s).")
175
+ return 1 if args.fail else 0
176
+
177
+
178
+ if __name__ == "__main__":
179
+ raise SystemExit(main())
@@ -0,0 +1,460 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ DeepTutor Installation Checker
4
+
5
+ Verifies that all required dependencies are correctly installed.
6
+ Run this script to diagnose installation issues.
7
+ """
8
+
9
+ import importlib.metadata
10
+ import os
11
+ from pathlib import Path
12
+ import shutil
13
+ import subprocess
14
+ import sys
15
+
16
+ # Set Windows console UTF-8 encoding
17
+ if sys.platform == "win32":
18
+ import io
19
+
20
+ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
21
+ sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")
22
+
23
+
24
+ # Color codes for terminal output
25
+ class Colors:
26
+ RED = "\033[0;31m"
27
+ GREEN = "\033[0;32m"
28
+ YELLOW = "\033[1;33m"
29
+ BLUE = "\033[0;34m"
30
+ CYAN = "\033[0;36m"
31
+ NC = "\033[0m" # No Color
32
+
33
+ @classmethod
34
+ def disable(cls):
35
+ """Disable colors for non-TTY output"""
36
+ cls.RED = cls.GREEN = cls.YELLOW = cls.BLUE = cls.CYAN = cls.NC = ""
37
+
38
+
39
+ # Disable colors if not a TTY
40
+ if not sys.stdout.isatty():
41
+ Colors.disable()
42
+
43
+
44
+ def print_header(message: str):
45
+ """Print section header"""
46
+ print(f"\n{'=' * 60}")
47
+ print(f"📋 {message}")
48
+ print("=" * 60)
49
+
50
+
51
+ def print_success(message: str):
52
+ """Print success message"""
53
+ print(f"{Colors.GREEN}✅ {message}{Colors.NC}")
54
+
55
+
56
+ def print_error(message: str):
57
+ """Print error message"""
58
+ print(f"{Colors.RED}❌ {message}{Colors.NC}")
59
+
60
+
61
+ def print_warning(message: str):
62
+ """Print warning message"""
63
+ print(f"{Colors.YELLOW}⚠️ {message}{Colors.NC}")
64
+
65
+
66
+ def print_info(message: str):
67
+ """Print info message"""
68
+ print(f"{Colors.CYAN}ℹ️ {message}{Colors.NC}")
69
+
70
+
71
+ def get_package_version(package_name: str) -> str | None:
72
+ """Get installed package version"""
73
+ try:
74
+ return importlib.metadata.version(package_name)
75
+ except importlib.metadata.PackageNotFoundError:
76
+ return None
77
+
78
+
79
+ def check_python_environment() -> bool:
80
+ """Check Python environment"""
81
+ print_header("Python Environment")
82
+
83
+ all_ok = True
84
+
85
+ # Python version
86
+ py_version = sys.version_info
87
+ print_info(f"Python version: {py_version.major}.{py_version.minor}.{py_version.micro}")
88
+
89
+ if py_version >= (3, 10):
90
+ print_success(f"Python {py_version.major}.{py_version.minor} meets requirement (>=3.10)")
91
+ else:
92
+ print_error(f"Python {py_version.major}.{py_version.minor} is below requirement (>=3.10)")
93
+ all_ok = False
94
+
95
+ # Python executable
96
+ print_info(f"Python executable: {sys.executable}")
97
+
98
+ # Virtual environment
99
+ in_venv = hasattr(sys, "real_prefix") or (
100
+ hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
101
+ )
102
+ conda_env = os.environ.get("CONDA_DEFAULT_ENV")
103
+
104
+ if conda_env:
105
+ print_success(f"Conda environment: {conda_env}")
106
+ elif in_venv:
107
+ print_success(f"Virtual environment: {sys.prefix}")
108
+ else:
109
+ print_warning("No isolated environment detected (recommended: use conda or venv)")
110
+
111
+ return all_ok
112
+
113
+
114
+ def check_backend_packages() -> tuple[bool, int, int]:
115
+ """Check backend Python packages"""
116
+ print_header("Backend Dependencies")
117
+
118
+ # Required packages: (pip_name, import_name, min_version, is_optional)
119
+ packages = [
120
+ # Core
121
+ ("python-dotenv", "dotenv", "1.0.0", False),
122
+ ("PyYAML", "yaml", "6.0", False),
123
+ ("tiktoken", "tiktoken", "0.5.0", False),
124
+ ("jinja2", "jinja2", "3.1.0", False),
125
+ # HTTP & API
126
+ ("requests", "requests", "2.32.0", False),
127
+ ("openai", "openai", "1.30.0", False),
128
+ ("anthropic", "anthropic", "0.30.0", False),
129
+ ("aiohttp", "aiohttp", "3.9.0", False),
130
+ ("httpx", "httpx", "0.27.0", False),
131
+ # Async
132
+ ("nest-asyncio", "nest_asyncio", "1.5.8", False),
133
+ ("tenacity", "tenacity", "8.0.0", False),
134
+ # Web framework
135
+ ("fastapi", "fastapi", "0.100.0", False),
136
+ ("uvicorn", "uvicorn", "0.24.0", False),
137
+ ("websockets", "websockets", "12.0", False),
138
+ ("pydantic", "pydantic", "2.0.0", False),
139
+ # RAG
140
+ ("lightrag-hku", "lightrag", "1.0.0", False),
141
+ ("raganything", "raganything", "0.1.0", False),
142
+ ("llama-index", "llama_index", "0.14.0", False),
143
+ # Document parsing
144
+ ("docling", "docling", "2.31.0", True), # Optional
145
+ ("PyMuPDF", "fitz", "1.26.0", False),
146
+ # Academic
147
+ ("arxiv", "arxiv", "2.0.0", False),
148
+ # Optional API clients
149
+ ("perplexityai", "perplexity", "0.1.0", True),
150
+ ("dashscope", "dashscope", "1.14.0", True),
151
+ ]
152
+
153
+ installed = 0
154
+ missing = 0
155
+ all_ok = True
156
+
157
+ for pip_name, import_name, min_version, is_optional in packages:
158
+ try:
159
+ __import__(import_name)
160
+ version = get_package_version(pip_name)
161
+ version_str = f" (v{version})" if version else ""
162
+ print_success(f" ✓ {pip_name}{version_str}")
163
+ installed += 1
164
+ except ImportError:
165
+ if is_optional:
166
+ print_warning(f" ⚠ {pip_name} not installed (optional)")
167
+ else:
168
+ print_error(f" ✗ {pip_name} not installed")
169
+ all_ok = False
170
+ missing += 1
171
+
172
+ return all_ok, installed, missing
173
+
174
+
175
+ def check_frontend_packages(project_root: Path) -> tuple[bool, int, int]:
176
+ """Check frontend Node.js packages"""
177
+ print_header("Frontend Dependencies")
178
+
179
+ web_dir = project_root / "web"
180
+ node_modules = web_dir / "node_modules"
181
+ package_json = web_dir / "package.json"
182
+
183
+ installed = 0
184
+ missing = 0
185
+ all_ok = True
186
+
187
+ # Check npm
188
+ npm_path = shutil.which("npm")
189
+ if npm_path:
190
+ try:
191
+ result = subprocess.run(
192
+ ["npm", "--version"],
193
+ capture_output=True,
194
+ text=True,
195
+ timeout=10,
196
+ )
197
+ npm_version = result.stdout.strip()
198
+ print_success(f"npm available (v{npm_version})")
199
+ except Exception:
200
+ print_warning("npm found but version check failed")
201
+ else:
202
+ print_error("npm not found - Node.js is required for frontend")
203
+ all_ok = False
204
+
205
+ # Check node
206
+ node_path = shutil.which("node")
207
+ if node_path:
208
+ try:
209
+ result = subprocess.run(
210
+ ["node", "--version"],
211
+ capture_output=True,
212
+ text=True,
213
+ timeout=10,
214
+ )
215
+ node_version = result.stdout.strip()
216
+ print_success(f"Node.js available ({node_version})")
217
+ except Exception:
218
+ print_warning("Node.js found but version check failed")
219
+ else:
220
+ print_error("Node.js not found")
221
+ all_ok = False
222
+
223
+ # Check package.json exists
224
+ if not package_json.exists():
225
+ print_error(f"package.json not found: {package_json}")
226
+ return False, 0, 0
227
+
228
+ # Check node_modules
229
+ if not node_modules.exists():
230
+ print_error("node_modules directory does not exist")
231
+ print_info("Run 'npm install' in web/ directory to install dependencies")
232
+ return False, 0, 0
233
+
234
+ # Check key packages
235
+ key_packages = [
236
+ "next",
237
+ "react",
238
+ "react-dom",
239
+ "typescript",
240
+ "tailwindcss",
241
+ "@radix-ui/react-dialog",
242
+ "lucide-react",
243
+ ]
244
+
245
+ print_info("Checking key frontend packages...")
246
+
247
+ for pkg in key_packages:
248
+ pkg_dir = node_modules / pkg
249
+ if pkg_dir.exists():
250
+ # Try to get version from package.json
251
+ pkg_json = pkg_dir / "package.json"
252
+ version = ""
253
+ if pkg_json.exists():
254
+ try:
255
+ import json
256
+
257
+ with open(pkg_json) as f:
258
+ data = json.load(f)
259
+ version = f" (v{data.get('version', '?')})"
260
+ except Exception:
261
+ pass
262
+ print_success(f" ✓ {pkg}{version}")
263
+ installed += 1
264
+ else:
265
+ print_error(f" ✗ {pkg} not installed")
266
+ missing += 1
267
+ all_ok = False
268
+
269
+ return all_ok, installed, missing
270
+
271
+
272
+ def check_system_tools() -> bool:
273
+ """Check system tools and utilities"""
274
+ print_header("System Tools")
275
+
276
+ all_ok = True
277
+
278
+ # Git
279
+ git_path = shutil.which("git")
280
+ if git_path:
281
+ try:
282
+ result = subprocess.run(
283
+ ["git", "--version"],
284
+ capture_output=True,
285
+ text=True,
286
+ timeout=10,
287
+ )
288
+ git_version = result.stdout.strip()
289
+ print_success(f"{git_version}")
290
+ except Exception:
291
+ print_warning("git found but version check failed")
292
+ else:
293
+ print_warning("git not found (optional but recommended)")
294
+
295
+ # uv (fast Python package manager)
296
+ uv_path = shutil.which("uv")
297
+ if uv_path:
298
+ try:
299
+ result = subprocess.run(
300
+ ["uv", "--version"],
301
+ capture_output=True,
302
+ text=True,
303
+ timeout=10,
304
+ )
305
+ uv_version = result.stdout.strip()
306
+ print_success(f"uv available ({uv_version})")
307
+ except Exception:
308
+ print_warning("uv found but version check failed")
309
+ else:
310
+ print_info("uv not found (optional, for faster package installation)")
311
+
312
+ return all_ok
313
+
314
+
315
+ def check_env_file(project_root: Path) -> bool:
316
+ """Check .env file configuration"""
317
+ print_header("Environment Configuration")
318
+
319
+ env_file = project_root / ".env"
320
+ env_example = project_root / ".env.example"
321
+
322
+ if env_file.exists():
323
+ print_success(".env file exists")
324
+
325
+ # Check for required keys (without revealing values)
326
+ required_keys = [
327
+ "OPENAI_API_KEY",
328
+ ]
329
+ optional_keys = [
330
+ "ANTHROPIC_API_KEY",
331
+ "PERPLEXITY_API_KEY",
332
+ "DASHSCOPE_API_KEY",
333
+ ]
334
+
335
+ try:
336
+ with open(env_file) as f:
337
+ content = f.read()
338
+ lines = content.split("\n")
339
+ env_vars = {}
340
+ for line in lines:
341
+ line = line.strip()
342
+ if line and not line.startswith("#") and "=" in line:
343
+ key = line.split("=")[0].strip()
344
+ value = line.split("=", 1)[1].strip() if "=" in line else ""
345
+ env_vars[key] = value
346
+
347
+ for key in required_keys:
348
+ if key in env_vars and env_vars[key]:
349
+ print_success(f" ✓ {key} is set")
350
+ else:
351
+ print_warning(f" ⚠ {key} is not set (required for most features)")
352
+
353
+ for key in optional_keys:
354
+ if key in env_vars and env_vars[key]:
355
+ print_success(f" ✓ {key} is set")
356
+ else:
357
+ print_info(f" ○ {key} is not set (optional)")
358
+
359
+ except Exception as e:
360
+ print_warning(f"Could not read .env file: {e}")
361
+
362
+ return True
363
+ else:
364
+ print_warning(".env file not found")
365
+ if env_example.exists():
366
+ print_info("Copy .env.example to .env and configure your API keys")
367
+ else:
368
+ print_info("Create a .env file with your API keys (e.g., OPENAI_API_KEY)")
369
+ return False
370
+
371
+
372
+ def main():
373
+ """Main function"""
374
+ print("\n" + "=" * 60)
375
+ print("🔍 DeepTutor Installation Checker")
376
+ print("=" * 60)
377
+ print("Checking all dependencies and configurations...")
378
+
379
+ # Get project root
380
+ script_dir = Path(__file__).parent
381
+ project_root = script_dir.parent
382
+
383
+ print_info(f"Project root: {project_root}")
384
+
385
+ # Track overall status
386
+ all_checks_passed = True
387
+ summary = []
388
+
389
+ # 1. Python environment
390
+ if check_python_environment():
391
+ summary.append(("Python Environment", "✅ OK"))
392
+ else:
393
+ summary.append(("Python Environment", "❌ Issues found"))
394
+ all_checks_passed = False
395
+
396
+ # 2. Backend packages
397
+ backend_ok, backend_installed, backend_missing = check_backend_packages()
398
+ if backend_ok:
399
+ summary.append(("Backend Dependencies", f"✅ OK ({backend_installed} packages)"))
400
+ else:
401
+ summary.append(
402
+ ("Backend Dependencies", f"❌ {backend_missing} missing, {backend_installed} installed")
403
+ )
404
+ all_checks_passed = False
405
+
406
+ # 3. Frontend packages
407
+ frontend_ok, frontend_installed, frontend_missing = check_frontend_packages(project_root)
408
+ if frontend_ok:
409
+ summary.append(("Frontend Dependencies", f"✅ OK ({frontend_installed} packages)"))
410
+ else:
411
+ summary.append(
412
+ (
413
+ "Frontend Dependencies",
414
+ f"❌ {frontend_missing} missing, {frontend_installed} installed",
415
+ )
416
+ )
417
+ all_checks_passed = False
418
+
419
+ # 4. System tools
420
+ check_system_tools()
421
+ summary.append(("System Tools", "✅ Checked"))
422
+
423
+ # 5. Environment configuration
424
+ if check_env_file(project_root):
425
+ summary.append(("Environment Config", "✅ .env exists"))
426
+ else:
427
+ summary.append(("Environment Config", "⚠️ .env missing"))
428
+
429
+ # Print summary
430
+ print_header("Summary")
431
+
432
+ for item, status in summary:
433
+ print(f" {item}: {status}")
434
+
435
+ print("")
436
+ if all_checks_passed:
437
+ print_success("All required dependencies are installed!")
438
+ print_info("You can start DeepTutor with: python scripts/start_web.py")
439
+ else:
440
+ print_error("Some dependencies are missing!")
441
+ print_info("Run: python scripts/install_all.py")
442
+ print_info("Or manually install missing packages")
443
+
444
+ print("=" * 60 + "\n")
445
+
446
+ return 0 if all_checks_passed else 1
447
+
448
+
449
+ if __name__ == "__main__":
450
+ try:
451
+ sys.exit(main())
452
+ except KeyboardInterrupt:
453
+ print("\n\n⚠️ Check interrupted by user")
454
+ sys.exit(1)
455
+ except Exception as e:
456
+ print_error(f"\n❌ Unexpected error: {e}")
457
+ import traceback
458
+
459
+ traceback.print_exc()
460
+ sys.exit(1)