SYMBOL INDEX (42 symbols across 12 files) FILE: backend/council.py function stage1_collect_responses (line 8) | async def stage1_collect_responses(user_query: str) -> List[Dict[str, An... function stage2_collect_rankings (line 35) | async def stage2_collect_rankings( function stage3_synthesize_final (line 115) | async def stage3_synthesize_final( function parse_ranking_from_text (line 177) | def parse_ranking_from_text(ranking_text: str) -> List[str]: function calculate_aggregate_rankings (line 211) | def calculate_aggregate_rankings( function generate_conversation_title (line 258) | async def generate_conversation_title(user_query: str) -> str: function run_full_council (line 296) | async def run_full_council(user_query: str) -> Tuple[List, List, Dict, D... FILE: backend/main.py class CreateConversationRequest (line 27) | class CreateConversationRequest(BaseModel): class SendMessageRequest (line 32) | class SendMessageRequest(BaseModel): class ConversationMetadata (line 37) | class ConversationMetadata(BaseModel): class Conversation (line 45) | class Conversation(BaseModel): function root (line 54) | async def root(): function list_conversations (line 60) | async def list_conversations(): function create_conversation (line 66) | async def create_conversation(request: CreateConversationRequest): function get_conversation (line 74) | async def get_conversation(conversation_id: str): function send_message (line 83) | async def send_message(conversation_id: str, request: SendMessageRequest): function send_message_stream (line 127) | async def send_message_stream(conversation_id: str, request: SendMessage... FILE: backend/openrouter.py function query_model (line 8) | async def query_model( function query_models_parallel (line 56) | async def query_models_parallel( FILE: backend/storage.py function ensure_data_dir (line 11) | def ensure_data_dir(): function get_conversation_path (line 16) | def get_conversation_path(conversation_id: str) -> str: function create_conversation (line 21) | def create_conversation(conversation_id: str) -> Dict[str, Any]: function get_conversation (line 48) | def get_conversation(conversation_id: str) -> Optional[Dict[str, Any]]: function save_conversation (line 67) | def save_conversation(conversation: Dict[str, Any]): function list_conversations (line 81) | def list_conversations() -> List[Dict[str, Any]]: function add_user_message (line 110) | def add_user_message(conversation_id: str, content: str): function add_assistant_message (line 130) | def add_assistant_message( function update_conversation_title (line 159) | def update_conversation_title(conversation_id: str, title: str): FILE: frontend/src/App.jsx function App (line 7) | function App() { FILE: frontend/src/api.js constant API_BASE (line 5) | const API_BASE = 'http://localhost:8001'; method listConversations (line 11) | async listConversations() { method createConversation (line 22) | async createConversation() { method getConversation (line 39) | async getConversation(conversationId) { method sendMessage (line 52) | async sendMessage(conversationId, content) { method sendMessageStream (line 76) | async sendMessageStream(conversationId, content, onEvent) { FILE: frontend/src/components/ChatInterface.jsx function ChatInterface (line 8) | function ChatInterface({ FILE: frontend/src/components/Sidebar.jsx function Sidebar (line 4) | function Sidebar({ FILE: frontend/src/components/Stage1.jsx function Stage1 (line 5) | function Stage1({ responses }) { FILE: frontend/src/components/Stage2.jsx function deAnonymizeText (line 5) | function deAnonymizeText(text, labelToModel) { function Stage2 (line 17) | function Stage2({ rankings, labelToModel, aggregateRankings }) { FILE: frontend/src/components/Stage3.jsx function Stage3 (line 4) | function Stage3({ finalResponse }) { FILE: main.py function main (line 1) | def main():