CREATE TABLE "agent_sessions" ( "id" UUID NOT NULL, "course_id" UUID NOT NULL, "week_id" UUID, "student_id" UUID NOT NULL, "status" TEXT NOT NULL DEFAULT 'ACTIVE', "title" TEXT, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, "last_activity_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "agent_sessions_pkey" PRIMARY KEY ("id") ); CREATE TABLE "agent_messages" ( "id" UUID NOT NULL, "session_id" UUID NOT NULL, "client_message_id" TEXT NOT NULL, "role" TEXT NOT NULL, "content" TEXT NOT NULL, "provider" TEXT, "model" TEXT, "summary" TEXT, "explanation" TEXT, "action_plan" JSONB, "create_module" JSONB, "apply_state" TEXT, "apply_error" TEXT, "usage" JSONB, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "agent_messages_pkey" PRIMARY KEY ("id") ); CREATE TABLE "agent_actions" ( "id" UUID NOT NULL, "message_id" UUID NOT NULL, "client_key" TEXT NOT NULL, "type" TEXT NOT NULL, "status" TEXT NOT NULL, "module_name" TEXT, "path" TEXT, "command" TEXT, "purpose" TEXT, "reason" TEXT, "content" TEXT, "output" TEXT, "exit_code" INTEGER, "error" TEXT, "payload" JSONB, "sort_order" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ(3) NOT NULL, CONSTRAINT "agent_actions_pkey" PRIMARY KEY ("id") ); CREATE INDEX "agent_sessions_student_id_course_id_week_id_status_last_activity_at_idx" ON "agent_sessions"("student_id", "course_id", "week_id", "status", "last_activity_at"); CREATE INDEX "agent_sessions_course_id_last_activity_at_idx" ON "agent_sessions"("course_id", "last_activity_at"); CREATE UNIQUE INDEX "agent_messages_session_id_client_message_id_key" ON "agent_messages"("session_id", "client_message_id"); CREATE INDEX "agent_messages_session_id_created_at_idx" ON "agent_messages"("session_id", "created_at"); CREATE UNIQUE INDEX "agent_actions_message_id_client_key_key" ON "agent_actions"("message_id", "client_key"); CREATE INDEX "agent_actions_message_id_sort_order_idx" ON "agent_actions"("message_id", "sort_order"); CREATE INDEX "agent_actions_type_status_created_at_idx" ON "agent_actions"("type", "status", "created_at"); ALTER TABLE "agent_sessions" ADD CONSTRAINT "agent_sessions_course_id_fkey" FOREIGN KEY ("course_id") REFERENCES "courses"("id") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "agent_sessions" ADD CONSTRAINT "agent_sessions_week_id_fkey" FOREIGN KEY ("week_id") REFERENCES "course_weeks"("id") ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE "agent_sessions" ADD CONSTRAINT "agent_sessions_student_id_fkey" FOREIGN KEY ("student_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "agent_messages" ADD CONSTRAINT "agent_messages_session_id_fkey" FOREIGN KEY ("session_id") REFERENCES "agent_sessions"("id") ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE "agent_actions" ADD CONSTRAINT "agent_actions_message_id_fkey" FOREIGN KEY ("message_id") REFERENCES "agent_messages"("id") ON DELETE CASCADE ON UPDATE CASCADE;