"""add agent run linkage to ai call logs Revision ID: 20260514_add_agent_run_audit_linkage Revises: 20260513_add_pmflow_ai_threads Create Date: 2026-05-14 """ from __future__ import annotations from alembic import op import sqlalchemy as sa revision = "20260514_add_agent_run_audit_linkage" down_revision = "20260513_add_pmflow_ai_threads" branch_labels = None depends_on = None def _table_exists(table_name: str) -> bool: return sa.inspect(op.get_bind()).has_table(table_name) def _column_exists(table_name: str, column_name: str) -> bool: if not _table_exists(table_name): return False inspector = sa.inspect(op.get_bind()) return any(item.get("name") == column_name for item in inspector.get_columns(table_name)) def _index_exists(table_name: str, index_name: str) -> bool: if not _table_exists(table_name): return False inspector = sa.inspect(op.get_bind()) return any(item.get("name") == index_name for item in inspector.get_indexes(table_name)) def _create_index_once(index_name: str, table_name: str, columns: list[str]) -> None: if _table_exists(table_name) and not _index_exists(table_name, index_name): op.create_index(index_name, table_name, columns) def upgrade() -> None: if not _table_exists("ai_call_logs"): return if not _column_exists("ai_call_logs", "agent_run_id"): op.add_column("ai_call_logs", sa.Column("agent_run_id", sa.String(length=80), nullable=True)) if not _column_exists("ai_call_logs", "agent_step_key"): op.add_column("ai_call_logs", sa.Column("agent_step_key", sa.String(length=120), nullable=True)) _create_index_once("ix_ai_call_logs_agent_run_id", "ai_call_logs", ["agent_run_id"]) _create_index_once("ix_ai_call_logs_agent_step_key", "ai_call_logs", ["agent_step_key"]) def downgrade() -> None: if not _table_exists("ai_call_logs"): return if _index_exists("ai_call_logs", "ix_ai_call_logs_agent_step_key"): op.drop_index("ix_ai_call_logs_agent_step_key", table_name="ai_call_logs") if _index_exists("ai_call_logs", "ix_ai_call_logs_agent_run_id"): op.drop_index("ix_ai_call_logs_agent_run_id", table_name="ai_call_logs") if _column_exists("ai_call_logs", "agent_step_key"): op.drop_column("ai_call_logs", "agent_step_key") if _column_exists("ai_call_logs", "agent_run_id"): op.drop_column("ai_call_logs", "agent_run_id")