"""add goals and tasks tables, agent_type, goal_id Revision ID: 013_add_goals_tasks Revises: 012_schedule_fk_set_null Create Date: 2026-05-07 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects.mysql import CHAR revision = "013_add_goals_tasks" down_revision = "012_schedule_fk_set_null" branch_labels = None depends_on = None def upgrade() -> None: # ── goals 表 ── op.create_table( "goals", sa.Column("id", CHAR(36), primary_key=True), sa.Column("title", sa.String(500), nullable=False), sa.Column("description", sa.Text), sa.Column("status", sa.String(20), default="active"), sa.Column("priority", sa.Integer, default=5), sa.Column("progress", sa.Float, default=0.0), sa.Column("plan", sa.JSON), sa.Column("autonomy_config", sa.JSON), sa.Column("creator_id", CHAR(36), sa.ForeignKey("users.id"), nullable=False), sa.Column("main_agent_id", CHAR(36), sa.ForeignKey("agents.id"), nullable=True), sa.Column("parent_goal_id", CHAR(36), sa.ForeignKey("goals.id"), nullable=True), sa.Column("started_at", sa.DateTime), sa.Column("completed_at", sa.DateTime), sa.Column("deadline", sa.DateTime), sa.Column("created_at", sa.DateTime, server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime, server_default=sa.func.now(), onupdate=sa.func.now()), ) # ── tasks 表 ── op.create_table( "tasks", sa.Column("id", CHAR(36), primary_key=True), sa.Column("goal_id", CHAR(36), sa.ForeignKey("goals.id"), nullable=False), sa.Column("title", sa.String(500), nullable=False), sa.Column("description", sa.Text), sa.Column("status", sa.String(20), default="pending"), sa.Column("priority", sa.Integer, default=5), sa.Column("task_config", sa.JSON), sa.Column("parent_task_id", CHAR(36), sa.ForeignKey("tasks.id"), nullable=True), sa.Column("depends_on", sa.JSON, default=list), sa.Column("result", sa.JSON), sa.Column("error_message", sa.Text), sa.Column("execution_id", CHAR(36), sa.ForeignKey("executions.id"), nullable=True), sa.Column("assigned_agent_id", CHAR(36), sa.ForeignKey("agents.id"), nullable=True), sa.Column("assigned_agent_name", sa.String(200)), sa.Column("requires_approval", sa.Boolean, default=False), sa.Column("approver_id", CHAR(36), sa.ForeignKey("users.id"), nullable=True), sa.Column("approval_status", sa.String(20)), sa.Column("started_at", sa.DateTime), sa.Column("completed_at", sa.DateTime), sa.Column("deadline", sa.DateTime), sa.Column("created_at", sa.DateTime, server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime, server_default=sa.func.now(), onupdate=sa.func.now()), ) # ── agents 表新增字段 ── op.add_column("agents", sa.Column("agent_type", sa.String(20), default="specialist")) op.add_column("agents", sa.Column("input_schema", sa.JSON, nullable=True)) op.add_column("agents", sa.Column("output_schema", sa.JSON, nullable=True)) # ── executions 表新增 goal_id ── op.add_column("executions", sa.Column("goal_id", CHAR(36), sa.ForeignKey("goals.id"), nullable=True)) def downgrade() -> None: op.drop_column("executions", "goal_id") op.drop_column("agents", "output_schema") op.drop_column("agents", "input_schema") op.drop_column("agents", "agent_type") op.drop_table("tasks") op.drop_table("goals")