SYMBOL INDEX (21 symbols across 4 files) FILE: server/bot-gemini.py class UserTranscriptionFrameFilter (line 63) | class UserTranscriptionFrameFilter(FrameProcessor): method process_frame (line 66) | async def process_frame(self, frame: Frame, direction: FrameDirection): function main (line 75) | async def main(): FILE: server/runner.py function configure (line 15) | async def configure(aiohttp_session: aiohttp.ClientSession): FILE: server/server.py function cleanup (line 50) | def cleanup(): function get_bot_file (line 61) | def get_bot_file(): function lifespan (line 66) | async def lifespan(app: FastAPI): function create_room_and_token (line 97) | async def create_room_and_token() -> tuple[str, str]: function start_agent (line 118) | async def start_agent(request: Request): function rtvi_connect (line 157) | async def rtvi_connect(request: Request) -> Dict[Any, Any]: function get_status (line 190) | def get_status(pid: int): FILE: src/app.ts function startBot (line 21) | async function startBot(profileChoice: string) { function setupEventHandlers (line 61) | async function setupEventHandlers(rtviClient: RTVIClient) { function startUserSpeechBubble (line 139) | async function startUserSpeechBubble() { function finishUserSpeechBubble (line 155) | async function finishUserSpeechBubble() { function startBotSpeechBubble (line 160) | async function startBotSpeechBubble() { function finishBotSpeechBubble (line 167) | async function finishBotSpeechBubble() { function handleUserInterimTranscription (line 171) | async function handleUserInterimTranscription(text: string) { function handleUserFinalTranscription (line 184) | async function handleUserFinalTranscription(text: string) { function handleBotLLMText (line 194) | async function handleBotLLMText(data: BotLLMTextData) { function scroll (line 203) | function scroll() {