"""agent runtime closed loop contract Revision ID: 202603050001 Revises: 435419f8121c Create Date: 2026-03-05 12:00:00 """ from __future__ import annotations from typing import Sequence, Union from alembic import op revision: str = "202603050001" down_revision: Union[str, Sequence[str], None] = "202603040001" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.execute("ALTER TABLE sessions ADD COLUMN IF NOT EXISTS state_snapshot JSONB") with op.get_context().autocommit_block(): op.execute( "CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_messages_session_seq ON messages (session_id, seq)" ) op.execute( """ ALTER TABLE messages ADD CONSTRAINT chk_messages_tool_result_metadata CHECK ( role != 'tool' OR (metadata IS NOT NULL AND metadata->>'type' = 'tool_result') ) NOT VALID """ ) op.execute( "ALTER TABLE messages VALIDATE CONSTRAINT chk_messages_tool_result_metadata" ) op.execute( """ ALTER TABLE messages ADD CONSTRAINT chk_messages_assistant_metadata CHECK ( role != 'assistant' OR (metadata IS NOT NULL AND metadata->>'type' IN ('tool_call', 'assistant_output')) ) NOT VALID """ ) op.execute( "ALTER TABLE messages VALIDATE CONSTRAINT chk_messages_assistant_metadata" ) def downgrade() -> None: op.execute( "ALTER TABLE messages DROP CONSTRAINT IF EXISTS chk_messages_assistant_metadata" ) op.execute( "ALTER TABLE messages DROP CONSTRAINT IF EXISTS chk_messages_tool_result_metadata" ) op.execute("DROP INDEX IF EXISTS ix_messages_session_seq") op.execute("ALTER TABLE sessions DROP COLUMN IF EXISTS state_snapshot")