"""Initial tables including creative projects Revision ID: 004 Revises: None Create Date: 2024-12-20 12:00:00.000000 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers revision = '004' down_revision = None branch_labels = None depends_on = None def upgrade(): # Create characters table first op.create_table('characters', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('name', sa.String(100), unique=True, nullable=False, index=True), sa.Column('personality', sa.Text(), nullable=False), sa.Column('system_prompt', sa.Text(), nullable=False), sa.Column('interests', sa.JSON(), nullable=False, default=list), sa.Column('speaking_style', sa.Text(), nullable=False), sa.Column('background', sa.Text(), nullable=False), sa.Column('avatar_url', sa.String(500)), sa.Column('is_active', sa.Boolean(), default=True), sa.Column('creation_date', sa.DateTime(), server_default=sa.func.now()), sa.Column('last_active', sa.DateTime(), server_default=sa.func.now()), sa.Column('last_message_id', sa.Integer()) ) # Create conversations table op.create_table('conversations', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('channel_id', sa.String(100), nullable=False, index=True), sa.Column('topic', sa.String(200)), sa.Column('start_time', sa.DateTime(), server_default=sa.func.now()), sa.Column('end_time', sa.DateTime()), sa.Column('is_active', sa.Boolean(), default=True), sa.Column('participant_count', sa.Integer(), default=0) ) # Create messages table op.create_table('messages', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('discord_id', sa.String(100), unique=True, index=True), sa.Column('conversation_id', sa.Integer(), sa.ForeignKey('conversations.id')), sa.Column('character_id', sa.Integer(), sa.ForeignKey('characters.id')), sa.Column('content', sa.Text(), nullable=False), sa.Column('timestamp', sa.DateTime(), server_default=sa.func.now()), sa.Column('response_to_id', sa.Integer(), sa.ForeignKey('messages.id')), sa.Column('metadata', sa.JSON(), default=dict) ) # Add foreign key for last_message_id after messages table is created op.create_foreign_key('fk_characters_last_message', 'characters', 'messages', ['last_message_id'], ['id']) # Create memories table op.create_table('memories', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('memory_type', sa.String(50), nullable=False), sa.Column('content', sa.Text(), nullable=False), sa.Column('importance', sa.Float(), default=0.5), sa.Column('timestamp', sa.DateTime(), server_default=sa.func.now()), sa.Column('associated_conversation_id', sa.Integer(), sa.ForeignKey('conversations.id')), sa.Column('associated_character_ids', sa.JSON(), default=list), sa.Column('metadata', sa.JSON(), default=dict) ) # Create character_relationships table op.create_table('character_relationships', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('character_a_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('character_b_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('relationship_type', sa.String(50), nullable=False), sa.Column('strength', sa.Float(), default=0.0), sa.Column('last_interaction', sa.DateTime(), server_default=sa.func.now()), sa.Column('interaction_count', sa.Integer(), default=0), sa.Column('notes', sa.Text()), sa.Column('metadata', sa.JSON(), default=dict) ) # Create character_evolution table op.create_table('character_evolution', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('change_type', sa.String(50), nullable=False), sa.Column('old_value', sa.Text()), sa.Column('new_value', sa.Text(), nullable=False), sa.Column('reason', sa.Text()), sa.Column('timestamp', sa.DateTime(), server_default=sa.func.now()), sa.Column('metadata', sa.JSON(), default=dict) ) # Create shared_memories table op.create_table('shared_memories', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('memory_id', sa.Integer(), sa.ForeignKey('memories.id'), nullable=False), sa.Column('shared_by_character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('shared_with_character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('trust_level_at_time_of_sharing', sa.Float(), nullable=False), sa.Column('shared_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('integration_status', sa.String(20), default='integrated'), sa.Column('metadata', sa.JSON(), default=dict) ) # Create memory_share_requests table op.create_table('memory_share_requests', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('requester_character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('target_character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('memory_id', sa.Integer(), sa.ForeignKey('memories.id'), nullable=False), sa.Column('request_reason', sa.Text(), nullable=False), sa.Column('status', sa.String(20), default='pending'), sa.Column('response_reasoning', sa.Text()), sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('responded_at', sa.DateTime()), sa.Column('metadata', sa.JSON(), default=dict) ) # Create character_trust_levels table op.create_table('character_trust_levels', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('character_a_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('character_b_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('trust_score', sa.Float(), default=0.3), sa.Column('relationship_depth', sa.String(20), default='basic'), sa.Column('interaction_count', sa.Integer(), default=0), sa.Column('positive_interactions', sa.Integer(), default=0), sa.Column('last_updated', sa.DateTime(), server_default=sa.func.now()), sa.Column('metadata', sa.JSON(), default=dict) ) # Create creative_projects table op.create_table('creative_projects', sa.Column('id', sa.String(255), primary_key=True, index=True), sa.Column('title', sa.String(200), nullable=False), sa.Column('description', sa.Text(), nullable=False), sa.Column('project_type', sa.String(50), nullable=False), sa.Column('status', sa.String(50), default='proposed'), sa.Column('initiator_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('target_completion', sa.DateTime()), sa.Column('project_goals', sa.JSON(), default=list), sa.Column('style_guidelines', sa.JSON(), default=dict), sa.Column('current_content', sa.Text(), default=''), sa.Column('metadata', sa.JSON(), default=dict) ) # Create indexes for creative_projects op.create_index('ix_projects_status', 'creative_projects', ['status']) op.create_index('ix_projects_type', 'creative_projects', ['project_type']) op.create_index('ix_projects_initiator', 'creative_projects', ['initiator_id', 'created_at']) # Create project_collaborators table op.create_table('project_collaborators', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('project_id', sa.String(255), sa.ForeignKey('creative_projects.id'), nullable=False), sa.Column('character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('role_description', sa.String(200), default='collaborator'), sa.Column('joined_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('is_active', sa.Boolean(), default=True) ) # Create indexes for project_collaborators op.create_index('ix_collaborators_project', 'project_collaborators', ['project_id']) op.create_index('ix_collaborators_character', 'project_collaborators', ['character_id']) # Create project_contributions table op.create_table('project_contributions', sa.Column('id', sa.String(255), primary_key=True, index=True), sa.Column('project_id', sa.String(255), sa.ForeignKey('creative_projects.id'), nullable=False), sa.Column('contributor_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('contribution_type', sa.String(50), nullable=False), sa.Column('content', sa.Text(), nullable=False), sa.Column('timestamp', sa.DateTime(), server_default=sa.func.now()), sa.Column('build_on_contribution_id', sa.String(255), sa.ForeignKey('project_contributions.id')), sa.Column('feedback_for_contribution_id', sa.String(255), sa.ForeignKey('project_contributions.id')), sa.Column('metadata', sa.JSON(), default=dict) ) # Create indexes for project_contributions op.create_index('ix_contributions_project', 'project_contributions', ['project_id', 'timestamp']) op.create_index('ix_contributions_contributor', 'project_contributions', ['contributor_id', 'timestamp']) op.create_index('ix_contributions_type', 'project_contributions', ['contribution_type']) # Create project_invitations table op.create_table('project_invitations', sa.Column('id', sa.String(255), primary_key=True, index=True), sa.Column('project_id', sa.String(255), sa.ForeignKey('creative_projects.id'), nullable=False), sa.Column('inviter_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('invitee_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('role_description', sa.String(200), default='collaborator'), sa.Column('invitation_message', sa.Text()), sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('expires_at', sa.DateTime(), nullable=False), sa.Column('status', sa.String(50), default='pending'), sa.Column('response_message', sa.Text()), sa.Column('responded_at', sa.DateTime()) ) # Create indexes for project_invitations op.create_index('ix_invitations_invitee', 'project_invitations', ['invitee_id', 'status']) op.create_index('ix_invitations_project', 'project_invitations', ['project_id', 'created_at']) def downgrade(): # Drop tables in reverse order of creation op.drop_table('project_invitations') op.drop_table('project_contributions') op.drop_table('project_collaborators') op.drop_table('creative_projects') op.drop_table('character_trust_levels') op.drop_table('memory_share_requests') op.drop_table('shared_memories') op.drop_table('character_evolution') op.drop_table('character_relationships') op.drop_table('memories') op.drop_table('messages') op.drop_table('conversations') op.drop_table('characters')