2026-02-04 20:21:33 +05:30
|
|
|
"""init
|
|
|
|
|
|
|
|
|
|
Revision ID: 939a1d2dc607
|
|
|
|
|
Revises:
|
|
|
|
|
Create Date: 2026-02-04 19:34:33.600751
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from alembic import op
|
|
|
|
|
import sqlalchemy as sa
|
|
|
|
|
import sqlmodel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
|
|
|
revision = '939a1d2dc607'
|
|
|
|
|
down_revision = None
|
|
|
|
|
branch_labels = None
|
|
|
|
|
depends_on = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def upgrade() -> None:
|
|
|
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
2026-02-04 23:07:22 +05:30
|
|
|
op.create_table(
|
|
|
|
|
'gateway_configs',
|
|
|
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
|
|
|
sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('url', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('token', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('main_session_key', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('workspace_root', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
)
|
2026-02-04 20:21:33 +05:30
|
|
|
op.create_table('boards',
|
|
|
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
|
|
|
sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('slug', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
2026-02-04 23:07:22 +05:30
|
|
|
sa.Column('gateway_config_id', sa.Uuid(), nullable=True),
|
2026-02-04 20:21:33 +05:30
|
|
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(), nullable=False),
|
2026-02-04 23:07:22 +05:30
|
|
|
sa.ForeignKeyConstraint(['gateway_config_id'], ['gateway_configs.id'], ),
|
2026-02-04 20:21:33 +05:30
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
)
|
2026-02-04 23:07:22 +05:30
|
|
|
op.create_index(op.f('ix_boards_gateway_config_id'), 'boards', ['gateway_config_id'], unique=False)
|
2026-02-04 20:21:33 +05:30
|
|
|
op.create_index(op.f('ix_boards_slug'), 'boards', ['slug'], unique=False)
|
|
|
|
|
op.create_table('users',
|
|
|
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
|
|
|
sa.Column('clerk_user_id', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('email', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('preferred_name', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('pronouns', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('timezone', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('notes', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('context', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('is_super_admin', sa.Boolean(), nullable=False),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_users_clerk_user_id'), 'users', ['clerk_user_id'], unique=True)
|
|
|
|
|
op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=False)
|
|
|
|
|
op.create_table('agents',
|
|
|
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
|
|
|
sa.Column('board_id', sa.Uuid(), nullable=True),
|
|
|
|
|
sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('status', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('openclaw_session_id', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('agent_token_hash', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('heartbeat_config', sa.JSON(), nullable=True),
|
|
|
|
|
sa.Column('provision_requested_at', sa.DateTime(), nullable=True),
|
|
|
|
|
sa.Column('provision_confirm_token_hash', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('provision_action', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('delete_requested_at', sa.DateTime(), nullable=True),
|
|
|
|
|
sa.Column('delete_confirm_token_hash', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('last_seen_at', sa.DateTime(), nullable=True),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['board_id'], ['boards.id'], ),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_agents_agent_token_hash'), 'agents', ['agent_token_hash'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_board_id'), 'agents', ['board_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_delete_confirm_token_hash'), 'agents', ['delete_confirm_token_hash'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_name'), 'agents', ['name'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_openclaw_session_id'), 'agents', ['openclaw_session_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_provision_action'), 'agents', ['provision_action'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_provision_confirm_token_hash'), 'agents', ['provision_confirm_token_hash'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_agents_status'), 'agents', ['status'], unique=False)
|
|
|
|
|
op.create_table('tasks',
|
|
|
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
|
|
|
sa.Column('board_id', sa.Uuid(), nullable=True),
|
|
|
|
|
sa.Column('title', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('description', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('status', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('priority', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('due_at', sa.DateTime(), nullable=True),
|
|
|
|
|
sa.Column('in_progress_at', sa.DateTime(), nullable=True),
|
|
|
|
|
sa.Column('created_by_user_id', sa.Uuid(), nullable=True),
|
|
|
|
|
sa.Column('assigned_agent_id', sa.Uuid(), nullable=True),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.Column('updated_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['assigned_agent_id'], ['agents.id'], ),
|
|
|
|
|
sa.ForeignKeyConstraint(['board_id'], ['boards.id'], ),
|
|
|
|
|
sa.ForeignKeyConstraint(['created_by_user_id'], ['users.id'], ),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_tasks_assigned_agent_id'), 'tasks', ['assigned_agent_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_tasks_board_id'), 'tasks', ['board_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_tasks_created_by_user_id'), 'tasks', ['created_by_user_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_tasks_priority'), 'tasks', ['priority'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_tasks_status'), 'tasks', ['status'], unique=False)
|
|
|
|
|
op.create_table('activity_events',
|
|
|
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
|
|
|
sa.Column('event_type', sqlmodel.sql.sqltypes.AutoString(), nullable=False),
|
|
|
|
|
sa.Column('message', sqlmodel.sql.sqltypes.AutoString(), nullable=True),
|
|
|
|
|
sa.Column('agent_id', sa.Uuid(), nullable=True),
|
|
|
|
|
sa.Column('task_id', sa.Uuid(), nullable=True),
|
|
|
|
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
|
|
|
|
sa.ForeignKeyConstraint(['agent_id'], ['agents.id'], ),
|
|
|
|
|
sa.ForeignKeyConstraint(['task_id'], ['tasks.id'], ),
|
|
|
|
|
sa.PrimaryKeyConstraint('id')
|
|
|
|
|
)
|
|
|
|
|
op.create_index(op.f('ix_activity_events_agent_id'), 'activity_events', ['agent_id'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_activity_events_event_type'), 'activity_events', ['event_type'], unique=False)
|
|
|
|
|
op.create_index(op.f('ix_activity_events_task_id'), 'activity_events', ['task_id'], unique=False)
|
|
|
|
|
# ### end Alembic commands ###
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def downgrade() -> None:
|
|
|
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
|
|
|
op.drop_index(op.f('ix_activity_events_task_id'), table_name='activity_events')
|
|
|
|
|
op.drop_index(op.f('ix_activity_events_event_type'), table_name='activity_events')
|
|
|
|
|
op.drop_index(op.f('ix_activity_events_agent_id'), table_name='activity_events')
|
|
|
|
|
op.drop_table('activity_events')
|
|
|
|
|
op.drop_index(op.f('ix_tasks_status'), table_name='tasks')
|
|
|
|
|
op.drop_index(op.f('ix_tasks_priority'), table_name='tasks')
|
|
|
|
|
op.drop_index(op.f('ix_tasks_created_by_user_id'), table_name='tasks')
|
|
|
|
|
op.drop_index(op.f('ix_tasks_board_id'), table_name='tasks')
|
|
|
|
|
op.drop_index(op.f('ix_tasks_assigned_agent_id'), table_name='tasks')
|
|
|
|
|
op.drop_table('tasks')
|
|
|
|
|
op.drop_index(op.f('ix_agents_status'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_provision_confirm_token_hash'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_provision_action'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_openclaw_session_id'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_name'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_delete_confirm_token_hash'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_board_id'), table_name='agents')
|
|
|
|
|
op.drop_index(op.f('ix_agents_agent_token_hash'), table_name='agents')
|
|
|
|
|
op.drop_table('agents')
|
|
|
|
|
op.drop_index(op.f('ix_users_email'), table_name='users')
|
|
|
|
|
op.drop_index(op.f('ix_users_clerk_user_id'), table_name='users')
|
|
|
|
|
op.drop_table('users')
|
|
|
|
|
op.drop_index(op.f('ix_boards_slug'), table_name='boards')
|
|
|
|
|
op.drop_table('boards')
|
|
|
|
|
# ### end Alembic commands ###
|