import structlog from typing import Optional from agentpress.tool import Tool from agentpress.thread_manager import ThreadManager from utils.logger import logger class AgentBuilderBaseTool(Tool): def __init__(self, thread_manager: ThreadManager, db_connection, agent_id: str): super().__init__() self.thread_manager = thread_manager self.db = db_connection self.agent_id = agent_id async def _get_current_account_id(self) -> str: try: context_vars = structlog.contextvars.get_contextvars() thread_id = context_vars.get('thread_id') if not thread_id: raise ValueError("No thread_id available from execution context") client = await self.db.client thread_result = await client.table('threads').select('account_id').eq('thread_id', thread_id).limit(1).execute() if not thread_result.data: raise ValueError(f"Could not find thread with ID: {thread_id}") account_id = thread_result.data[0]['account_id'] if not account_id: raise ValueError("Thread has no associated account_id") return account_id except Exception as e: logger.error(f"Error getting current account_id: {e}") raise async def _get_agent_data(self) -> Optional[dict]: try: client = await self.db.client result = await client.table('agents').select('*').eq('agent_id', self.agent_id).execute() if not result.data: return None return result.data[0] except Exception as e: logger.error(f"Error getting agent data: {e}") return None