Files
roboco/alembic/versions/017_reconcile_orm_schema_drift.py
T

2473 lines
68 KiB
Python
Raw Normal View History

2026-06-03 06:35:03 +02:00
"""Reconcile the Alembic chain with the full ORM schema.
For a long time the live schema was built by ``Base.metadata.create_all``, not
by migrations, so the chain drifted: tables/columns/indexes that exist in the
ORM were never added by any migration — e.g. the ``indexed_documents`` table and
the ``notifications.delivered_at`` column. ``init_db`` no longer papers over
that with a silent create_all fallback, so a migrate-only boot was missing those
objects.
Generated by ``alembic revision --autogenerate`` against ``Base.metadata`` and
reviewed, then verified: after this revision a fresh ``alembic upgrade head``
reproduces the create_all schema, and re-running autogenerate yields no further
changes (the chain is complete).
Revision ID: 017_reconcile_orm_schema_drift
Revises: 016_add_products_product_id
Create Date: 2026-06-01
"""
from __future__ import annotations
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects import postgresql
revision = "017_reconcile_orm_schema_drift"
down_revision = "016_add_products_product_id"
branch_labels = None
depends_on = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"indexed_documents",
sa.Column("id", sa.UUID(), nullable=False),
sa.Column("index_type", sa.String(length=50), nullable=False),
sa.Column("source", sa.String(length=1000), nullable=False),
sa.Column("source_hash", sa.String(length=64), nullable=False),
sa.Column("title", sa.String(length=500), nullable=True),
sa.Column("preview", sa.Text(), nullable=True),
sa.Column("chunk_count", sa.Integer(), nullable=False),
sa.Column("extra_data", sa.JSON(), nullable=False),
sa.Column("indexed_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=True),
sa.PrimaryKeyConstraint("id", name=op.f("pk_indexed_documents")),
sa.UniqueConstraint("index_type", "source_hash", name="uq_indexed_doc_source"),
)
op.create_index(
"ix_indexed_docs_type_time",
"indexed_documents",
["index_type", "indexed_at"],
unique=False,
)
op.create_index(
op.f("ix_indexed_documents_index_type"),
"indexed_documents",
["index_type"],
unique=False,
)
op.alter_column(
"a2a_conversations",
"status",
existing_type=postgresql.ENUM(
"active", "paused", "closed", name="a2aconversationstatus"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"message_count",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"unread_by_a",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"unread_by_b",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"updated_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"message_kind",
existing_type=postgresql.ENUM(
"message", "request", "response", "system", name="a2amessagekind"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"requires_response",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"edit_history",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"agents",
"status",
existing_type=postgresql.ENUM("active", "idle", "offline", name="agentstatus"),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"agents",
"capabilities",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"agents",
"permissions",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"agents",
"metrics",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"agents",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"agents",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"audit_log",
"event_type",
existing_type=sa.VARCHAR(length=80),
comment=None,
existing_comment="Dot-separated e.g. task.claimed, session.closed, project.deleted",
existing_nullable=False,
)
op.alter_column(
"audit_log",
"target_type",
existing_type=sa.VARCHAR(length=40),
comment=None,
existing_comment="e.g. task, session, project, notification",
existing_nullable=True,
)
op.alter_column(
"audit_log",
"severity",
existing_type=sa.VARCHAR(length=16),
server_default=None,
comment=None,
existing_comment="info | warning | error",
existing_nullable=False,
)
op.alter_column(
"audit_log",
"details",
existing_type=postgresql.JSONB(astext_type=sa.Text()),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"audit_log",
"timestamp",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"channels",
"members",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"writers",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"silent_observers",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"is_archived",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"is_private",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"allow_threads",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"allow_reactions",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"message_retention_days",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=True,
)
op.alter_column(
"channels",
"max_message_length",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"message_count",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"group_count",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"channels",
"last_activity",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"channels",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"channels",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"gateway_triggers",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"groups",
"allowed_roles",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"hierarchy_level",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"members",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"is_active",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"default_session_config",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"total_sessions",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"total_messages",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"groups",
"last_activity",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"groups",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"groups",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"handoffs",
"new_functionality",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"modified_behavior",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"breaking_changes",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"required_docs",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"optional_docs",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"commits",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"new_files",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"modified_files",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"key_conversations",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"code_samples",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"gotchas",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"related_docs",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"key_learnings",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"key_decisions",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"questions",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"handoffs",
"status",
existing_type=postgresql.ENUM(
"pending", "claimed", "in_progress", "completed", name="handoffstatus"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"handoffs",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"handoffs",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"handoffs",
"claimed_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"handoffs",
"completed_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.create_index(
"ix_handoffs_assigned_status",
"handoffs",
["assigned_to", "status"],
unique=False,
)
op.create_index(
"ix_handoffs_status_created", "handoffs", ["status", "created_at"], unique=False
)
op.alter_column(
"journal_entries",
"timestamp",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"journal_entries",
"tags",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"journal_entries",
"is_private",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"journal_entries",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"journal_entries",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.create_index(
"ix_journal_entries_journal_timestamp",
"journal_entries",
["journal_id", "timestamp"],
unique=False,
)
op.create_index(
"ix_journal_entries_journal_type",
"journal_entries",
["journal_id", "type"],
unique=False,
)
op.create_index(
"ix_journal_entries_task_id", "journal_entries", ["task_id"], unique=False
)
op.alter_column(
"journals",
"total_entries",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"journals",
"last_entry_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"journals",
"summary_updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"journals",
"entries_by_type",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"journals",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"journals",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"messages",
"is_reply",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"messages",
"mentions",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"messages",
"timestamp",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"messages",
"confidence",
existing_type=sa.DOUBLE_PRECISION(precision=53),
server_default=None,
nullable=False,
)
op.alter_column(
"messages",
"edited_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"messages",
"edit_history",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"messages",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.drop_index(op.f("ix_messages_channel_timestamp"), table_name="messages")
op.create_index(
"ix_messages_channel_timestamp",
"messages",
["channel_id", "timestamp"],
unique=False,
)
op.create_index(
"ix_messages_agent_timestamp",
"messages",
["agent_id", "timestamp"],
unique=False,
)
op.create_index(
"ix_messages_session_timestamp",
"messages",
["session_id", "timestamp"],
unique=False,
)
op.alter_column(
"model_assignments",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.add_column(
"notifications",
sa.Column("delivered_at", sa.DateTime(timezone=True), nullable=True),
)
op.alter_column(
"notifications",
"priority",
existing_type=postgresql.ENUM(
"normal", "high", "urgent", name="notificationpriority"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"notifications",
"requires_ack",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"notifications",
"acked_by",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"notifications",
"acked_at",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"notifications",
"related_message_ids",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"notifications",
"timestamp",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"notifications",
"expires_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"notifications",
"read_by",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"notifications",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.drop_index(op.f("ix_notifications_to_timestamp"), table_name="notifications")
op.create_index(
"ix_notifications_from_agent_timestamp",
"notifications",
["from_agent", "timestamp"],
unique=False,
)
op.create_index(
"ix_notifications_timestamp_priority",
"notifications",
["timestamp", "priority"],
unique=False,
)
op.create_index(
"ix_notifications_type_priority",
"notifications",
["type", "priority"],
unique=False,
)
op.alter_column(
"products",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"projects",
"default_branch",
existing_type=sa.VARCHAR(length=100),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"projects",
"protected_branches",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"projects",
"last_synced_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"projects",
"is_active",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"projects",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"projects",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"provider_configs",
"enabled",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"provider_configs",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.drop_constraint(
op.f("uq_provider_configs_name"), "provider_configs", type_="unique"
)
op.drop_index(op.f("ix_provider_configs_name"), table_name="provider_configs")
op.create_index(
op.f("ix_provider_configs_name"), "provider_configs", ["name"], unique=True
)
op.alter_column(
"session_tasks",
"is_primary",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"session_tasks",
"relationship_type",
existing_type=sa.VARCHAR(length=50),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"session_tasks",
"added_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.create_index(
"ix_session_tasks_type", "session_tasks", ["relationship_type"], unique=False
)
op.alter_column(
"sessions",
"max_message_count",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=True,
)
op.alter_column(
"sessions",
"max_content_length",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=True,
)
op.alter_column(
"sessions",
"timeout_seconds",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"sessions",
"status",
existing_type=postgresql.ENUM(
"active", "closed", "timed_out", name="sessionstatus"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"sessions",
"scope",
existing_type=postgresql.ENUM(
"initiative", "cell", "task", name="sessionscope"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"sessions",
"started_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"sessions",
"last_activity_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"sessions",
"closed_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"sessions",
"message_count",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"sessions",
"total_content_length",
existing_type=sa.INTEGER(),
server_default=None,
nullable=False,
)
op.alter_column(
"sessions",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.create_index(
"ix_sessions_group_status", "sessions", ["group_id", "status"], unique=False
)
op.create_index(
"ix_sessions_status_started", "sessions", ["status", "started_at"], unique=False
)
op.alter_column(
"tasks",
"status",
existing_type=postgresql.ENUM(
"backlog",
"pending",
"claimed",
"in_progress",
"blocked",
"paused",
"verifying",
"needs_revision",
"awaiting_qa",
"awaiting_documentation",
"awaiting_pm_review",
"awaiting_ceo_approval",
"completed",
"cancelled",
name="taskstatus",
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"priority",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"task_type",
existing_type=postgresql.ENUM(
"code",
"documentation",
"research",
"planning",
"design",
"administrative",
name="tasktype",
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"nature",
existing_type=postgresql.ENUM("technical", "non_technical", name="tasknature"),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"docs_complete",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"pr_created",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"dependency_ids",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"blocker_ids",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"sequence",
existing_type=sa.INTEGER(),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"tasks",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"tasks",
"claimed_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"tasks",
"started_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"tasks",
"completed_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"tasks",
"target_date",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"tasks",
"estimated_complexity",
existing_type=postgresql.ENUM("low", "medium", "high", name="complexity"),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"checkpoints",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"progress_updates",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"commits",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"documents",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"self_verified",
existing_type=sa.BOOLEAN(),
server_default=None,
nullable=False,
)
op.alter_column(
"tasks",
"acceptance_criteria_status",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"tasks",
"qa_evidence_inspected",
existing_type=sa.BOOLEAN(),
server_default=None,
existing_nullable=False,
)
op.drop_index(op.f("ix_tasks_active_claimant_heartbeat"), table_name="tasks")
op.create_index(
"ix_tasks_created_by_status", "tasks", ["created_by", "status"], unique=False
)
op.create_index(op.f("ix_tasks_product_id"), "tasks", ["product_id"], unique=False)
op.create_index(op.f("ix_tasks_sequence"), "tasks", ["sequence"], unique=False)
op.alter_column(
"waiting_records",
"agent_id",
existing_type=sa.VARCHAR(length=64),
comment=None,
existing_comment="Agent slug; unique so only one record per agent.",
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"waiting_for",
existing_type=sa.VARCHAR(length=64),
comment=None,
existing_comment="One of: blocker_resolution, qa_result, answer, assignment",
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"context",
existing_type=postgresql.JSONB(astext_type=sa.Text()),
server_default=None,
type_=sa.JSON(),
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"work_sessions",
"started_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"work_sessions",
"ended_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"status",
existing_type=postgresql.ENUM(
"active", "completed", "abandoned", name="worksessionstatus"
),
server_default=None,
existing_nullable=False,
)
op.alter_column(
"work_sessions",
"commits",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"work_sessions",
"files_modified",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=None,
nullable=False,
)
op.alter_column(
"work_sessions",
"pr_created_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"pr_merged_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"created_at",
existing_type=postgresql.TIMESTAMP(),
server_default=None,
type_=sa.DateTime(timezone=True),
existing_nullable=False,
)
op.alter_column(
"work_sessions",
"updated_at",
existing_type=postgresql.TIMESTAMP(),
type_=sa.DateTime(timezone=True),
existing_nullable=True,
)
op.create_index("ix_work_sessions_task", "work_sessions", ["task_id"], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index("ix_work_sessions_task", table_name="work_sessions")
op.alter_column(
"work_sessions",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"work_sessions",
"pr_merged_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"pr_created_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"files_modified",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"work_sessions",
"commits",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"work_sessions",
"status",
existing_type=postgresql.ENUM(
"active", "completed", "abandoned", name="worksessionstatus"
),
server_default=sa.text("'active'::worksessionstatus"),
existing_nullable=False,
)
op.alter_column(
"work_sessions",
"ended_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"work_sessions",
"started_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"context",
existing_type=sa.JSON(),
server_default=sa.text("'{}'::jsonb"),
type_=postgresql.JSONB(astext_type=sa.Text()),
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"waiting_for",
existing_type=sa.VARCHAR(length=64),
comment="One of: blocker_resolution, qa_result, answer, assignment",
existing_nullable=False,
)
op.alter_column(
"waiting_records",
"agent_id",
existing_type=sa.VARCHAR(length=64),
comment="Agent slug; unique so only one record per agent.",
existing_nullable=False,
)
op.drop_index(op.f("ix_tasks_sequence"), table_name="tasks")
op.drop_index(op.f("ix_tasks_product_id"), table_name="tasks")
op.drop_index("ix_tasks_created_by_status", table_name="tasks")
op.create_index(
op.f("ix_tasks_active_claimant_heartbeat"),
"tasks",
["active_claimant_id", "last_heartbeat_at"],
unique=False,
)
op.alter_column(
"tasks",
"qa_evidence_inspected",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"acceptance_criteria_status",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"self_verified",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
nullable=True,
)
op.alter_column(
"tasks",
"documents",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"tasks",
"commits",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"tasks",
"progress_updates",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"tasks",
"checkpoints",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"tasks",
"estimated_complexity",
existing_type=postgresql.ENUM("low", "medium", "high", name="complexity"),
server_default=sa.text("'medium'::complexity"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"target_date",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"tasks",
"completed_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"tasks",
"started_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"tasks",
"claimed_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"tasks",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"tasks",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"tasks",
"sequence",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"blocker_ids",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"tasks",
"dependency_ids",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"tasks",
"pr_created",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"docs_complete",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"nature",
existing_type=postgresql.ENUM("technical", "non_technical", name="tasknature"),
server_default=sa.text("'technical'::tasknature"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"task_type",
existing_type=postgresql.ENUM(
"code",
"documentation",
"research",
"planning",
"design",
"administrative",
name="tasktype",
),
server_default=sa.text("'code'::tasktype"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"priority",
existing_type=sa.INTEGER(),
server_default=sa.text("2"),
existing_nullable=False,
)
op.alter_column(
"tasks",
"status",
existing_type=postgresql.ENUM(
"backlog",
"pending",
"claimed",
"in_progress",
"blocked",
"paused",
"verifying",
"needs_revision",
"awaiting_qa",
"awaiting_documentation",
"awaiting_pm_review",
"awaiting_ceo_approval",
"completed",
"cancelled",
name="taskstatus",
),
server_default=sa.text("'pending'::taskstatus"),
existing_nullable=False,
)
op.drop_index("ix_sessions_status_started", table_name="sessions")
op.drop_index("ix_sessions_group_status", table_name="sessions")
op.alter_column(
"sessions",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"sessions",
"total_content_length",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.alter_column(
"sessions",
"message_count",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.alter_column(
"sessions",
"closed_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"sessions",
"last_activity_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"sessions",
"started_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"sessions",
"scope",
existing_type=postgresql.ENUM(
"initiative", "cell", "task", name="sessionscope"
),
server_default=sa.text("'task'::sessionscope"),
existing_nullable=False,
)
op.alter_column(
"sessions",
"status",
existing_type=postgresql.ENUM(
"active", "closed", "timed_out", name="sessionstatus"
),
server_default=sa.text("'active'::sessionstatus"),
existing_nullable=False,
)
op.alter_column(
"sessions",
"timeout_seconds",
existing_type=sa.INTEGER(),
server_default=sa.text("300"),
nullable=True,
)
op.alter_column(
"sessions",
"max_content_length",
existing_type=sa.INTEGER(),
server_default=sa.text("50000"),
existing_nullable=True,
)
op.alter_column(
"sessions",
"max_message_count",
existing_type=sa.INTEGER(),
server_default=sa.text("100"),
existing_nullable=True,
)
op.drop_index("ix_session_tasks_type", table_name="session_tasks")
op.alter_column(
"session_tasks",
"added_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"session_tasks",
"relationship_type",
existing_type=sa.VARCHAR(length=50),
server_default=sa.text("'discussion'::character varying"),
existing_nullable=False,
)
op.alter_column(
"session_tasks",
"is_primary",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
existing_nullable=False,
)
op.drop_index(op.f("ix_provider_configs_name"), table_name="provider_configs")
op.create_index(
op.f("ix_provider_configs_name"), "provider_configs", ["name"], unique=False
)
op.create_unique_constraint(
op.f("uq_provider_configs_name"),
"provider_configs",
["name"],
postgresql_nulls_not_distinct=False,
)
op.alter_column(
"provider_configs",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"provider_configs",
"enabled",
existing_type=sa.BOOLEAN(),
server_default=sa.text("true"),
existing_nullable=False,
)
op.alter_column(
"projects",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"projects",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"projects",
"is_active",
existing_type=sa.BOOLEAN(),
server_default=sa.text("true"),
existing_nullable=False,
)
op.alter_column(
"projects",
"last_synced_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"projects",
"protected_branches",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"projects",
"default_branch",
existing_type=sa.VARCHAR(length=100),
server_default=sa.text("'main'::character varying"),
existing_nullable=False,
)
op.alter_column(
"products",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.drop_index("ix_notifications_type_priority", table_name="notifications")
op.drop_index("ix_notifications_timestamp_priority", table_name="notifications")
op.drop_index("ix_notifications_from_agent_timestamp", table_name="notifications")
op.create_index(
op.f("ix_notifications_to_timestamp"),
"notifications",
[sa.literal_column("timestamp DESC")],
unique=False,
)
op.alter_column(
"notifications",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"notifications",
"read_by",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"notifications",
"expires_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"notifications",
"timestamp",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"notifications",
"related_message_ids",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"notifications",
"acked_at",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'{}'::json"),
nullable=True,
)
op.alter_column(
"notifications",
"acked_by",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"notifications",
"requires_ack",
existing_type=sa.BOOLEAN(),
server_default=sa.text("true"),
nullable=True,
)
op.alter_column(
"notifications",
"priority",
existing_type=postgresql.ENUM(
"normal", "high", "urgent", name="notificationpriority"
),
server_default=sa.text("'normal'::notificationpriority"),
existing_nullable=False,
)
op.drop_column("notifications", "delivered_at")
op.alter_column(
"model_assignments",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.drop_index("ix_messages_session_timestamp", table_name="messages")
op.drop_index("ix_messages_agent_timestamp", table_name="messages")
op.drop_index("ix_messages_channel_timestamp", table_name="messages")
op.create_index(
op.f("ix_messages_channel_timestamp"),
"messages",
["channel_id", sa.literal_column("timestamp DESC")],
unique=False,
)
op.alter_column(
"messages",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"messages",
"edit_history",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"messages",
"edited_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"messages",
"confidence",
existing_type=sa.DOUBLE_PRECISION(precision=53),
server_default=sa.text("'1'::double precision"),
nullable=True,
)
op.alter_column(
"messages",
"timestamp",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"messages",
"mentions",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"messages",
"is_reply",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
nullable=True,
)
op.alter_column(
"journals",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"journals",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"journals",
"entries_by_type",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'{}'::json"),
nullable=True,
)
op.alter_column(
"journals",
"summary_updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"journals",
"last_entry_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"journals",
"total_entries",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.drop_index("ix_journal_entries_task_id", table_name="journal_entries")
op.drop_index("ix_journal_entries_journal_type", table_name="journal_entries")
op.drop_index("ix_journal_entries_journal_timestamp", table_name="journal_entries")
op.alter_column(
"journal_entries",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"journal_entries",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"journal_entries",
"is_private",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
nullable=True,
)
op.alter_column(
"journal_entries",
"tags",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"journal_entries",
"timestamp",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.drop_index("ix_handoffs_status_created", table_name="handoffs")
op.drop_index("ix_handoffs_assigned_status", table_name="handoffs")
op.alter_column(
"handoffs",
"completed_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"handoffs",
"claimed_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"handoffs",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"handoffs",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"handoffs",
"status",
existing_type=postgresql.ENUM(
"pending", "claimed", "in_progress", "completed", name="handoffstatus"
),
server_default=sa.text("'pending'::handoffstatus"),
existing_nullable=False,
)
op.alter_column(
"handoffs",
"questions",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"handoffs",
"key_decisions",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"key_learnings",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"handoffs",
"related_docs",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"handoffs",
"gotchas",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"code_samples",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"key_conversations",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"modified_files",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"new_files",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"commits",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"optional_docs",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"required_docs",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"handoffs",
"breaking_changes",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"handoffs",
"modified_behavior",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"handoffs",
"new_functionality",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"groups",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"groups",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"groups",
"last_activity",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"groups",
"total_messages",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.alter_column(
"groups",
"total_sessions",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.alter_column(
"groups",
"default_session_config",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'{}'::json"),
nullable=True,
)
op.alter_column(
"groups",
"is_active",
existing_type=sa.BOOLEAN(),
server_default=sa.text("true"),
nullable=True,
)
op.alter_column(
"groups",
"members",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"groups",
"hierarchy_level",
existing_type=sa.INTEGER(),
server_default=sa.text("4"),
nullable=True,
)
op.alter_column(
"groups",
"allowed_roles",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"gateway_triggers",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"channels",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"channels",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"channels",
"last_activity",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"channels",
"group_count",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.alter_column(
"channels",
"message_count",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
nullable=True,
)
op.alter_column(
"channels",
"max_message_length",
existing_type=sa.INTEGER(),
server_default=sa.text("10000"),
nullable=True,
)
op.alter_column(
"channels",
"message_retention_days",
existing_type=sa.INTEGER(),
server_default=sa.text("90"),
existing_nullable=True,
)
op.alter_column(
"channels",
"allow_reactions",
existing_type=sa.BOOLEAN(),
server_default=sa.text("true"),
nullable=True,
)
op.alter_column(
"channels",
"allow_threads",
existing_type=sa.BOOLEAN(),
server_default=sa.text("true"),
nullable=True,
)
op.alter_column(
"channels",
"is_private",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
nullable=True,
)
op.alter_column(
"channels",
"is_archived",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
nullable=True,
)
op.alter_column(
"channels",
"silent_observers",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"channels",
"writers",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"channels",
"members",
existing_type=postgresql.ARRAY(sa.UUID()),
server_default=sa.text("'{}'::uuid[]"),
nullable=True,
)
op.alter_column(
"audit_log",
"timestamp",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"audit_log",
"details",
existing_type=postgresql.JSONB(astext_type=sa.Text()),
server_default=sa.text("'{}'::jsonb"),
existing_nullable=False,
)
op.alter_column(
"audit_log",
"severity",
existing_type=sa.VARCHAR(length=16),
server_default=sa.text("'info'::character varying"),
comment="info | warning | error",
existing_nullable=False,
)
op.alter_column(
"audit_log",
"target_type",
existing_type=sa.VARCHAR(length=40),
comment="e.g. task, session, project, notification",
existing_nullable=True,
)
op.alter_column(
"audit_log",
"event_type",
existing_type=sa.VARCHAR(length=80),
comment="Dot-separated e.g. task.claimed, session.closed, project.deleted",
existing_nullable=False,
)
op.alter_column(
"agents",
"updated_at",
existing_type=sa.DateTime(timezone=True),
type_=postgresql.TIMESTAMP(),
existing_nullable=True,
)
op.alter_column(
"agents",
"created_at",
existing_type=sa.DateTime(timezone=True),
server_default=sa.text("now()"),
type_=postgresql.TIMESTAMP(),
existing_nullable=False,
)
op.alter_column(
"agents",
"metrics",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'{}'::json"),
nullable=True,
)
op.alter_column(
"agents",
"permissions",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'{}'::json"),
nullable=True,
)
op.alter_column(
"agents",
"capabilities",
existing_type=postgresql.ARRAY(sa.VARCHAR()),
server_default=sa.text("'{}'::character varying[]"),
nullable=True,
)
op.alter_column(
"agents",
"status",
existing_type=postgresql.ENUM("active", "idle", "offline", name="agentstatus"),
server_default=sa.text("'offline'::agentstatus"),
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"edit_history",
existing_type=postgresql.JSON(astext_type=sa.Text()),
server_default=sa.text("'[]'::json"),
nullable=True,
)
op.alter_column(
"a2a_messages",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"requires_response",
existing_type=sa.BOOLEAN(),
server_default=sa.text("false"),
existing_nullable=False,
)
op.alter_column(
"a2a_messages",
"message_kind",
existing_type=postgresql.ENUM(
"message", "request", "response", "system", name="a2amessagekind"
),
server_default=sa.text("'message'::a2amessagekind"),
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"updated_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"created_at",
existing_type=postgresql.TIMESTAMP(timezone=True),
server_default=sa.text("now()"),
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"unread_by_b",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"unread_by_a",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"message_count",
existing_type=sa.INTEGER(),
server_default=sa.text("0"),
existing_nullable=False,
)
op.alter_column(
"a2a_conversations",
"status",
existing_type=postgresql.ENUM(
"active", "paused", "closed", name="a2aconversationstatus"
),
server_default=sa.text("'active'::a2aconversationstatus"),
existing_nullable=False,
)
op.drop_index(
op.f("ix_indexed_documents_index_type"), table_name="indexed_documents"
)
op.drop_index("ix_indexed_docs_type_time", table_name="indexed_documents")
op.drop_table("indexed_documents")
# ### end Alembic commands ###