SYMBOL INDEX (25 symbols across 4 files) FILE: main.py class Task (line 39) | class Task(Base): class PromptRequest (line 70) | class PromptRequest(BaseModel): function read_index (line 75) | def read_index(request: Request): function health_check (line 80) | def health_check(request: Request): function generate_report (line 85) | def generate_report(req: PromptRequest): function get_task_progress (line 112) | def get_task_progress(task_id: str): function get_task_status (line 117) | def get_task_status(task_id: str): function format_history (line 129) | def format_history(history): function run_agent_workflow (line 135) | def run_agent_workflow(task_id: str, prompt: str, initial_plan_steps: li... FILE: src/agents.py function research_agent (line 14) | def research_agent( function writer_agent (line 155) | def writer_agent( function editor_agent (line 249) | def editor_agent( FILE: src/planning_agent.py function clean_json_block (line 15) | def clean_json_block(raw: str) -> str: function planner_agent (line 27) | def planner_agent(topic: str, model: str = "openai:o4-mini") -> List[str]: function executor_agent_step (line 136) | def executor_agent_step(step_title: str, history: list, prompt: str): FILE: src/research_tools.py function _build_session (line 43) | def _build_session( function ensure_pdf_url (line 75) | def ensure_pdf_url(abs_or_pdf_url: str) -> str: function _safe_filename (line 85) | def _safe_filename(name: str) -> str: function clean_text (line 94) | def clean_text(s: str) -> str: function fetch_pdf_bytes (line 102) | def fetch_pdf_bytes(pdf_url: str, timeout: int = 90) -> bytes: function pdf_bytes_to_text (line 108) | def pdf_bytes_to_text(pdf_bytes: bytes, max_pages: Optional[int] = None)... function maybe_save_pdf (line 135) | def maybe_save_pdf(pdf_bytes: bytes, dest_dir: str, filename: str) -> str: function arxiv_search_tool (line 152) | def arxiv_search_tool( function tavily_search_tool (line 277) | def tavily_search_tool( function wikipedia_search_tool (line 356) | def wikipedia_search_tool(query: str, sentences: int = 5) -> List[Dict]: