From bd15ccdf7b65f73d4bb73cbb6c2c96ef008c4a2c Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:11:48 +0530 Subject: [PATCH] feat(database): add llm_setup_completed_at column to workspaces for onboarding tracking --- .../174_add_llm_setup_completed_at.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 surfsense_backend/alembic/versions/174_add_llm_setup_completed_at.py diff --git a/surfsense_backend/alembic/versions/174_add_llm_setup_completed_at.py b/surfsense_backend/alembic/versions/174_add_llm_setup_completed_at.py new file mode 100644 index 000000000..b4aadb189 --- /dev/null +++ b/surfsense_backend/alembic/versions/174_add_llm_setup_completed_at.py @@ -0,0 +1,30 @@ +"""Add workspaces.llm_setup_completed_at for first-run vs. recovery onboarding. + +No backfill: NULL is correct for every existing row. Configured workspaces +self-heal via lazy stamping on their next status read (which fires while still +``ready``, before they could reach ``needs_setup``); a blanket +``SET ... = created_at`` would misclassify abandoned and global-only workspaces. + +Revision ID: 174 +Revises: 173 +""" + +from collections.abc import Sequence + +from alembic import op + +revision: str = "174" +down_revision: str | None = "173" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute( + "ALTER TABLE workspaces " + "ADD COLUMN IF NOT EXISTS llm_setup_completed_at TIMESTAMPTZ" + ) + + +def downgrade() -> None: + op.execute("ALTER TABLE workspaces DROP COLUMN IF EXISTS llm_setup_completed_at")