"""phase14 proactive agent + multimodal: errand_task/errand_step/proactive_card/weekly_review Revision ID: p14b2c3d4e5f6 Revises: p13a1b2c3d4e5 Create Date: 2026-06-15 07:00:00.000000 """ from typing import Sequence, Union import sqlalchemy as sa import sqlmodel from alembic import op revision: str = "p14b2c3d4e5f6" down_revision: Union[str, Sequence[str], None] = "p13a1b2c3d4e5" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None S = sqlmodel.sql.sqltypes.AutoString def upgrade() -> None: op.create_table( "errand_task", sa.Column("id", S(), nullable=False), sa.Column("kind", S(), nullable=False), sa.Column("title", S(), nullable=False), sa.Column("goal", S(), nullable=False), sa.Column("target", S(), nullable=True), sa.Column("tone", S(), nullable=False), sa.Column("status", S(), nullable=False), sa.Column("autonomy_at_start", S(), nullable=False), sa.Column("approval_id", S(), nullable=True), sa.Column("result_summary", S(), nullable=True), sa.Column("model", S(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), sa.Column("updated_at", sa.DateTime(), nullable=False), sa.ForeignKeyConstraint(["approval_id"], ["approval.id"]), sa.PrimaryKeyConstraint("id"), ) op.create_table( "errand_step", sa.Column("id", S(), nullable=False), sa.Column("errand_id", S(), nullable=False), sa.Column("seq", sa.Integer(), nullable=False), sa.Column("phase", S(), nullable=False), sa.Column("tool", S(), nullable=True), sa.Column("label", S(), nullable=False), sa.Column("detail", S(), nullable=True), sa.Column("external_effect", sa.Boolean(), nullable=False), sa.Column("state", S(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), sa.ForeignKeyConstraint(["errand_id"], ["errand_task.id"]), sa.PrimaryKeyConstraint("id"), ) op.create_index("ix_errand_step_errand_id", "errand_step", ["errand_id"]) op.create_table( "proactive_card", sa.Column("id", S(), nullable=False), sa.Column("kind", S(), nullable=False), sa.Column("icon", S(), nullable=False), sa.Column("tone", S(), nullable=False), sa.Column("title", S(), nullable=False), sa.Column("why", S(), nullable=False), sa.Column("cta", S(), nullable=True), sa.Column("action_kind", S(), nullable=True), sa.Column("action_payload", S(), nullable=True), sa.Column("detected_at", S(), nullable=False), sa.Column("status", S(), nullable=False), sa.Column("created_at", sa.DateTime(), nullable=False), sa.PrimaryKeyConstraint("id"), ) op.create_table( "weekly_review", sa.Column("id", S(), nullable=False), sa.Column("week_label", S(), nullable=False), sa.Column("deep_work_h", sa.Float(), nullable=False), sa.Column("meeting_h", sa.Float(), nullable=False), sa.Column("done_count", sa.Integer(), nullable=False), sa.Column("auto_count", sa.Integer(), nullable=False), sa.Column("saved_minutes", sa.Integer(), nullable=False), sa.Column("patterns_json", S(), nullable=False), sa.Column("note", S(), nullable=True), sa.Column("created_at", sa.DateTime(), nullable=False), sa.PrimaryKeyConstraint("id"), ) def downgrade() -> None: op.drop_table("weekly_review") op.drop_table("proactive_card") op.drop_index("ix_errand_step_errand_id", table_name="errand_step") op.drop_table("errand_step") op.drop_table("errand_task")