diff --git a/assets/audio/count_finish.mp3 b/assets/audio/count_finish.mp3
new file mode 100644
index 0000000..c2c5b59
Binary files /dev/null and b/assets/audio/count_finish.mp3 differ
diff --git a/assets/audio/count_tone.wav b/assets/audio/count_tone.wav
new file mode 100644
index 0000000..69c8eae
Binary files /dev/null and b/assets/audio/count_tone.wav differ
diff --git a/lib/daos/actions_dao.dart b/lib/daos/actions_dao.dart
index dbdbffe..f903778 100644
--- a/lib/daos/actions_dao.dart
+++ b/lib/daos/actions_dao.dart
@@ -15,7 +15,7 @@ class ActionsDao extends DatabaseAccessor<AppDatabase> with _$ActionsDaoMixin {
     return await (select(actions)..where((action) => action.id.equals(id) )).getSingle();
   }
 
-  Future<List<Action>> fromActivity(Activity activity) async {
+  Future<List<Action>> fromActivity(Activity activity, Session session) async {
     final result = select(db.activityActions).join(
       [
         innerJoin(
@@ -24,7 +24,8 @@ class ActionsDao extends DatabaseAccessor<AppDatabase> with _$ActionsDaoMixin {
         ),
       ],
     )
-      ..where(db.activityActions.activityId.equals(activity.id));
+      ..where(db.activityActions.activityId.equals(activity.id))
+      ..where(db.activityActions.sessionId.equals(session.id));
 
     final actions = (await result.get())
         .map((e) => e.readTable(db.actions))
@@ -33,5 +34,31 @@ class ActionsDao extends DatabaseAccessor<AppDatabase> with _$ActionsDaoMixin {
     return actions;
   }
 
+  Stream<List<Action>> watchActivityActions(Activity activity, Session session) {
+    final result = select(db.activityActions).join(
+      [
+        innerJoin(
+          db.actions,
+          db.actions.id.equalsExp(db.activityActions.actionId),
+        ),
+      ],
+    )
+      ..where(db.activityActions.activityId.equals(activity.id))
+      ..where(db.activityActions.sessionId.equals(session.id));
+
+    // final actions = result.watch().map((rows) {
+    //   return rows.map((row) {
+    //     row.readTable(db.actions);
+    //   }).toList();
+    // });
+
+    final actions = (result.watch()).map((rows) {
+      return rows.map((row) => row.readTable(db.actions)).toList();
+    });
+
+    return actions;
+  }
+
   Future createOrUpdate(ActionsCompanion action) => into(actions).insertOnConflictUpdate(action);
+  Future replace(Action action) => update(actions).replace(action);
 }
diff --git a/lib/daos/activity_actions_dao.dart b/lib/daos/activity_actions_dao.dart
index 98788bc..2736136 100644
--- a/lib/daos/activity_actions_dao.dart
+++ b/lib/daos/activity_actions_dao.dart
@@ -12,6 +12,7 @@ class ActivityActionsDao extends DatabaseAccessor<AppDatabase> with _$ActivityAc
   Future insert(ActivityAction activityAction) => into(activityActions).insert(activityAction);
   Future replace(ActivityAction activityAction) => update(activityActions).replace(activityAction);
   Future remove(ActivityAction activityAction) => delete(activityActions).delete(activityAction);
+  Future createOrUpdate(ActivityActionsCompanion activityAction) => into(activityActions).insertOnConflictUpdate(activityAction);
 
   // Future<List<ActivityAction>> all() async {
   //   return await select(activityActions).get();
diff --git a/lib/daos/activity_actions_dao.g.dart b/lib/daos/activity_actions_dao.g.dart
index 2dba712..ee057f5 100644
--- a/lib/daos/activity_actions_dao.g.dart
+++ b/lib/daos/activity_actions_dao.g.dart
@@ -6,5 +6,6 @@ part of 'activity_actions_dao.dart';
 mixin _$ActivityActionsDaoMixin on DatabaseAccessor<AppDatabase> {
   $ActivitiesTable get activities => attachedDatabase.activities;
   $ActionsTable get actions => attachedDatabase.actions;
+  $SessionsTable get sessions => attachedDatabase.sessions;
   $ActivityActionsTable get activityActions => attachedDatabase.activityActions;
 }
diff --git a/lib/database/database.dart b/lib/database/database.dart
index 382581a..b280ade 100644
--- a/lib/database/database.dart
+++ b/lib/database/database.dart
@@ -35,7 +35,7 @@ class AppDatabase extends _$AppDatabase {
   AppDatabase() : super(_openConnection());
 
   @override
-  int get schemaVersion => 33;
+  int get schemaVersion => 35;
 
   @override
   MigrationStrategy get migration {
@@ -155,10 +155,10 @@ class Activities extends Table {
 
 class ActivityActions extends Table {
   IntColumn get id => integer().autoIncrement()();
-  IntColumn get activityId =>
-      integer().references(Activities, #id, onDelete: KeyAction.cascade)();
+  IntColumn get activityId => integer().references(Activities, #id, onDelete: KeyAction.cascade)();
   IntColumn get actionId =>
       integer().references(Actions, #id, onDelete: KeyAction.cascade)();
+  IntColumn get sessionId => integer().references(Sessions, #id, onDelete: KeyAction.cascade)();
   IntColumn get position => integer()();
   DateTimeColumn get createdAt =>
       dateTime().withDefault(Variable(DateTime.now()))();
diff --git a/lib/database/database.g.dart b/lib/database/database.g.dart
index 19f07ce..85bf34f 100644
--- a/lib/database/database.g.dart
+++ b/lib/database/database.g.dart
@@ -2365,6 +2365,15 @@ class $ActivityActionsTable extends ActivityActions
       requiredDuringInsert: true,
       defaultConstraints: GeneratedColumn.constraintIsAlways(
           'REFERENCES actions (id) ON DELETE CASCADE'));
+  static const VerificationMeta _sessionIdMeta =
+      const VerificationMeta('sessionId');
+  @override
+  late final GeneratedColumn<int> sessionId = GeneratedColumn<int>(
+      'session_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES sessions (id) ON DELETE CASCADE'));
   static const VerificationMeta _positionMeta =
       const VerificationMeta('position');
   @override
@@ -2381,7 +2390,7 @@ class $ActivityActionsTable extends ActivityActions
       defaultValue: Variable(DateTime.now()));
   @override
   List<GeneratedColumn> get $columns =>
-      [id, activityId, actionId, position, createdAt];
+      [id, activityId, actionId, sessionId, position, createdAt];
   @override
   String get aliasedName => _alias ?? actualTableName;
   @override
@@ -2409,6 +2418,12 @@ class $ActivityActionsTable extends ActivityActions
     } else if (isInserting) {
       context.missing(_actionIdMeta);
     }
+    if (data.containsKey('session_id')) {
+      context.handle(_sessionIdMeta,
+          sessionId.isAcceptableOrUnknown(data['session_id']!, _sessionIdMeta));
+    } else if (isInserting) {
+      context.missing(_sessionIdMeta);
+    }
     if (data.containsKey('position')) {
       context.handle(_positionMeta,
           position.isAcceptableOrUnknown(data['position']!, _positionMeta));
@@ -2434,6 +2449,8 @@ class $ActivityActionsTable extends ActivityActions
           .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!,
       actionId: attachedDatabase.typeMapping
           .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!,
+      sessionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!,
       position: attachedDatabase.typeMapping
           .read(DriftSqlType.int, data['${effectivePrefix}position'])!,
       createdAt: attachedDatabase.typeMapping
@@ -2451,12 +2468,14 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
   final int id;
   final int activityId;
   final int actionId;
+  final int sessionId;
   final int position;
   final DateTime createdAt;
   const ActivityAction(
       {required this.id,
       required this.activityId,
       required this.actionId,
+      required this.sessionId,
       required this.position,
       required this.createdAt});
   @override
@@ -2465,6 +2484,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
     map['id'] = Variable<int>(id);
     map['activity_id'] = Variable<int>(activityId);
     map['action_id'] = Variable<int>(actionId);
+    map['session_id'] = Variable<int>(sessionId);
     map['position'] = Variable<int>(position);
     map['created_at'] = Variable<DateTime>(createdAt);
     return map;
@@ -2475,6 +2495,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
       id: Value(id),
       activityId: Value(activityId),
       actionId: Value(actionId),
+      sessionId: Value(sessionId),
       position: Value(position),
       createdAt: Value(createdAt),
     );
@@ -2487,6 +2508,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
       id: serializer.fromJson<int>(json['id']),
       activityId: serializer.fromJson<int>(json['activityId']),
       actionId: serializer.fromJson<int>(json['actionId']),
+      sessionId: serializer.fromJson<int>(json['sessionId']),
       position: serializer.fromJson<int>(json['position']),
       createdAt: serializer.fromJson<DateTime>(json['createdAt']),
     );
@@ -2498,6 +2520,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
       'id': serializer.toJson<int>(id),
       'activityId': serializer.toJson<int>(activityId),
       'actionId': serializer.toJson<int>(actionId),
+      'sessionId': serializer.toJson<int>(sessionId),
       'position': serializer.toJson<int>(position),
       'createdAt': serializer.toJson<DateTime>(createdAt),
     };
@@ -2507,12 +2530,14 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
           {int? id,
           int? activityId,
           int? actionId,
+          int? sessionId,
           int? position,
           DateTime? createdAt}) =>
       ActivityAction(
         id: id ?? this.id,
         activityId: activityId ?? this.activityId,
         actionId: actionId ?? this.actionId,
+        sessionId: sessionId ?? this.sessionId,
         position: position ?? this.position,
         createdAt: createdAt ?? this.createdAt,
       );
@@ -2522,6 +2547,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
       activityId:
           data.activityId.present ? data.activityId.value : this.activityId,
       actionId: data.actionId.present ? data.actionId.value : this.actionId,
+      sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId,
       position: data.position.present ? data.position.value : this.position,
       createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
     );
@@ -2533,6 +2559,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
           ..write('id: $id, ')
           ..write('activityId: $activityId, ')
           ..write('actionId: $actionId, ')
+          ..write('sessionId: $sessionId, ')
           ..write('position: $position, ')
           ..write('createdAt: $createdAt')
           ..write(')'))
@@ -2541,7 +2568,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
 
   @override
   int get hashCode =>
-      Object.hash(id, activityId, actionId, position, createdAt);
+      Object.hash(id, activityId, actionId, sessionId, position, createdAt);
   @override
   bool operator ==(Object other) =>
       identical(this, other) ||
@@ -2549,6 +2576,7 @@ class ActivityAction extends DataClass implements Insertable<ActivityAction> {
           other.id == this.id &&
           other.activityId == this.activityId &&
           other.actionId == this.actionId &&
+          other.sessionId == this.sessionId &&
           other.position == this.position &&
           other.createdAt == this.createdAt);
 }
@@ -2557,12 +2585,14 @@ class ActivityActionsCompanion extends UpdateCompanion<ActivityAction> {
   final Value<int> id;
   final Value<int> activityId;
   final Value<int> actionId;
+  final Value<int> sessionId;
   final Value<int> position;
   final Value<DateTime> createdAt;
   const ActivityActionsCompanion({
     this.id = const Value.absent(),
     this.activityId = const Value.absent(),
     this.actionId = const Value.absent(),
+    this.sessionId = const Value.absent(),
     this.position = const Value.absent(),
     this.createdAt = const Value.absent(),
   });
@@ -2570,15 +2600,18 @@ class ActivityActionsCompanion extends UpdateCompanion<ActivityAction> {
     this.id = const Value.absent(),
     required int activityId,
     required int actionId,
+    required int sessionId,
     required int position,
     this.createdAt = const Value.absent(),
   })  : activityId = Value(activityId),
         actionId = Value(actionId),
+        sessionId = Value(sessionId),
         position = Value(position);
   static Insertable<ActivityAction> custom({
     Expression<int>? id,
     Expression<int>? activityId,
     Expression<int>? actionId,
+    Expression<int>? sessionId,
     Expression<int>? position,
     Expression<DateTime>? createdAt,
   }) {
@@ -2586,6 +2619,7 @@ class ActivityActionsCompanion extends UpdateCompanion<ActivityAction> {
       if (id != null) 'id': id,
       if (activityId != null) 'activity_id': activityId,
       if (actionId != null) 'action_id': actionId,
+      if (sessionId != null) 'session_id': sessionId,
       if (position != null) 'position': position,
       if (createdAt != null) 'created_at': createdAt,
     });
@@ -2595,12 +2629,14 @@ class ActivityActionsCompanion extends UpdateCompanion<ActivityAction> {
       {Value<int>? id,
       Value<int>? activityId,
       Value<int>? actionId,
+      Value<int>? sessionId,
       Value<int>? position,
       Value<DateTime>? createdAt}) {
     return ActivityActionsCompanion(
       id: id ?? this.id,
       activityId: activityId ?? this.activityId,
       actionId: actionId ?? this.actionId,
+      sessionId: sessionId ?? this.sessionId,
       position: position ?? this.position,
       createdAt: createdAt ?? this.createdAt,
     );
@@ -2618,6 +2654,9 @@ class ActivityActionsCompanion extends UpdateCompanion<ActivityAction> {
     if (actionId.present) {
       map['action_id'] = Variable<int>(actionId.value);
     }
+    if (sessionId.present) {
+      map['session_id'] = Variable<int>(sessionId.value);
+    }
     if (position.present) {
       map['position'] = Variable<int>(position.value);
     }
@@ -2633,6 +2672,7 @@ class ActivityActionsCompanion extends UpdateCompanion<ActivityAction> {
           ..write('id: $id, ')
           ..write('activityId: $activityId, ')
           ..write('actionId: $actionId, ')
+          ..write('sessionId: $sessionId, ')
           ..write('position: $position, ')
           ..write('createdAt: $createdAt')
           ..write(')'))
@@ -3359,6 +3399,13 @@ abstract class _$AppDatabase extends GeneratedDatabase {
               TableUpdate('activity_actions', kind: UpdateKind.delete),
             ],
           ),
+          WritePropagation(
+            on: TableUpdateQuery.onTableName('sessions',
+                limitUpdateKind: UpdateKind.delete),
+            result: [
+              TableUpdate('activity_actions', kind: UpdateKind.delete),
+            ],
+          ),
           WritePropagation(
             on: TableUpdateQuery.onTableName('media_items',
                 limitUpdateKind: UpdateKind.delete),
@@ -3411,6 +3458,23 @@ final class $$SessionsTableReferences
     return ProcessedTableManager(
         manager.$state.copyWith(prefetchedData: cache));
   }
+
+  static MultiTypedResultKey<$ActivityActionsTable, List<ActivityAction>>
+      _activityActionsRefsTable(_$AppDatabase db) =>
+          MultiTypedResultKey.fromTable(db.activityActions,
+              aliasName: $_aliasNameGenerator(
+                  db.sessions.id, db.activityActions.sessionId));
+
+  $$ActivityActionsTableProcessedTableManager get activityActionsRefs {
+    final manager =
+        $$ActivityActionsTableTableManager($_db, $_db.activityActions)
+            .filter((f) => f.sessionId.id($_item.id));
+
+    final cache =
+        $_typedResult.readTableOrNull(_activityActionsRefsTable($_db));
+    return ProcessedTableManager(
+        manager.$state.copyWith(prefetchedData: cache));
+  }
 }
 
 class $$SessionsTableFilterComposer
@@ -3468,6 +3532,27 @@ class $$SessionsTableFilterComposer
             ));
     return f(composer);
   }
+
+  Expression<bool> activityActionsRefs(
+      Expression<bool> Function($$ActivityActionsTableFilterComposer f) f) {
+    final $$ActivityActionsTableFilterComposer composer = $composerBuilder(
+        composer: this,
+        getCurrentColumn: (t) => t.id,
+        referencedTable: $db.activityActions,
+        getReferencedColumn: (t) => t.sessionId,
+        builder: (joinBuilder,
+                {$addJoinBuilderToRootComposer,
+                $removeJoinBuilderFromRootComposer}) =>
+            $$ActivityActionsTableFilterComposer(
+              $db: $db,
+              $table: $db.activityActions,
+              $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+              joinBuilder: joinBuilder,
+              $removeJoinBuilderFromRootComposer:
+                  $removeJoinBuilderFromRootComposer,
+            ));
+    return f(composer);
+  }
 }
 
 class $$SessionsTableOrderingComposer
@@ -3559,6 +3644,27 @@ class $$SessionsTableAnnotationComposer
                 ));
     return f(composer);
   }
+
+  Expression<T> activityActionsRefs<T extends Object>(
+      Expression<T> Function($$ActivityActionsTableAnnotationComposer a) f) {
+    final $$ActivityActionsTableAnnotationComposer composer = $composerBuilder(
+        composer: this,
+        getCurrentColumn: (t) => t.id,
+        referencedTable: $db.activityActions,
+        getReferencedColumn: (t) => t.sessionId,
+        builder: (joinBuilder,
+                {$addJoinBuilderToRootComposer,
+                $removeJoinBuilderFromRootComposer}) =>
+            $$ActivityActionsTableAnnotationComposer(
+              $db: $db,
+              $table: $db.activityActions,
+              $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+              joinBuilder: joinBuilder,
+              $removeJoinBuilderFromRootComposer:
+                  $removeJoinBuilderFromRootComposer,
+            ));
+    return f(composer);
+  }
 }
 
 class $$SessionsTableTableManager extends RootTableManager<
@@ -3572,7 +3678,8 @@ class $$SessionsTableTableManager extends RootTableManager<
     $$SessionsTableUpdateCompanionBuilder,
     (Session, $$SessionsTableReferences),
     Session,
-    PrefetchHooks Function({bool sessionActivitiesRefs})> {
+    PrefetchHooks Function(
+        {bool sessionActivitiesRefs, bool activityActionsRefs})> {
   $$SessionsTableTableManager(_$AppDatabase db, $SessionsTable table)
       : super(TableManagerState(
           db: db,
@@ -3627,11 +3734,13 @@ class $$SessionsTableTableManager extends RootTableManager<
               .map((e) =>
                   (e.readTable(table), $$SessionsTableReferences(db, table, e)))
               .toList(),
-          prefetchHooksCallback: ({sessionActivitiesRefs = false}) {
+          prefetchHooksCallback: (
+              {sessionActivitiesRefs = false, activityActionsRefs = false}) {
             return PrefetchHooks(
               db: db,
               explicitlyWatchedTables: [
-                if (sessionActivitiesRefs) db.sessionActivities
+                if (sessionActivitiesRefs) db.sessionActivities,
+                if (activityActionsRefs) db.activityActions
               ],
               addJoins: null,
               getPrefetchedDataCallback: (items) async {
@@ -3647,6 +3756,18 @@ class $$SessionsTableTableManager extends RootTableManager<
                         referencedItemsForCurrentItem:
                             (item, referencedItems) => referencedItems
                                 .where((e) => e.sessionId == item.id),
+                        typedResults: items),
+                  if (activityActionsRefs)
+                    await $_getPrefetchedData(
+                        currentTable: table,
+                        referencedTable: $$SessionsTableReferences
+                            ._activityActionsRefsTable(db),
+                        managerFromTypedResult: (p0) =>
+                            $$SessionsTableReferences(db, table, p0)
+                                .activityActionsRefs,
+                        referencedItemsForCurrentItem:
+                            (item, referencedItems) => referencedItems
+                                .where((e) => e.sessionId == item.id),
                         typedResults: items)
                 ];
               },
@@ -3666,7 +3787,8 @@ typedef $$SessionsTableProcessedTableManager = ProcessedTableManager<
     $$SessionsTableUpdateCompanionBuilder,
     (Session, $$SessionsTableReferences),
     Session,
-    PrefetchHooks Function({bool sessionActivitiesRefs})>;
+    PrefetchHooks Function(
+        {bool sessionActivitiesRefs, bool activityActionsRefs})>;
 typedef $$ActivitiesTableCreateCompanionBuilder = ActivitiesCompanion Function({
   Value<int> id,
   required String title,
@@ -4953,6 +5075,7 @@ typedef $$ActivityActionsTableCreateCompanionBuilder = ActivityActionsCompanion
   Value<int> id,
   required int activityId,
   required int actionId,
+  required int sessionId,
   required int position,
   Value<DateTime> createdAt,
 });
@@ -4961,6 +5084,7 @@ typedef $$ActivityActionsTableUpdateCompanionBuilder = ActivityActionsCompanion
   Value<int> id,
   Value<int> activityId,
   Value<int> actionId,
+  Value<int> sessionId,
   Value<int> position,
   Value<DateTime> createdAt,
 });
@@ -4995,6 +5119,19 @@ final class $$ActivityActionsTableReferences extends BaseReferences<
     return ProcessedTableManager(
         manager.$state.copyWith(prefetchedData: [item]));
   }
+
+  static $SessionsTable _sessionIdTable(_$AppDatabase db) =>
+      db.sessions.createAlias(
+          $_aliasNameGenerator(db.activityActions.sessionId, db.sessions.id));
+
+  $$SessionsTableProcessedTableManager get sessionId {
+    final manager = $$SessionsTableTableManager($_db, $_db.sessions)
+        .filter((f) => f.id($_item.sessionId!));
+    final item = $_typedResult.readTableOrNull(_sessionIdTable($_db));
+    if (item == null) return manager;
+    return ProcessedTableManager(
+        manager.$state.copyWith(prefetchedData: [item]));
+  }
 }
 
 class $$ActivityActionsTableFilterComposer
@@ -5054,6 +5191,26 @@ class $$ActivityActionsTableFilterComposer
             ));
     return composer;
   }
+
+  $$SessionsTableFilterComposer get sessionId {
+    final $$SessionsTableFilterComposer composer = $composerBuilder(
+        composer: this,
+        getCurrentColumn: (t) => t.sessionId,
+        referencedTable: $db.sessions,
+        getReferencedColumn: (t) => t.id,
+        builder: (joinBuilder,
+                {$addJoinBuilderToRootComposer,
+                $removeJoinBuilderFromRootComposer}) =>
+            $$SessionsTableFilterComposer(
+              $db: $db,
+              $table: $db.sessions,
+              $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+              joinBuilder: joinBuilder,
+              $removeJoinBuilderFromRootComposer:
+                  $removeJoinBuilderFromRootComposer,
+            ));
+    return composer;
+  }
 }
 
 class $$ActivityActionsTableOrderingComposer
@@ -5113,6 +5270,26 @@ class $$ActivityActionsTableOrderingComposer
             ));
     return composer;
   }
+
+  $$SessionsTableOrderingComposer get sessionId {
+    final $$SessionsTableOrderingComposer composer = $composerBuilder(
+        composer: this,
+        getCurrentColumn: (t) => t.sessionId,
+        referencedTable: $db.sessions,
+        getReferencedColumn: (t) => t.id,
+        builder: (joinBuilder,
+                {$addJoinBuilderToRootComposer,
+                $removeJoinBuilderFromRootComposer}) =>
+            $$SessionsTableOrderingComposer(
+              $db: $db,
+              $table: $db.sessions,
+              $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+              joinBuilder: joinBuilder,
+              $removeJoinBuilderFromRootComposer:
+                  $removeJoinBuilderFromRootComposer,
+            ));
+    return composer;
+  }
 }
 
 class $$ActivityActionsTableAnnotationComposer
@@ -5172,6 +5349,26 @@ class $$ActivityActionsTableAnnotationComposer
             ));
     return composer;
   }
+
+  $$SessionsTableAnnotationComposer get sessionId {
+    final $$SessionsTableAnnotationComposer composer = $composerBuilder(
+        composer: this,
+        getCurrentColumn: (t) => t.sessionId,
+        referencedTable: $db.sessions,
+        getReferencedColumn: (t) => t.id,
+        builder: (joinBuilder,
+                {$addJoinBuilderToRootComposer,
+                $removeJoinBuilderFromRootComposer}) =>
+            $$SessionsTableAnnotationComposer(
+              $db: $db,
+              $table: $db.sessions,
+              $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer,
+              joinBuilder: joinBuilder,
+              $removeJoinBuilderFromRootComposer:
+                  $removeJoinBuilderFromRootComposer,
+            ));
+    return composer;
+  }
 }
 
 class $$ActivityActionsTableTableManager extends RootTableManager<
@@ -5185,7 +5382,7 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
     $$ActivityActionsTableUpdateCompanionBuilder,
     (ActivityAction, $$ActivityActionsTableReferences),
     ActivityAction,
-    PrefetchHooks Function({bool activityId, bool actionId})> {
+    PrefetchHooks Function({bool activityId, bool actionId, bool sessionId})> {
   $$ActivityActionsTableTableManager(
       _$AppDatabase db, $ActivityActionsTable table)
       : super(TableManagerState(
@@ -5201,6 +5398,7 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
             Value<int> id = const Value.absent(),
             Value<int> activityId = const Value.absent(),
             Value<int> actionId = const Value.absent(),
+            Value<int> sessionId = const Value.absent(),
             Value<int> position = const Value.absent(),
             Value<DateTime> createdAt = const Value.absent(),
           }) =>
@@ -5208,6 +5406,7 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
             id: id,
             activityId: activityId,
             actionId: actionId,
+            sessionId: sessionId,
             position: position,
             createdAt: createdAt,
           ),
@@ -5215,6 +5414,7 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
             Value<int> id = const Value.absent(),
             required int activityId,
             required int actionId,
+            required int sessionId,
             required int position,
             Value<DateTime> createdAt = const Value.absent(),
           }) =>
@@ -5222,6 +5422,7 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
             id: id,
             activityId: activityId,
             actionId: actionId,
+            sessionId: sessionId,
             position: position,
             createdAt: createdAt,
           ),
@@ -5231,7 +5432,8 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
                     $$ActivityActionsTableReferences(db, table, e)
                   ))
               .toList(),
-          prefetchHooksCallback: ({activityId = false, actionId = false}) {
+          prefetchHooksCallback: (
+              {activityId = false, actionId = false, sessionId = false}) {
             return PrefetchHooks(
               db: db,
               explicitlyWatchedTables: [],
@@ -5269,6 +5471,16 @@ class $$ActivityActionsTableTableManager extends RootTableManager<
                         $$ActivityActionsTableReferences._actionIdTable(db).id,
                   ) as T;
                 }
+                if (sessionId) {
+                  state = state.withJoin(
+                    currentTable: table,
+                    currentColumn: table.sessionId,
+                    referencedTable:
+                        $$ActivityActionsTableReferences._sessionIdTable(db),
+                    referencedColumn:
+                        $$ActivityActionsTableReferences._sessionIdTable(db).id,
+                  ) as T;
+                }
 
                 return state;
               },
@@ -5291,7 +5503,7 @@ typedef $$ActivityActionsTableProcessedTableManager = ProcessedTableManager<
     $$ActivityActionsTableUpdateCompanionBuilder,
     (ActivityAction, $$ActivityActionsTableReferences),
     ActivityAction,
-    PrefetchHooks Function({bool activityId, bool actionId})>;
+    PrefetchHooks Function({bool activityId, bool actionId, bool sessionId})>;
 typedef $$MediaItemsTableCreateCompanionBuilder = MediaItemsCompanion Function({
   Value<int> id,
   required String title,
diff --git a/lib/database/database.steps.dart b/lib/database/database.steps.dart
index a3ea27d..d545f68 100644
--- a/lib/database/database.steps.dart
+++ b/lib/database/database.steps.dart
@@ -5287,6 +5287,329 @@ i1.GeneratedColumn<String> _column_62(String aliasedName) => i1.GeneratedColumn<
     type: i1.DriftSqlType.string,
     defaultValue: Variable(
         "{\"currentSet\": 0, \"currentRep\": 0, \"currentActionType\": 0, \"currentTime\": 0, \"currentAction\": 0}"));
+
+final class Schema34 extends i0.VersionedSchema {
+  Schema34({required super.database}) : super(version: 34);
+  @override
+  late final List<i1.DatabaseSchemaEntity> entities = [
+    sessions,
+    activities,
+    sessionActivities,
+    actions,
+    activityActions,
+    mediaItems,
+    objectMediaItems,
+  ];
+  late final Shape12 sessions = Shape12(
+      source: i0.VersionedTable(
+        entityName: 'sessions',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_1,
+          _column_2,
+          _column_3,
+          _column_11,
+          _column_20,
+          _column_4,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape17 activities = Shape17(
+      source: i0.VersionedTable(
+        entityName: 'activities',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_40,
+          _column_36,
+          _column_37,
+          _column_38,
+          _column_27,
+          _column_28,
+          _column_29,
+          _column_35,
+          _column_31,
+          _column_32,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape13 sessionActivities = Shape13(
+      source: i0.VersionedTable(
+        entityName: 'session_activities',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_21,
+          _column_22,
+          _column_19,
+          _column_10,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape21 actions = Shape21(
+      source: i0.VersionedTable(
+        entityName: 'actions',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_41,
+          _column_2,
+          _column_42,
+          _column_43,
+          _column_44,
+          _column_45,
+          _column_46,
+          _column_47,
+          _column_48,
+          _column_49,
+          _column_53,
+          _column_54,
+          _column_51,
+          _column_52,
+          _column_58,
+          _column_62,
+          _column_12,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape22 activityActions = Shape22(
+      source: i0.VersionedTable(
+        entityName: 'activity_actions',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_9,
+          _column_23,
+          _column_8,
+          _column_19,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape5 mediaItems = Shape5(
+      source: i0.VersionedTable(
+        entityName: 'media_items',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_41,
+          _column_2,
+          _column_25,
+          _column_6,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape6 objectMediaItems = Shape6(
+      source: i0.VersionedTable(
+        entityName: 'object_media_items',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_15,
+          _column_16,
+          _column_24,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+}
+
+class Shape22 extends i0.VersionedTable {
+  Shape22({required super.source, required super.alias}) : super.aliased();
+  i1.GeneratedColumn<int> get id =>
+      columnsByName['id']! as i1.GeneratedColumn<int>;
+  i1.GeneratedColumn<int> get activityId =>
+      columnsByName['activity_id']! as i1.GeneratedColumn<int>;
+  i1.GeneratedColumn<int> get actionId =>
+      columnsByName['action_id']! as i1.GeneratedColumn<int>;
+  i1.GeneratedColumn<int> get sessionId =>
+      columnsByName['session_id']! as i1.GeneratedColumn<int>;
+  i1.GeneratedColumn<int> get position =>
+      columnsByName['position']! as i1.GeneratedColumn<int>;
+  i1.GeneratedColumn<DateTime> get createdAt =>
+      columnsByName['created_at']! as i1.GeneratedColumn<DateTime>;
+}
+
+final class Schema35 extends i0.VersionedSchema {
+  Schema35({required super.database}) : super(version: 35);
+  @override
+  late final List<i1.DatabaseSchemaEntity> entities = [
+    sessions,
+    activities,
+    sessionActivities,
+    actions,
+    activityActions,
+    mediaItems,
+    objectMediaItems,
+  ];
+  late final Shape12 sessions = Shape12(
+      source: i0.VersionedTable(
+        entityName: 'sessions',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_1,
+          _column_2,
+          _column_3,
+          _column_11,
+          _column_20,
+          _column_4,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape17 activities = Shape17(
+      source: i0.VersionedTable(
+        entityName: 'activities',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_40,
+          _column_36,
+          _column_37,
+          _column_38,
+          _column_27,
+          _column_28,
+          _column_29,
+          _column_35,
+          _column_31,
+          _column_32,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape13 sessionActivities = Shape13(
+      source: i0.VersionedTable(
+        entityName: 'session_activities',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_21,
+          _column_22,
+          _column_19,
+          _column_10,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape21 actions = Shape21(
+      source: i0.VersionedTable(
+        entityName: 'actions',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_41,
+          _column_2,
+          _column_42,
+          _column_43,
+          _column_44,
+          _column_45,
+          _column_46,
+          _column_47,
+          _column_48,
+          _column_49,
+          _column_53,
+          _column_54,
+          _column_51,
+          _column_52,
+          _column_58,
+          _column_62,
+          _column_12,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape22 activityActions = Shape22(
+      source: i0.VersionedTable(
+        entityName: 'activity_actions',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_22,
+          _column_23,
+          _column_21,
+          _column_19,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape5 mediaItems = Shape5(
+      source: i0.VersionedTable(
+        entityName: 'media_items',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_41,
+          _column_2,
+          _column_25,
+          _column_6,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+  late final Shape6 objectMediaItems = Shape6(
+      source: i0.VersionedTable(
+        entityName: 'object_media_items',
+        withoutRowId: false,
+        isStrict: false,
+        tableConstraints: [],
+        columns: [
+          _column_0,
+          _column_15,
+          _column_16,
+          _column_24,
+          _column_5,
+        ],
+        attachedDatabase: database,
+      ),
+      alias: null);
+}
+
 i0.MigrationStepWithVersion migrationSteps({
   required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
   required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
@@ -5320,6 +5643,8 @@ i0.MigrationStepWithVersion migrationSteps({
   required Future<void> Function(i1.Migrator m, Schema31 schema) from30To31,
   required Future<void> Function(i1.Migrator m, Schema32 schema) from31To32,
   required Future<void> Function(i1.Migrator m, Schema33 schema) from32To33,
+  required Future<void> Function(i1.Migrator m, Schema34 schema) from33To34,
+  required Future<void> Function(i1.Migrator m, Schema35 schema) from34To35,
 }) {
   return (currentVersion, database) async {
     switch (currentVersion) {
@@ -5483,6 +5808,16 @@ i0.MigrationStepWithVersion migrationSteps({
         final migrator = i1.Migrator(database, schema);
         await from32To33(migrator, schema);
         return 33;
+      case 33:
+        final schema = Schema34(database: database);
+        final migrator = i1.Migrator(database, schema);
+        await from33To34(migrator, schema);
+        return 34;
+      case 34:
+        final schema = Schema35(database: database);
+        final migrator = i1.Migrator(database, schema);
+        await from34To35(migrator, schema);
+        return 35;
       default:
         throw ArgumentError.value('Unknown migration from $currentVersion');
     }
@@ -5522,6 +5857,8 @@ i1.OnUpgrade stepByStep({
   required Future<void> Function(i1.Migrator m, Schema31 schema) from30To31,
   required Future<void> Function(i1.Migrator m, Schema32 schema) from31To32,
   required Future<void> Function(i1.Migrator m, Schema33 schema) from32To33,
+  required Future<void> Function(i1.Migrator m, Schema34 schema) from33To34,
+  required Future<void> Function(i1.Migrator m, Schema35 schema) from34To35,
 }) =>
     i0.VersionedSchema.stepByStepHelper(
         step: migrationSteps(
@@ -5557,4 +5894,6 @@ i1.OnUpgrade stepByStep({
       from30To31: from30To31,
       from31To32: from31To32,
       from32To33: from32To33,
+      from33To34: from33To34,
+      from34To35: from34To35,
     ));
diff --git a/lib/database/drift_schemas/sendtrain/drift_schema_v34.json b/lib/database/drift_schemas/sendtrain/drift_schema_v34.json
new file mode 100644
index 0000000..df274c9
--- /dev/null
+++ b/lib/database/drift_schemas/sendtrain/drift_schema_v34.json
@@ -0,0 +1 @@
+{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<SessionStatus>(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"address","getter_name":"address","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":100}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityType>(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityCategories>(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"force","getter_name":"force","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"level","getter_name":"level","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityLevel>(ActivityLevel.values)","dart_type_name":"ActivityLevel"}},{"name":"mechanic","getter_name":"mechanic","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityMechanic>(ActivityMechanic.values)","dart_type_name":"ActivityMechanic"}},{"name":"equipment","getter_name":"equipment","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityEquipment>(ActivityEquipment.values)","dart_type_name":"ActivityEquipment"}},{"name":"primary_muscles","getter_name":"primaryMuscles","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityMuscle>(ActivityMuscle.values)","dart_type_name":"ActivityMuscle"}},{"name":"secondary_muscles","getter_name":"secondaryMuscles","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityMuscle>(ActivityMuscle.values)","dart_type_name":"ActivityMuscle"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"position","getter_name":"position","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":64}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"total_sets","getter_name":"totalSets","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"total_reps","getter_name":"totalReps","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":1,"max":32}}]},{"name":"rest_before_sets","getter_name":"restBeforeSets","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rest_between_sets","getter_name":"restBetweenSets","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rest_between_reps","getter_name":"restBetweenReps","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rest_after_sets","getter_name":"restAfterSets","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rep_type","getter_name":"repType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<RepType>(RepType.values)","dart_type_name":"RepType"}},{"name":"rep_length","getter_name":"repLength","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rep_weights","getter_name":"repWeights","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set_weights","getter_name":"setWeights","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_alternating","getter_name":"isAlternating","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_alternating\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_alternating\" IN (0, 1))"},"default_dart":"Variable(false)","default_client_dart":null,"dsl_features":[]},{"name":"tempo","getter_name":"tempo","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":6,"max":36}}]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Variable('pending')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActionStatus>(ActionStatus.values)","dart_type_name":"ActionStatus"}},{"name":"state","getter_name":"state","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Variable(\"{\\\"currentSet\\\": 0, \\\"currentRep\\\": 0, \\\"currentActionType\\\": 0, \\\"currentTime\\\": 0, \\\"currentAction\\\": 0}\")","default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3,0],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"position","getter_name":"position","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":64}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<MediaType>(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ObjectType>(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]}
\ No newline at end of file
diff --git a/lib/database/drift_schemas/sendtrain/drift_schema_v35.json b/lib/database/drift_schemas/sendtrain/drift_schema_v35.json
new file mode 100644
index 0000000..e1a46a2
--- /dev/null
+++ b/lib/database/drift_schemas/sendtrain/drift_schema_v35.json
@@ -0,0 +1 @@
+{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<SessionStatus>(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"address","getter_name":"address","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":100}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityType>(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityCategories>(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"force","getter_name":"force","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"level","getter_name":"level","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityLevel>(ActivityLevel.values)","dart_type_name":"ActivityLevel"}},{"name":"mechanic","getter_name":"mechanic","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityMechanic>(ActivityMechanic.values)","dart_type_name":"ActivityMechanic"}},{"name":"equipment","getter_name":"equipment","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityEquipment>(ActivityEquipment.values)","dart_type_name":"ActivityEquipment"}},{"name":"primary_muscles","getter_name":"primaryMuscles","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityMuscle>(ActivityMuscle.values)","dart_type_name":"ActivityMuscle"}},{"name":"secondary_muscles","getter_name":"secondaryMuscles","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActivityMuscle>(ActivityMuscle.values)","dart_type_name":"ActivityMuscle"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"position","getter_name":"position","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":64}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"total_sets","getter_name":"totalSets","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"total_reps","getter_name":"totalReps","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":1,"max":32}}]},{"name":"rest_before_sets","getter_name":"restBeforeSets","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rest_between_sets","getter_name":"restBetweenSets","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rest_between_reps","getter_name":"restBetweenReps","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rest_after_sets","getter_name":"restAfterSets","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rep_type","getter_name":"repType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<RepType>(RepType.values)","dart_type_name":"RepType"}},{"name":"rep_length","getter_name":"repLength","moor_type":"int","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"rep_weights","getter_name":"repWeights","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set_weights","getter_name":"setWeights","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"is_alternating","getter_name":"isAlternating","moor_type":"bool","nullable":false,"customConstraints":null,"defaultConstraints":"CHECK (\"is_alternating\" IN (0, 1))","dialectAwareDefaultConstraints":{"sqlite":"CHECK (\"is_alternating\" IN (0, 1))"},"default_dart":"Variable(false)","default_client_dart":null,"dsl_features":[]},{"name":"tempo","getter_name":"tempo","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":6,"max":36}}]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Variable('pending')","default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ActionStatus>(ActionStatus.values)","dart_type_name":"ActionStatus"}},{"name":"state","getter_name":"state","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":"Variable(\"{\\\"currentSet\\\": 0, \\\"currentRep\\\": 0, \\\"currentActionType\\\": 0, \\\"currentTime\\\": 0, \\\"currentAction\\\": 0}\")","default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3,0],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"position","getter_name":"position","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":64}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<MediaType>(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter<ObjectType>(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id) ON DELETE CASCADE","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id) ON DELETE CASCADE"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]}
\ No newline at end of file
diff --git a/lib/database/seed.dart b/lib/database/seed.dart
index cccc790..1fb3f83 100644
--- a/lib/database/seed.dart
+++ b/lib/database/seed.dart
@@ -43,14 +43,14 @@ Future<void> seedDb(AppDatabase database) async {
     ['BgheYcxhrsw', MediaType.youtube]
   ];
 
-  final List<String> actionTypes = [
-    "[[{\"actionID\": 0, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 2, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]",
-    "[[{\"actionID\": 0, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 2, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 6, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 7, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 8, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 9, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 10, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 11, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 12, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 13, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 14, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 15, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 16, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 17, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 18, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 19, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]"
-  ];
+  // final List<String> actionTypes = [
+  //   "[[{\"actionID\": 0, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 2, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]",
+  //   "[[{\"actionID\": 0, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 2, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 6, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 7, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 8, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 9, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 10, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 11, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 12, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 13, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 14, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 15, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 16, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 17, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 18, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 19, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]"
+  // ];
 
   final int totalSessions = 15;
   final int totalActivities = 6;
-  final int totalActions = 5;
+  // final int totalActions = 5;
   final int totalMedia = 5;
   final random = Random();
 
@@ -73,7 +73,8 @@ Future<void> seedDb(AppDatabase database) async {
 
     Map<Symbol, Value> payload = {
       Symbol('title'): Value<String>(exercise['name']),
-      Symbol('description'): Value<String>(json.encode(exercise['instructions'])),
+      Symbol('description'):
+          Value<String>(json.encode(exercise['instructions'])),
       Symbol('force'): Value<String>(exercise['force'] ?? "")
     };
 
@@ -125,8 +126,7 @@ Future<void> seedDb(AppDatabase database) async {
             .into(database.mediaItems)
             .insert(MediaItemsCompanion.insert(
                 title: exercise['name'],
-                description:
-                   exercise['name'],
+                description: exercise['name'],
                 reference: mediaItem,
                 type: MediaType.image))
             .then((mediaId) async {
@@ -175,32 +175,56 @@ Future<void> seedDb(AppDatabase database) async {
             ));
 
         // actions
-        for (int k = 0; k <= random.nextInt(totalActions); k++) {
-          await database
-              .into(database.actions)
-              .insert(ActionsCompanion.insert(
-                  title: 'Test action $k',
-                  description:
-                      '$k Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
-                  totalSets: 5,
-                  totalReps: "[1]",
-                  restBeforeSets: Value(30000),
-                  restBetweenSets: Value(300000),
-                  restBetweenReps: Value(15000),
-                  restAfterSets: Value(300000),
-                  repType: RepType.time,
-                  repLength: Value(10000),
-                  repWeights: Value("[110]"),
-                  setWeights: Value("[1]"),
-                  isAlternating: Value(true),
-                  set: actionTypes[random.nextInt(actionTypes.length)]))
-              .then((actionId) async {
-            // add activity action association
-            await database.into(database.activityActions).insert(
-                ActivityActionsCompanion.insert(
-                    activityId: activityId, actionId: actionId, position: k));
-          });
-        }
+        // await database
+        //     .into(database.actions)
+        //     .insert(ActionsCompanion.insert(
+        //         title: 'Test action',
+        //         description:
+        //             'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
+        //         totalSets: 5,
+        //         totalReps: "[1]",
+        //         restBeforeSets: Value(30000),
+        //         restBetweenSets: Value(300000),
+        //         restBetweenReps: Value(15000),
+        //         restAfterSets: Value(300000),
+        //         repType: RepType.time,
+        //         repLength: Value(10000),
+        //         repWeights: Value("[110]"),
+        //         setWeights: Value("[1]"),
+        //         isAlternating: Value(true),
+        //         set: actionTypes[random.nextInt(actionTypes.length)]))
+        //     .then((actionId) async {
+        //   // add activity action association
+        //   await database.into(database.activityActions).insert(
+        //       ActivityActionsCompanion.insert(
+        //           activityId: activityId, actionId: actionId, sessionId: sessionId, position: 0));
+        // });
+        // for (int k = 0; k <= random.nextInt(totalActions); k++) {
+        //   await database
+        //       .into(database.actions)
+        //       .insert(ActionsCompanion.insert(
+        //           title: 'Test action $k',
+        //           description:
+        //               '$k Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.',
+        //           totalSets: 5,
+        //           totalReps: "[1]",
+        //           restBeforeSets: Value(30000),
+        //           restBetweenSets: Value(300000),
+        //           restBetweenReps: Value(15000),
+        //           restAfterSets: Value(300000),
+        //           repType: RepType.time,
+        //           repLength: Value(10000),
+        //           repWeights: Value("[110]"),
+        //           setWeights: Value("[1]"),
+        //           isAlternating: Value(true),
+        //           set: actionTypes[random.nextInt(actionTypes.length)]))
+        //       .then((actionId) async {
+        //     // add activity action association
+        //     await database.into(database.activityActions).insert(
+        //         ActivityActionsCompanion.insert(
+        //             activityId: activityId, actionId: actionId, position: k));
+        //   });
+        // }
       }
 
       for (int n = 0; n <= random.nextInt(totalMedia); n++) {
diff --git a/lib/helpers/widget_helpers.dart b/lib/helpers/widget_helpers.dart
index 9eb87b8..e86bbd0 100644
--- a/lib/helpers/widget_helpers.dart
+++ b/lib/helpers/widget_helpers.dart
@@ -42,3 +42,21 @@ String jsonToDescription(List text) {
 
   return content;
 }
+
+Widget formItemWrapper(Widget content,
+    [EdgeInsets padding = const EdgeInsets.fromLTRB(0, 0, 0, 0)]) {
+  return Expanded(child: Padding(padding: padding, child: content));
+}
+
+List<DropdownMenuEntry> numericDropDownItems(String type, int itemLimit) {
+  final List<DropdownMenuEntry> items = [];
+
+  // String entryName = type;
+
+  for (int i = 0; i < itemLimit; i++) {
+    // if (i != 0) entryName = "${type}s";
+    items.add(DropdownMenuEntry(value: i + 1, label: "${i + 1}"));
+  }
+
+  return items;
+}
diff --git a/lib/main.dart b/lib/main.dart
index 6ffd377..0965839 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -79,6 +79,10 @@ class _AppState extends State<App> {
                 alignment: Alignment.center,
                 child: const Text('In Progress...'),
               ),
+              Container(
+                alignment: Alignment.center,
+                child: const Text('Profile in Progress...'),
+              ),
             ][currentPageIndex]),
         bottomNavigationBar: NavigationBar(
             onDestinationSelected: (int index) {
@@ -98,7 +102,9 @@ class _AppState extends State<App> {
               NavigationDestination(
                   icon: Icon(Icons.group), label: "Team Send"),
               NavigationDestination(
-                  icon: Icon(Icons.analytics), label: "Progress")
+                  icon: Icon(Icons.analytics), label: "Progress"),
+              NavigationDestination(
+                  icon: Icon(Icons.account_circle_rounded), label: "Profile"),
             ]),
         floatingActionButton: FloatingActionButton.extended(
           onPressed: () {
@@ -116,8 +122,7 @@ void main() {
   runApp(MultiProvider(
     providers: [
       Provider<AppDatabase>(
-          create: (context) => db,
-          dispose: (context, db) => db.close()),
+          create: (context) => db, dispose: (context, db) => db.close()),
       ChangeNotifierProvider(create: (context) => ActivityTimerModel()),
       ChangeNotifierProvider(create: (context) => ActionTimer()),
     ],
diff --git a/lib/models/action_model.dart b/lib/models/action_model.dart
index 733ea1d..ca97eb3 100644
--- a/lib/models/action_model.dart
+++ b/lib/models/action_model.dart
@@ -96,7 +96,7 @@ class ActionModel {
           position: totalItems,
           action: action,
           time: action.restAfterSets!,
-          name: 'rest'));
+          name: 'cooldown'));
     }
 
     return items;
@@ -164,8 +164,20 @@ class Set extends Item {
     if (action.repType == RepType.time) {
       for (int i = 0; i < totalReps; i++) {
         position = position > 0 ? position + 1 : position;
+
+        // don't show a rest before first rep
+        if (i > 0) {
+          items.add(Rest(
+              id: position,
+              position: position,
+              parentId: id,
+              action: action,
+              time: action.restBetweenReps,
+              name: 'rest'));
+        }
+
         items.add(Reps(
-            id: position, position: position, parentId: id, action: action));
+            id: ++position, position: position, parentId: id, action: action));
 
         if (action.isAlternating) {
           items.add(Rest(
@@ -180,17 +192,6 @@ class Set extends Item {
               position: position,
               parentId: id,
               action: action));
-
-          // don't show a rest after the last rep
-          if (i < totalReps - 1) {
-            items.add(Rest(
-                id: ++position,
-                position: position,
-                parentId: id,
-                action: action,
-                time: action.restBetweenReps,
-                name: 'prepare'));
-          }
         }
       }
     } else {
diff --git a/lib/providers/action_timer.dart b/lib/providers/action_timer.dart
index 39d577f..81d3b67 100644
--- a/lib/providers/action_timer.dart
+++ b/lib/providers/action_timer.dart
@@ -2,6 +2,9 @@ import 'dart:async';
 import 'dart:convert';
 
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_sound/public/flutter_sound_player.dart';
+import 'package:flutter_sound/flutter_sound.dart';
 import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
 import 'package:sendtrain/database/database.dart';
 import 'package:sendtrain/models/action_model.dart';
@@ -11,6 +14,7 @@ class ActionTimer with ChangeNotifier {
   double _progress = 0;
   int _currentTime = 0;
   final List<ItemScrollController> _scrollControllers = [];
+  final FlutterSoundPlayer _mPlayer = FlutterSoundPlayer();
 
   ActionTimer();
 
@@ -51,27 +55,41 @@ class ActionTimer with ChangeNotifier {
   }
 
   void setup(ActionModel actionModel, ItemScrollController scrollController,
-      [bool resetOnLoad = true]) {
+      [bool resetOnLoad = true]) async {
+    _scrollControllers.add(scrollController);
+
     if (resetOnLoad) {
       if (this.actionModel == actionModel) {
         reset();
+        _scrollControllers.add(scrollController);
       }
 
       this.actionModel = actionModel;
       setAction(currentAction.id);
     }
-
-    _scrollControllers.add(scrollController);
   }
 
   Future pause() async =>
       await actionModel?.updateStatus(ActionStatus.paused).whenComplete(() {
         _periodicTimer?.cancel();
         notifyListeners();
+
+        // _mPlayer.stopPlayer();
+        // Be careful : you must `close` the audio session when you have finished with it.
       });
 
   Future start() async {
     await actionModel!.updateStatus(ActionStatus.started);
+    await _mPlayer.openPlayer();
+
+    Uint8List? countTone;
+    Uint8List? finishTone;
+    await rootBundle
+        .load('assets/audio/count_tone.wav')
+        .then((data) => countTone = data.buffer.asUint8List());
+    await rootBundle
+        .load('assets/audio/count_finish.mp3')
+        .then((data) => finishTone = data.buffer.asUint8List());
 
     // start timer
     if (_periodicTimer == null || _periodicTimer!.isActive == false) {
@@ -83,8 +101,15 @@ class ActionTimer with ChangeNotifier {
           case RepType.time:
             _currentTime--;
 
+            if (_currentTime <= 3 && _currentTime != 0) {
+              await _mPlayer.startPlayer(
+                  fromDataBuffer: countTone, codec: Codec.pcm16WAV);
+            }
+
             if (_currentTime == 0) {
               // move to next action
+              await _mPlayer.startPlayer(
+                  fromDataBuffer: finishTone, codec: Codec.mp3);
               await setAction(state['currentAction'] + 1);
             }
 
@@ -97,18 +122,21 @@ class ActionTimer with ChangeNotifier {
     notifyListeners();
   }
 
-  Future close() async =>
-      await actionModel!.updateStatus(ActionStatus.complete).whenComplete(() {
+  Future close() async => await actionModel!
+          .updateStatus(ActionStatus.complete)
+          .whenComplete(() async {
         _periodicTimer!.cancel();
+        _mPlayer.closePlayer();
         notifyListeners();
       });
 
   Future reset() async {
-    await actionModel!.updateStatus(ActionStatus.pending);
-    await actionModel!.updateState(json.encode(_stateConstructor()));
+    await actionModel?.updateStatus(ActionStatus.pending);
+    await actionModel?.updateState(json.encode(_stateConstructor()));
     _periodicTimer?.cancel();
     _progress = 0;
     _scrollControllers.clear();
+    _mPlayer.closePlayer();
     notifyListeners();
   }
 
@@ -134,39 +162,49 @@ class ActionTimer with ChangeNotifier {
   }
 
   setAction(int actionNum, [bool isManual = false]) async {
-    Item item = allActions[actionNum];
-    Map newState = state;
+    if (actionNum < allActions.length) {
+      Item item = allActions[actionNum];
+      Map newState = state;
 
-    newState['currentAction'] = actionNum;
-    newState['currentSet'] = item.parentId;
-    newState['currentRep'] = item.id;
-    newState['currentTime'] = _currentTime = item.value!;
+      newState['currentAction'] = actionNum;
+      newState['currentSet'] = item.parentId;
+      newState['currentRep'] = item.id;
+      newState['currentTime'] = _currentTime = item.value!;
 
-    await actionModel!
-        .updateState(json.encode(newState))
-        .whenComplete(() async {
-      if (isManual) {
-        await pause();
-        await updateProgress();
-      }
+      await actionModel!
+          .updateState(json.encode(newState))
+          .whenComplete(() async {
+        // if manual select, pause next action
+        if (isManual) {
+          await pause();
+          await updateProgress();
+        }
 
-      int index = currentAction.parentId != null
-          ? currentAction.parentId!
-          : currentAction.id;
+        int index = currentAction.parentId != null
+            ? currentAction.parentId!
+            : currentAction.id;
 
-      for (int i = 0; i < _scrollControllers.length; i++) {
-        ItemScrollController sc = _scrollControllers[i];
+        if (_scrollControllers.isNotEmpty) {
+          for (int i = 0; i < _scrollControllers.length; i++) {
+            ItemScrollController sc = _scrollControllers[i];
 
-        sc.scrollTo(
-            index: index,
-            duration: Duration(milliseconds: 500),
-            curve: Curves.easeInOutCubic);
-      }
-      // _scrollController?.scrollTo(
-      //     index: index,
-      //     duration: Duration(milliseconds: 500),
-      //     curve: Curves.easeInOutCubic);
-    });
+            sc.scrollTo(
+                index: index,
+                duration: Duration(milliseconds: 500),
+                curve: Curves.easeInOutCubic);
+          }
+        }
+        // _scrollController?.scrollTo(
+        //     index: index,
+        //     duration: Duration(milliseconds: 500),
+        //     curve: Curves.easeInOutCubic);
+      });
+    } else {
+      await actionModel?.updateStatus(ActionStatus.complete).whenComplete(() {
+        _periodicTimer?.cancel();
+        notifyListeners();
+      });
+    }
 
     notifyListeners();
   }
diff --git a/lib/widgets/activities/activity_action_editor.dart b/lib/widgets/activities/activity_action_editor.dart
index 9422bfd..61954ae 100644
--- a/lib/widgets/activities/activity_action_editor.dart
+++ b/lib/widgets/activities/activity_action_editor.dart
@@ -1,39 +1,305 @@
+import 'dart:convert';
+
+import 'package:drift/drift.dart' hide Column;
 import 'package:flutter/material.dart' hide Action;
+import 'package:provider/provider.dart';
+import 'package:sendtrain/daos/actions_dao.dart';
+import 'package:sendtrain/daos/activity_actions_dao.dart';
 import 'package:sendtrain/database/database.dart';
+import 'package:sendtrain/helpers/widget_helpers.dart';
+import 'package:sendtrain/widgets/generic/elements/form_drop_down.dart';
 import 'package:sendtrain/widgets/generic/elements/form_text_input.dart';
 
-class ActivityActionEditor extends StatelessWidget {
-  ActivityActionEditor({super.key, required this.action, this.callback});
+class ActivityActionEditor extends StatefulWidget {
+  const ActivityActionEditor(
+      {super.key,
+      required this.session,
+      required this.activity,
+      this.action,
+      this.callback});
 
-  final Action action;
+  final Session session;
+  final Activity activity;
+  final Action? action;
   final Function? callback;
+
+  @override
+  State<ActivityActionEditor> createState() => _ActivityActionEditorState();
+}
+
+class _ActivityActionEditorState extends State<ActivityActionEditor> {
   final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
 
   final Map<String, TextEditingController> actionEditController = {
     'sets': TextEditingController(),
     'reps': TextEditingController(),
     'weight': TextEditingController(),
+    'repLength': TextEditingController(),
+    'preparation': TextEditingController(),
+    'setRest': TextEditingController(),
+    'repRest': TextEditingController(),
+    'cooldown': TextEditingController(),
+    'type': TextEditingController(),
+    'alternating': TextEditingController(),
   };
 
+  late final AppDatabase db;
+
+  bool isAlternating = false;
+  bool isTimed = false;
+  String editorType = 'Create';
+
+  @override
+  void initState() {
+    super.initState();
+    db = Provider.of<AppDatabase>(context, listen: false);
+
+    // if we're editing a session, we'll want to populate it with the appropriate values
+    if (widget.action != null) {
+      final Action action = widget.action!;
+      editorType = 'Edit';
+      isAlternating = action.isAlternating;
+      isTimed = action.repType == RepType.time ? true : false;
+
+      actionEditController['sets']?.text = action.totalSets.toString();
+      actionEditController['reps']?.text =
+          json.decode(action.totalReps)[0].toString();
+      actionEditController['weight']?.text =
+          json.decode(action.repWeights ?? "")[0].toString();
+      actionEditController['repLength']?.text =
+          ((action.repLength ?? 0) ~/ 1000).toString();
+      actionEditController['preparation']?.text =
+          ((action.restBeforeSets ?? 0) ~/ 1000).toString();
+      actionEditController['setRest']?.text =
+          ((action.restBetweenSets ?? 0) ~/ 1000).toString();
+      actionEditController['repRest']?.text =
+          ((action.restBetweenReps ?? 0) ~/ 1000).toString();
+      actionEditController['cooldown']?.text =
+          ((action.restAfterSets ?? 0) ~/ 1000).toString();
+      actionEditController['isTimed']?.text = isTimed.toString();
+      actionEditController['alternating']?.text = isAlternating.toString();
+    }
+  }
+
   @override
   Widget build(BuildContext context) {
-    String editorType = 'Create';
+    if (widget.action != null) {
+      editorType = 'Edit';
+    }
 
     return Padding(
         padding: EdgeInsets.fromLTRB(15, 0, 15, 15),
         child: Form(
             key: _formKey,
             child: Column(
-              mainAxisSize: MainAxisSize.min,
-              crossAxisAlignment: CrossAxisAlignment.center,
-              children: <Widget>[
-                Padding(
-                    padding: EdgeInsets.only(top: 10, bottom: 10),
-                    child: Text('$editorType Action',
-                        textAlign: TextAlign.center,
-                        style: Theme.of(context).textTheme.titleLarge)),
-                FormTextInput(
-                    controller: actionEditController['sets']!,
-                    title: 'Total Sets'),])));
+                mainAxisSize: MainAxisSize.min,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: <Widget>[
+                  Padding(
+                      padding: EdgeInsets.only(top: 10, bottom: 10),
+                      child: Text('$editorType Action',
+                          textAlign: TextAlign.center,
+                          style: Theme.of(context).textTheme.titleLarge)),
+                  Row(children: [
+                    formItemWrapper(
+                        CheckboxListTile(
+                          title: Text("Reps alternate? (eg. Left/Right Hand)"),
+                          value: isAlternating,
+                          shape: RoundedRectangleBorder(
+                            borderRadius:
+                                BorderRadius.all(Radius.circular(10.0)),
+                          ),
+                          onChanged: (bool? value) {
+                            setState(() {
+                              isAlternating = value!;
+                            });
+                          },
+                        ),
+                        EdgeInsets.fromLTRB(10, 10, 10, 10)),
+                  ]),
+                  Row(children: [
+                    formItemWrapper(
+                        CheckboxListTile(
+                          title: Text("Are reps timed?"),
+                          value: isTimed,
+                          shape: RoundedRectangleBorder(
+                            borderRadius:
+                                BorderRadius.all(Radius.circular(10.0)),
+                          ),
+                          onChanged: (bool? value) {
+                            setState(() {
+                              isTimed = value!;
+                            });
+                          },
+                        ),
+                        EdgeInsets.fromLTRB(10, 10, 10, 15))
+                  ]),
+                  Row(children: [
+                    FormDropDown(
+                        title: 'Sets',
+                        entries: numericDropDownItems('Set', 50),
+                        controller: actionEditController['sets']!),
+                    FormDropDown(
+                      title: 'Reps',
+                      entries: numericDropDownItems('Rep', 100),
+                      controller: actionEditController['reps']!,
+                    )
+                  ]),
+                  Row(children: [
+                    formItemWrapper(
+                        FormTextInput(
+                            type: InputTypes.number,
+                            controller: actionEditController['preparation']!,
+                            title: 'Preparation (sec)',
+                            hint: 'time before start',
+                            requiresValidation: false),
+                        EdgeInsets.fromLTRB(10, 5, 10, 0)),
+                    formItemWrapper(
+                        FormTextInput(
+                            type: InputTypes.number,
+                            controller: actionEditController['cooldown']!,
+                            title: 'Cooldown (sec)',
+                            hint: 'rest after completion',
+                            requiresValidation: false),
+                        EdgeInsets.fromLTRB(10, 5, 10, 0)),
+                  ]),
+                  Row(children: [
+                    formItemWrapper(
+                        FormTextInput(
+                            type: InputTypes.number,
+                            controller: actionEditController['setRest']!,
+                            title: 'Set Rest (sec)',
+                            hint: 'Rest between sets',
+                            requiresValidation: false),
+                        EdgeInsets.only(left: 10, right: 10)),
+                    formItemWrapper(
+                        FormTextInput(
+                            type: InputTypes.number,
+                            controller: actionEditController['repRest']!,
+                            title: 'Rep Rest (sec)',
+                            hint: 'Rest between reps',
+                            requiresValidation: false),
+                        EdgeInsets.only(left: 10, right: 10)),
+                  ]),
+                  Row(children: [
+                    formItemWrapper(
+                        FormTextInput(
+                            type: InputTypes.number,
+                            controller: actionEditController['repLength']!,
+                            title: 'Rep Length (sec)',
+                            hint: 'Total rep time (not required)',
+                            requiresValidation: false),
+                        EdgeInsets.only(left: 10, right: 10)),
+                    formItemWrapper(
+                        FormTextInput(
+                            type: InputTypes.number,
+                            controller: actionEditController['weight']!,
+                            title: 'Weight',
+                            hint: 'Weight for reps',
+                            requiresValidation: false),
+                        EdgeInsets.only(left: 10, right: 10)),
+                  ]),
+                  Row(mainAxisAlignment: MainAxisAlignment.end, children: [
+                    Padding(
+                        padding: EdgeInsets.only(top: 10, right: 10),
+                        child: FilledButton(
+                            onPressed: () async {
+                              if (_formKey.currentState!.validate()) {
+                                if (widget.action != null) {
+                                  Action newAction = widget.action!.copyWith(
+                                    totalSets: int.parse(
+                                        actionEditController['sets']!.text),
+                                    totalReps: json.encode([
+                                      int.parse(
+                                          actionEditController['reps']!.text)
+                                    ]),
+                                    repLength: Value<int>(int.parse(
+                                            actionEditController['repLength']!
+                                                .text) *
+                                        1000),
+                                    restBeforeSets: Value<int>(int.parse(
+                                            actionEditController['preparation']!
+                                                .text) *
+                                        1000),
+                                    restBetweenSets: Value<int>(int.parse(
+                                            actionEditController['setRest']!
+                                                .text) *
+                                        1000),
+                                    restBetweenReps: Value<int>(int.parse(
+                                            actionEditController['repRest']!
+                                                .text) *
+                                        1000),
+                                    restAfterSets: Value<int>(int.parse(
+                                            actionEditController['cooldown']!
+                                                .text) *
+                                        1000),
+                                    repType: int.parse(actionEditController[
+                                                    'repLength']!
+                                                .text) >
+                                            0
+                                        ? RepType.time
+                                        : RepType.count,
+                                    repWeights: Value<String>(json.encode([
+                                      int.parse(
+                                          actionEditController['weight']!.text)
+                                    ])),
+                                    // setWeights: Value<String>(json.encode([actionEditController['setWeights']!.text])),
+                                    isAlternating: isAlternating,
+                                  );
+
+                                  // var result = await ActionsDao(db).createOrUpdate(
+                                  //     newAction.toCompanion(true));
+                                  await ActionsDao(db).replace(newAction);
+                                } else {
+                                  // create action
+                                  await ActionsDao(db)
+                                      .createOrUpdate(ActionsCompanion(
+                                          title: Value('title'),
+                                          description: Value('description'),
+                                          totalSets: Value(int.parse(
+                                              actionEditController['sets']!
+                                                  .text)),
+                                          totalReps: Value(json.encode(
+                                              [int.parse(actionEditController['reps']!.text)])),
+                                          repLength: Value<int>(
+                                              int.parse(actionEditController['repLength']!.text) *
+                                                  1000),
+                                          restBeforeSets: Value<int>(
+                                              int.parse(actionEditController['preparation']!.text) *
+                                                  1000),
+                                          restBetweenSets: Value<int>(
+                                              int.parse(actionEditController['setRest']!.text) *
+                                                  1000),
+                                          restBetweenReps:
+                                              Value<int>(int.parse(actionEditController['repRest']!.text) * 1000),
+                                          restAfterSets: Value<int>(int.parse(actionEditController['cooldown']!.text) * 1000),
+                                          repType: Value(int.parse(actionEditController['repLength']!.text) > 0 ? RepType.time : RepType.count),
+                                          repWeights: Value<String>(json.encode([int.parse(actionEditController['weight']!.text)])),
+                                          // setWeights: Value<String>(json.encode([actionEditController['setWeights']!.text])),
+                                          isAlternating: Value<bool>(isAlternating),
+                                          // repType: RepType.values.firstWhere((e) => e.toString() == "RepType.${actionEditController['repType']!.text}"),
+                                          set: Value("")))
+                                      .then((actionId) {
+                                    ActivityActionsDao(db).createOrUpdate(
+                                        ActivityActionsCompanion(
+                                            activityId:
+                                                Value(widget.activity.id),
+                                            sessionId: Value(widget.session.id),
+                                            actionId: Value(actionId),
+                                            position: Value(0)));
+                                  });
+                                }
+
+                                Navigator.pop(
+                                    _formKey.currentContext!, 'Submit');
+
+                                if (widget.callback != null) {
+                                  await widget.callback!();
+                                }
+                              }
+                            },
+                            child: Text('Submit')))
+                  ])
+                ])));
   }
-}
\ No newline at end of file
+}
diff --git a/lib/widgets/activities/activity_action_view.dart b/lib/widgets/activities/activity_action_view.dart
index 14b7255..a44c33c 100644
--- a/lib/widgets/activities/activity_action_view.dart
+++ b/lib/widgets/activities/activity_action_view.dart
@@ -3,20 +3,32 @@ import 'package:provider/provider.dart';
 import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
 import 'package:sendtrain/database/database.dart';
 import 'package:sendtrain/extensions/string_extensions.dart';
+import 'package:sendtrain/helpers/widget_helpers.dart';
 import 'package:sendtrain/models/action_model.dart';
 import 'package:sendtrain/providers/action_timer.dart';
+import 'package:sendtrain/widgets/activities/activity_action_editor.dart';
 import 'package:sendtrain/widgets/generic/elements/add_card_generic.dart';
 
-class ActivityActionView extends StatefulWidget {
-  const ActivityActionView({super.key, required this.actions, this.resetOnLoad = true});
+// class ActivityActionView extends StatefulWidget {
+class ActivityActionView extends StatelessWidget {
+  ActivityActionView(
+      {super.key,
+      required this.session,
+      required this.activity,
+      required this.actions,
+      this.callback,
+      this.resetOnLoad = true});
+  final Session session;
+  final Activity activity;
   final List actions;
+  final Function? callback;
   final bool resetOnLoad;
 
-  @override
-  State<ActivityActionView> createState() => ActivityActionViewState();
-}
+  // @override
+  // State<ActivityActionView> createState() => ActivityActionViewState();
+// }
 
-class ActivityActionViewState extends State<ActivityActionView> {
+// class ActivityActionViewState extends State<ActivityActionView> {
 // class ActivityActionView extends StatelessWidget {
   //  ActivityActionView({super.key, required this.actions});
 
@@ -30,7 +42,7 @@ class ActivityActionViewState extends State<ActivityActionView> {
       ScrollOffsetListener.create();
 
   late final ActionTimer at;
-  int actionCount = 0;
+  // int actionCount = 0;
 
   GestureDetector gtBuild(
       ActionTimer at, Item item, int actionNum, int selectedIndex,
@@ -68,17 +80,23 @@ class ActivityActionViewState extends State<ActivityActionView> {
     }));
   }
 
-  @override
-  void initState() {
-    super.initState();
-    at = Provider.of<ActionTimer>(context, listen: false);
-  }
+  // @override
+  // void initState() {
+  //   super.initState();
+  //   at = Provider.of<ActionTimer>(context, listen: false);
+  // }
 
   @override
   Widget build(BuildContext context) {
-    if (widget.actions.isNotEmpty) {
-      at.setup(ActionModel(
-          action: widget.actions.first, db: Provider.of<AppDatabase>(context)), itemScrollController, widget.resetOnLoad);
+    at = Provider.of<ActionTimer>(context, listen: false);
+    int actionCount = 0;
+    if (actions.isNotEmpty) {
+      at.setup(
+          ActionModel(
+              action: actions.first,
+              db: Provider.of<AppDatabase>(context)),
+          itemScrollController,
+          resetOnLoad);
 
       // WidgetsBinding.instance.addPostFrameCallback((_) {
       //   if (itemScrollController.isAttached) {
@@ -117,7 +135,7 @@ class ActivityActionViewState extends State<ActivityActionView> {
                               onPressed: () => {
                                     if (at.started)
                                       {at.pause()}
-                                    else if (at.available)
+                                    else if (at.available || at.complete)
                                       {at.start()}
                                   });
                         },
@@ -220,7 +238,12 @@ class ActivityActionViewState extends State<ActivityActionView> {
           description:
               'Click here to create an exercise template (sets and reps, etc) for your activity!',
           action: () {
-            print('teset');
+            showEditorSheet(
+                context,
+                ActivityActionEditor(
+                    session: session,
+                    activity: activity,
+                    callback: callback));
           });
     }
   }
diff --git a/lib/widgets/activities/activity_card.dart b/lib/widgets/activities/activity_card.dart
index 78e9130..606e408 100644
--- a/lib/widgets/activities/activity_card.dart
+++ b/lib/widgets/activities/activity_card.dart
@@ -49,7 +49,7 @@ class ActivityCardState extends State<ActivityCard> {
               clipBehavior: Clip.hardEdge,
               child: InkWell(
                   onTap: () => showGenericDialog(
-                      ActivityView(activity: widget.activity), context),
+                      ActivityView(session: widget.session, activity: widget.activity), context),
                   child: Column(
                     mainAxisSize: MainAxisSize.min,
                     children: <Widget>[
diff --git a/lib/widgets/activities/activity_view.dart b/lib/widgets/activities/activity_view.dart
index be0c517..f32a2d7 100644
--- a/lib/widgets/activities/activity_view.dart
+++ b/lib/widgets/activities/activity_view.dart
@@ -7,6 +7,7 @@ import 'package:sendtrain/daos/actions_dao.dart';
 import 'package:sendtrain/database/database.dart';
 import 'package:sendtrain/extensions/string_extensions.dart';
 import 'package:sendtrain/helpers/widget_helpers.dart';
+import 'package:sendtrain/providers/action_timer.dart';
 import 'package:sendtrain/widgets/activities/activity_action_editor.dart';
 import 'package:sendtrain/widgets/activities/activity_action_view.dart';
 import 'package:sendtrain/widgets/activities/activity_view_categories.dart';
@@ -14,7 +15,9 @@ import 'package:sendtrain/widgets/activities/activity_view_media.dart';
 import 'package:sendtrain/widgets/builders/dialogs.dart';
 
 class ActivityView extends StatefulWidget {
-  const ActivityView({super.key, required this.activity});
+  const ActivityView(
+      {super.key, required this.session, required this.activity});
+  final Session session;
   final Activity activity;
 
   @override
@@ -22,6 +25,17 @@ class ActivityView extends StatefulWidget {
 }
 
 class _ActivityViewState extends State<ActivityView> {
+  final _fabKey = GlobalKey<ExpandableFabState>();
+
+  void resetState() async {
+    final state = _fabKey.currentState;
+    if (state != null && state.isOpen) {
+      state.toggle();
+    }
+
+    setState(() {});
+  }
+
   List<ActivityMuscle> activityMuscle(Activity activity) {
     List<ActivityMuscle> muscles = [];
 
@@ -39,10 +53,11 @@ class _ActivityViewState extends State<ActivityView> {
   @override
   Widget build(BuildContext context) {
     final Activity activity = widget.activity;
+    final Session session = widget.session;
 
     return FutureBuilder<List>(
         future: ActionsDao(Provider.of<AppDatabase>(context))
-            .fromActivity(activity),
+            .fromActivity(activity, session),
         builder: (context, snapshot) {
           if (snapshot.hasData) {
             List<Action> actions = snapshot.data! as List<Action>;
@@ -61,12 +76,19 @@ class _ActivityViewState extends State<ActivityView> {
                 child: Scaffold(
                     floatingActionButtonLocation: ExpandableFab.location,
                     floatingActionButton: ExpandableFab(
+                        key: _fabKey,
                         distance: 70,
                         type: ExpandableFabType.up,
                         overlayStyle: ExpandableFabOverlayStyle(
                           color: Colors.black.withOpacity(0.5),
                           blur: 10,
                         ),
+                        onOpen: () {
+                          // pause the activity on open
+                          ActionTimer at =
+                              Provider.of<ActionTimer>(context, listen: false);
+                          if (at.started) at.pause();
+                        },
                         children: [
                           // FloatingActionButton.extended(
                           //   icon: const Icon(Icons.upload_outlined),
@@ -80,7 +102,10 @@ class _ActivityViewState extends State<ActivityView> {
                               showEditorSheet(
                                   context,
                                   ActivityActionEditor(
-                                      action: actions.first, callback: () {}));
+                                      session: session,
+                                      activity: activity,
+                                      action: actions.first,
+                                      callback: resetState));
                             },
                           ),
                           FloatingActionButton.extended(
@@ -228,7 +253,10 @@ class _ActivityViewState extends State<ActivityView> {
                                         context,
                                         Column(children: [
                                           ActivityActionView(
+                                              session: session,
+                                              activity: activity,
                                               actions: actions,
+                                              callback: resetState,
                                               resetOnLoad: false)
                                         ]),
                                         Theme.of(context).colorScheme.surface);
@@ -237,7 +265,11 @@ class _ActivityViewState extends State<ActivityView> {
                                   alignment: Alignment.bottomCenter,
                                 )
                               ])),
-                          ActivityActionView(actions: actions)
+                          ActivityActionView(
+                              session: session,
+                              activity: activity,
+                              actions: actions,
+                              callback: resetState)
                         ])));
             // ] +
             // action(actions, context)));
diff --git a/lib/widgets/generic/elements/form_drop_down.dart b/lib/widgets/generic/elements/form_drop_down.dart
new file mode 100644
index 0000000..cb476df
--- /dev/null
+++ b/lib/widgets/generic/elements/form_drop_down.dart
@@ -0,0 +1,32 @@
+import 'package:flutter/material.dart';
+import 'package:sendtrain/helpers/widget_helpers.dart';
+
+class FormDropDown extends StatelessWidget {
+  const FormDropDown(
+      {super.key,
+      required this.title,
+      required this.entries,
+      required this.controller});
+
+  final List<DropdownMenuEntry> entries;
+  final String title;
+  final TextEditingController controller;
+
+  @override
+  Widget build(BuildContext context) {
+    return formItemWrapper(
+        DropdownMenu(
+            leadingIcon: Icon(Icons.select_all_rounded),
+            initialSelection: controller.text,
+            controller: controller,
+            expandedInsets: EdgeInsets.zero,
+            inputDecorationTheme: InputDecorationTheme(
+                filled: true,
+                border: OutlineInputBorder(
+                    borderSide: BorderSide.none,
+                    borderRadius: BorderRadius.circular(12))),
+            label: Text(title),
+            dropdownMenuEntries: entries),
+        EdgeInsets.fromLTRB(10, 5, 10, 5));
+  }
+}
diff --git a/lib/widgets/generic/elements/form_text_input.dart b/lib/widgets/generic/elements/form_text_input.dart
index f7c4490..ba2ac95 100644
--- a/lib/widgets/generic/elements/form_text_input.dart
+++ b/lib/widgets/generic/elements/form_text_input.dart
@@ -1,4 +1,7 @@
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+enum InputTypes { text, number }
 
 class FormTextInput extends StatelessWidget {
   const FormTextInput(
@@ -9,7 +12,10 @@ class FormTextInput extends StatelessWidget {
       this.maxLines,
       this.minLines,
       this.onTap,
-      this.requiresValidation=true});
+      this.requiresValidation = true,
+      this.type = InputTypes.text,
+      this.hint,
+      this.validations});
 
   final TextEditingController controller;
   final String title;
@@ -18,12 +24,25 @@ class FormTextInput extends StatelessWidget {
   final Icon? icon;
   final dynamic onTap;
   final bool requiresValidation;
+  final InputTypes type;
+  final String? hint;
+  final Function? validations;
 
   @override
   Widget build(BuildContext context) {
+    final Map params = {};
+    if (type == InputTypes.number) {
+      params['keyboardType'] = TextInputType.number;
+      params['inputFormatters'] = <TextInputFormatter>[
+        FilteringTextInputFormatter.digitsOnly
+      ];
+    }
+
     return Padding(
         padding: EdgeInsets.only(top: 10, bottom: 10),
         child: TextFormField(
+            keyboardType: params['keyboardType'] ?? TextInputType.text,
+            inputFormatters: params['inputFormatters'] ?? [],
             minLines: minLines ?? 1,
             maxLines: maxLines ?? 1,
             controller: controller,
@@ -34,6 +53,7 @@ class FormTextInput extends StatelessWidget {
                   borderSide: BorderSide.none,
                   borderRadius: BorderRadius.circular(12)),
               labelText: title,
+              hintText: hint ?? '',
             ),
             validator: (String? value) {
               if (requiresValidation == true) {
@@ -41,9 +61,11 @@ class FormTextInput extends StatelessWidget {
                   return 'Please enter some text';
                 }
 
-                if (value.length < 3) {
-                  return 'Please enter a minimum of 3 characters';
-                }
+                if (validations != null) validations!(value);
+
+                // if (value.length < 3) {
+                //   return 'Please enter a minimum of 3 characters';
+                // }
               }
               return null;
             },
diff --git a/lib/widgets/media/media_card.dart b/lib/widgets/media/media_card.dart
index 042b933..eed627f 100644
--- a/lib/widgets/media/media_card.dart
+++ b/lib/widgets/media/media_card.dart
@@ -1,6 +1,4 @@
 import 'dart:convert';
-import 'dart:io';
-import 'dart:typed_data';
 
 import 'package:flutter/material.dart';
 import 'package:provider/provider.dart';
@@ -8,7 +6,6 @@ import 'package:sendtrain/daos/media_items_dao.dart';
 import 'package:sendtrain/database/database.dart';
 import 'package:sendtrain/helpers/widget_helpers.dart';
 import 'package:sendtrain/widgets/builders/dialogs.dart';
-import 'package:video_player/video_player.dart';
 
 class MediaCard extends StatelessWidget {
   const MediaCard(
diff --git a/pubspec.yaml b/pubspec.yaml
index 2748ab5..bb3386f 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -52,6 +52,7 @@ dependencies:
   video_player: ^2.9.2
   dart_casing: ^3.0.1
   collection: ^1.18.0
+  flutter_sound: ^9.23.1
 
 flutter_launcher_name:
   name: "SendTrain"
@@ -87,6 +88,7 @@ flutter:
   #   - images/a_dot_burr.jpeg
   #   - images/a_dot_ham.jpeg
   assets:
+    - assets/audio/
     - assets/images/
     - assets/exercises.json
 
diff --git a/test/drift/sendtrain/generated/schema.dart b/test/drift/sendtrain/generated/schema.dart
index 2ad4626..a356905 100644
--- a/test/drift/sendtrain/generated/schema.dart
+++ b/test/drift/sendtrain/generated/schema.dart
@@ -36,6 +36,8 @@ import 'schema_v30.dart' as v30;
 import 'schema_v31.dart' as v31;
 import 'schema_v32.dart' as v32;
 import 'schema_v33.dart' as v33;
+import 'schema_v34.dart' as v34;
+import 'schema_v35.dart' as v35;
 
 class GeneratedHelper implements SchemaInstantiationHelper {
   @override
@@ -107,6 +109,10 @@ class GeneratedHelper implements SchemaInstantiationHelper {
         return v32.DatabaseAtV32(db);
       case 33:
         return v33.DatabaseAtV33(db);
+      case 34:
+        return v34.DatabaseAtV34(db);
+      case 35:
+        return v35.DatabaseAtV35(db);
       default:
         throw MissingSchemaException(version, versions);
     }
@@ -145,6 +151,8 @@ class GeneratedHelper implements SchemaInstantiationHelper {
     30,
     31,
     32,
-    33
+    33,
+    34,
+    35
   ];
 }
diff --git a/test/drift/sendtrain/generated/schema_v34.dart b/test/drift/sendtrain/generated/schema_v34.dart
new file mode 100644
index 0000000..b5c8715
--- /dev/null
+++ b/test/drift/sendtrain/generated/schema_v34.dart
@@ -0,0 +1,2733 @@
+// dart format width=80
+// GENERATED CODE, DO NOT EDIT BY HAND.
+// ignore_for_file: type=lint
+import 'package:drift/drift.dart';
+
+class Sessions extends Table with TableInfo<Sessions, SessionsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  Sessions(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> content = GeneratedColumn<String>(
+      'body', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> status = GeneratedColumn<String>(
+      'status', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> achievements = GeneratedColumn<String>(
+      'achievements', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> address = GeneratedColumn<String>(
+      'address', aliasedName, true,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256),
+      type: DriftSqlType.string,
+      requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> date = GeneratedColumn<DateTime>(
+      'date', aliasedName, true,
+      type: DriftSqlType.dateTime, requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, title, content, status, achievements, address, date, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'sessions';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  SessionsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return SessionsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      content: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body'])!,
+      status: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}status'])!,
+      achievements: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}achievements']),
+      address: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}address']),
+      date: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}date']),
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  Sessions createAlias(String alias) {
+    return Sessions(attachedDatabase, alias);
+  }
+}
+
+class SessionsData extends DataClass implements Insertable<SessionsData> {
+  final int id;
+  final String title;
+  final String content;
+  final String status;
+  final String? achievements;
+  final String? address;
+  final DateTime? date;
+  final DateTime createdAt;
+  const SessionsData(
+      {required this.id,
+      required this.title,
+      required this.content,
+      required this.status,
+      this.achievements,
+      this.address,
+      this.date,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    map['body'] = Variable<String>(content);
+    map['status'] = Variable<String>(status);
+    if (!nullToAbsent || achievements != null) {
+      map['achievements'] = Variable<String>(achievements);
+    }
+    if (!nullToAbsent || address != null) {
+      map['address'] = Variable<String>(address);
+    }
+    if (!nullToAbsent || date != null) {
+      map['date'] = Variable<DateTime>(date);
+    }
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  SessionsCompanion toCompanion(bool nullToAbsent) {
+    return SessionsCompanion(
+      id: Value(id),
+      title: Value(title),
+      content: Value(content),
+      status: Value(status),
+      achievements: achievements == null && nullToAbsent
+          ? const Value.absent()
+          : Value(achievements),
+      address: address == null && nullToAbsent
+          ? const Value.absent()
+          : Value(address),
+      date: date == null && nullToAbsent ? const Value.absent() : Value(date),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory SessionsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return SessionsData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      content: serializer.fromJson<String>(json['content']),
+      status: serializer.fromJson<String>(json['status']),
+      achievements: serializer.fromJson<String?>(json['achievements']),
+      address: serializer.fromJson<String?>(json['address']),
+      date: serializer.fromJson<DateTime?>(json['date']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'content': serializer.toJson<String>(content),
+      'status': serializer.toJson<String>(status),
+      'achievements': serializer.toJson<String?>(achievements),
+      'address': serializer.toJson<String?>(address),
+      'date': serializer.toJson<DateTime?>(date),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  SessionsData copyWith(
+          {int? id,
+          String? title,
+          String? content,
+          String? status,
+          Value<String?> achievements = const Value.absent(),
+          Value<String?> address = const Value.absent(),
+          Value<DateTime?> date = const Value.absent(),
+          DateTime? createdAt}) =>
+      SessionsData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        content: content ?? this.content,
+        status: status ?? this.status,
+        achievements:
+            achievements.present ? achievements.value : this.achievements,
+        address: address.present ? address.value : this.address,
+        date: date.present ? date.value : this.date,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  SessionsData copyWithCompanion(SessionsCompanion data) {
+    return SessionsData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      content: data.content.present ? data.content.value : this.content,
+      status: data.status.present ? data.status.value : this.status,
+      achievements: data.achievements.present
+          ? data.achievements.value
+          : this.achievements,
+      address: data.address.present ? data.address.value : this.address,
+      date: data.date.present ? data.date.value : this.date,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionsData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('content: $content, ')
+          ..write('status: $status, ')
+          ..write('achievements: $achievements, ')
+          ..write('address: $address, ')
+          ..write('date: $date, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(
+      id, title, content, status, achievements, address, date, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is SessionsData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.content == this.content &&
+          other.status == this.status &&
+          other.achievements == this.achievements &&
+          other.address == this.address &&
+          other.date == this.date &&
+          other.createdAt == this.createdAt);
+}
+
+class SessionsCompanion extends UpdateCompanion<SessionsData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String> content;
+  final Value<String> status;
+  final Value<String?> achievements;
+  final Value<String?> address;
+  final Value<DateTime?> date;
+  final Value<DateTime> createdAt;
+  const SessionsCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.content = const Value.absent(),
+    this.status = const Value.absent(),
+    this.achievements = const Value.absent(),
+    this.address = const Value.absent(),
+    this.date = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  SessionsCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    required String content,
+    required String status,
+    this.achievements = const Value.absent(),
+    this.address = const Value.absent(),
+    this.date = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  })  : title = Value(title),
+        content = Value(content),
+        status = Value(status);
+  static Insertable<SessionsData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? content,
+    Expression<String>? status,
+    Expression<String>? achievements,
+    Expression<String>? address,
+    Expression<DateTime>? date,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (content != null) 'body': content,
+      if (status != null) 'status': status,
+      if (achievements != null) 'achievements': achievements,
+      if (address != null) 'address': address,
+      if (date != null) 'date': date,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  SessionsCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String>? content,
+      Value<String>? status,
+      Value<String?>? achievements,
+      Value<String?>? address,
+      Value<DateTime?>? date,
+      Value<DateTime>? createdAt}) {
+    return SessionsCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      content: content ?? this.content,
+      status: status ?? this.status,
+      achievements: achievements ?? this.achievements,
+      address: address ?? this.address,
+      date: date ?? this.date,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (content.present) {
+      map['body'] = Variable<String>(content.value);
+    }
+    if (status.present) {
+      map['status'] = Variable<String>(status.value);
+    }
+    if (achievements.present) {
+      map['achievements'] = Variable<String>(achievements.value);
+    }
+    if (address.present) {
+      map['address'] = Variable<String>(address.value);
+    }
+    if (date.present) {
+      map['date'] = Variable<DateTime>(date.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionsCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('content: $content, ')
+          ..write('status: $status, ')
+          ..write('achievements: $achievements, ')
+          ..write('address: $address, ')
+          ..write('date: $date, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class Activities extends Table with TableInfo<Activities, ActivitiesData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  Activities(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 100),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> type = GeneratedColumn<String>(
+      'type', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> description = GeneratedColumn<String>(
+      'body', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> category = GeneratedColumn<String>(
+      'category', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> force = GeneratedColumn<String>(
+      'force', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> level = GeneratedColumn<String>(
+      'level', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> mechanic = GeneratedColumn<String>(
+      'mechanic', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> equipment = GeneratedColumn<String>(
+      'equipment', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> primaryMuscles = GeneratedColumn<String>(
+      'primary_muscles', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> secondaryMuscles = GeneratedColumn<String>(
+      'secondary_muscles', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns => [
+        id,
+        title,
+        type,
+        description,
+        category,
+        force,
+        level,
+        mechanic,
+        equipment,
+        primaryMuscles,
+        secondaryMuscles,
+        createdAt
+      ];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'activities';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ActivitiesData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ActivitiesData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      type: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}type']),
+      description: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body']),
+      category: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}category']),
+      force: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}force']),
+      level: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}level']),
+      mechanic: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}mechanic']),
+      equipment: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}equipment']),
+      primaryMuscles: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}primary_muscles']),
+      secondaryMuscles: attachedDatabase.typeMapping.read(
+          DriftSqlType.string, data['${effectivePrefix}secondary_muscles']),
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  Activities createAlias(String alias) {
+    return Activities(attachedDatabase, alias);
+  }
+}
+
+class ActivitiesData extends DataClass implements Insertable<ActivitiesData> {
+  final int id;
+  final String title;
+  final String? type;
+  final String? description;
+  final String? category;
+  final String? force;
+  final String? level;
+  final String? mechanic;
+  final String? equipment;
+  final String? primaryMuscles;
+  final String? secondaryMuscles;
+  final DateTime createdAt;
+  const ActivitiesData(
+      {required this.id,
+      required this.title,
+      this.type,
+      this.description,
+      this.category,
+      this.force,
+      this.level,
+      this.mechanic,
+      this.equipment,
+      this.primaryMuscles,
+      this.secondaryMuscles,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    if (!nullToAbsent || type != null) {
+      map['type'] = Variable<String>(type);
+    }
+    if (!nullToAbsent || description != null) {
+      map['body'] = Variable<String>(description);
+    }
+    if (!nullToAbsent || category != null) {
+      map['category'] = Variable<String>(category);
+    }
+    if (!nullToAbsent || force != null) {
+      map['force'] = Variable<String>(force);
+    }
+    if (!nullToAbsent || level != null) {
+      map['level'] = Variable<String>(level);
+    }
+    if (!nullToAbsent || mechanic != null) {
+      map['mechanic'] = Variable<String>(mechanic);
+    }
+    if (!nullToAbsent || equipment != null) {
+      map['equipment'] = Variable<String>(equipment);
+    }
+    if (!nullToAbsent || primaryMuscles != null) {
+      map['primary_muscles'] = Variable<String>(primaryMuscles);
+    }
+    if (!nullToAbsent || secondaryMuscles != null) {
+      map['secondary_muscles'] = Variable<String>(secondaryMuscles);
+    }
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ActivitiesCompanion toCompanion(bool nullToAbsent) {
+    return ActivitiesCompanion(
+      id: Value(id),
+      title: Value(title),
+      type: type == null && nullToAbsent ? const Value.absent() : Value(type),
+      description: description == null && nullToAbsent
+          ? const Value.absent()
+          : Value(description),
+      category: category == null && nullToAbsent
+          ? const Value.absent()
+          : Value(category),
+      force:
+          force == null && nullToAbsent ? const Value.absent() : Value(force),
+      level:
+          level == null && nullToAbsent ? const Value.absent() : Value(level),
+      mechanic: mechanic == null && nullToAbsent
+          ? const Value.absent()
+          : Value(mechanic),
+      equipment: equipment == null && nullToAbsent
+          ? const Value.absent()
+          : Value(equipment),
+      primaryMuscles: primaryMuscles == null && nullToAbsent
+          ? const Value.absent()
+          : Value(primaryMuscles),
+      secondaryMuscles: secondaryMuscles == null && nullToAbsent
+          ? const Value.absent()
+          : Value(secondaryMuscles),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ActivitiesData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ActivitiesData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      type: serializer.fromJson<String?>(json['type']),
+      description: serializer.fromJson<String?>(json['description']),
+      category: serializer.fromJson<String?>(json['category']),
+      force: serializer.fromJson<String?>(json['force']),
+      level: serializer.fromJson<String?>(json['level']),
+      mechanic: serializer.fromJson<String?>(json['mechanic']),
+      equipment: serializer.fromJson<String?>(json['equipment']),
+      primaryMuscles: serializer.fromJson<String?>(json['primaryMuscles']),
+      secondaryMuscles: serializer.fromJson<String?>(json['secondaryMuscles']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'type': serializer.toJson<String?>(type),
+      'description': serializer.toJson<String?>(description),
+      'category': serializer.toJson<String?>(category),
+      'force': serializer.toJson<String?>(force),
+      'level': serializer.toJson<String?>(level),
+      'mechanic': serializer.toJson<String?>(mechanic),
+      'equipment': serializer.toJson<String?>(equipment),
+      'primaryMuscles': serializer.toJson<String?>(primaryMuscles),
+      'secondaryMuscles': serializer.toJson<String?>(secondaryMuscles),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ActivitiesData copyWith(
+          {int? id,
+          String? title,
+          Value<String?> type = const Value.absent(),
+          Value<String?> description = const Value.absent(),
+          Value<String?> category = const Value.absent(),
+          Value<String?> force = const Value.absent(),
+          Value<String?> level = const Value.absent(),
+          Value<String?> mechanic = const Value.absent(),
+          Value<String?> equipment = const Value.absent(),
+          Value<String?> primaryMuscles = const Value.absent(),
+          Value<String?> secondaryMuscles = const Value.absent(),
+          DateTime? createdAt}) =>
+      ActivitiesData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        type: type.present ? type.value : this.type,
+        description: description.present ? description.value : this.description,
+        category: category.present ? category.value : this.category,
+        force: force.present ? force.value : this.force,
+        level: level.present ? level.value : this.level,
+        mechanic: mechanic.present ? mechanic.value : this.mechanic,
+        equipment: equipment.present ? equipment.value : this.equipment,
+        primaryMuscles:
+            primaryMuscles.present ? primaryMuscles.value : this.primaryMuscles,
+        secondaryMuscles: secondaryMuscles.present
+            ? secondaryMuscles.value
+            : this.secondaryMuscles,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ActivitiesData copyWithCompanion(ActivitiesCompanion data) {
+    return ActivitiesData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      type: data.type.present ? data.type.value : this.type,
+      description:
+          data.description.present ? data.description.value : this.description,
+      category: data.category.present ? data.category.value : this.category,
+      force: data.force.present ? data.force.value : this.force,
+      level: data.level.present ? data.level.value : this.level,
+      mechanic: data.mechanic.present ? data.mechanic.value : this.mechanic,
+      equipment: data.equipment.present ? data.equipment.value : this.equipment,
+      primaryMuscles: data.primaryMuscles.present
+          ? data.primaryMuscles.value
+          : this.primaryMuscles,
+      secondaryMuscles: data.secondaryMuscles.present
+          ? data.secondaryMuscles.value
+          : this.secondaryMuscles,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivitiesData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('type: $type, ')
+          ..write('description: $description, ')
+          ..write('category: $category, ')
+          ..write('force: $force, ')
+          ..write('level: $level, ')
+          ..write('mechanic: $mechanic, ')
+          ..write('equipment: $equipment, ')
+          ..write('primaryMuscles: $primaryMuscles, ')
+          ..write('secondaryMuscles: $secondaryMuscles, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(id, title, type, description, category, force,
+      level, mechanic, equipment, primaryMuscles, secondaryMuscles, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ActivitiesData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.type == this.type &&
+          other.description == this.description &&
+          other.category == this.category &&
+          other.force == this.force &&
+          other.level == this.level &&
+          other.mechanic == this.mechanic &&
+          other.equipment == this.equipment &&
+          other.primaryMuscles == this.primaryMuscles &&
+          other.secondaryMuscles == this.secondaryMuscles &&
+          other.createdAt == this.createdAt);
+}
+
+class ActivitiesCompanion extends UpdateCompanion<ActivitiesData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String?> type;
+  final Value<String?> description;
+  final Value<String?> category;
+  final Value<String?> force;
+  final Value<String?> level;
+  final Value<String?> mechanic;
+  final Value<String?> equipment;
+  final Value<String?> primaryMuscles;
+  final Value<String?> secondaryMuscles;
+  final Value<DateTime> createdAt;
+  const ActivitiesCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.type = const Value.absent(),
+    this.description = const Value.absent(),
+    this.category = const Value.absent(),
+    this.force = const Value.absent(),
+    this.level = const Value.absent(),
+    this.mechanic = const Value.absent(),
+    this.equipment = const Value.absent(),
+    this.primaryMuscles = const Value.absent(),
+    this.secondaryMuscles = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ActivitiesCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    this.type = const Value.absent(),
+    this.description = const Value.absent(),
+    this.category = const Value.absent(),
+    this.force = const Value.absent(),
+    this.level = const Value.absent(),
+    this.mechanic = const Value.absent(),
+    this.equipment = const Value.absent(),
+    this.primaryMuscles = const Value.absent(),
+    this.secondaryMuscles = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  }) : title = Value(title);
+  static Insertable<ActivitiesData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? type,
+    Expression<String>? description,
+    Expression<String>? category,
+    Expression<String>? force,
+    Expression<String>? level,
+    Expression<String>? mechanic,
+    Expression<String>? equipment,
+    Expression<String>? primaryMuscles,
+    Expression<String>? secondaryMuscles,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (type != null) 'type': type,
+      if (description != null) 'body': description,
+      if (category != null) 'category': category,
+      if (force != null) 'force': force,
+      if (level != null) 'level': level,
+      if (mechanic != null) 'mechanic': mechanic,
+      if (equipment != null) 'equipment': equipment,
+      if (primaryMuscles != null) 'primary_muscles': primaryMuscles,
+      if (secondaryMuscles != null) 'secondary_muscles': secondaryMuscles,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ActivitiesCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String?>? type,
+      Value<String?>? description,
+      Value<String?>? category,
+      Value<String?>? force,
+      Value<String?>? level,
+      Value<String?>? mechanic,
+      Value<String?>? equipment,
+      Value<String?>? primaryMuscles,
+      Value<String?>? secondaryMuscles,
+      Value<DateTime>? createdAt}) {
+    return ActivitiesCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      type: type ?? this.type,
+      description: description ?? this.description,
+      category: category ?? this.category,
+      force: force ?? this.force,
+      level: level ?? this.level,
+      mechanic: mechanic ?? this.mechanic,
+      equipment: equipment ?? this.equipment,
+      primaryMuscles: primaryMuscles ?? this.primaryMuscles,
+      secondaryMuscles: secondaryMuscles ?? this.secondaryMuscles,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (type.present) {
+      map['type'] = Variable<String>(type.value);
+    }
+    if (description.present) {
+      map['body'] = Variable<String>(description.value);
+    }
+    if (category.present) {
+      map['category'] = Variable<String>(category.value);
+    }
+    if (force.present) {
+      map['force'] = Variable<String>(force.value);
+    }
+    if (level.present) {
+      map['level'] = Variable<String>(level.value);
+    }
+    if (mechanic.present) {
+      map['mechanic'] = Variable<String>(mechanic.value);
+    }
+    if (equipment.present) {
+      map['equipment'] = Variable<String>(equipment.value);
+    }
+    if (primaryMuscles.present) {
+      map['primary_muscles'] = Variable<String>(primaryMuscles.value);
+    }
+    if (secondaryMuscles.present) {
+      map['secondary_muscles'] = Variable<String>(secondaryMuscles.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivitiesCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('type: $type, ')
+          ..write('description: $description, ')
+          ..write('category: $category, ')
+          ..write('force: $force, ')
+          ..write('level: $level, ')
+          ..write('mechanic: $mechanic, ')
+          ..write('equipment: $equipment, ')
+          ..write('primaryMuscles: $primaryMuscles, ')
+          ..write('secondaryMuscles: $secondaryMuscles, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class SessionActivities extends Table
+    with TableInfo<SessionActivities, SessionActivitiesData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  SessionActivities(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<int> sessionId = GeneratedColumn<int>(
+      'session_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES sessions (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> activityId = GeneratedColumn<int>(
+      'activity_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES activities (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> position = GeneratedColumn<int>(
+      'position', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<String> results = GeneratedColumn<String>(
+      'results', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, sessionId, activityId, position, results, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'session_activities';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  SessionActivitiesData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return SessionActivitiesData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      sessionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!,
+      activityId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!,
+      position: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}position'])!,
+      results: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}results']),
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  SessionActivities createAlias(String alias) {
+    return SessionActivities(attachedDatabase, alias);
+  }
+}
+
+class SessionActivitiesData extends DataClass
+    implements Insertable<SessionActivitiesData> {
+  final int id;
+  final int sessionId;
+  final int activityId;
+  final int position;
+  final String? results;
+  final DateTime createdAt;
+  const SessionActivitiesData(
+      {required this.id,
+      required this.sessionId,
+      required this.activityId,
+      required this.position,
+      this.results,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['session_id'] = Variable<int>(sessionId);
+    map['activity_id'] = Variable<int>(activityId);
+    map['position'] = Variable<int>(position);
+    if (!nullToAbsent || results != null) {
+      map['results'] = Variable<String>(results);
+    }
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  SessionActivitiesCompanion toCompanion(bool nullToAbsent) {
+    return SessionActivitiesCompanion(
+      id: Value(id),
+      sessionId: Value(sessionId),
+      activityId: Value(activityId),
+      position: Value(position),
+      results: results == null && nullToAbsent
+          ? const Value.absent()
+          : Value(results),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory SessionActivitiesData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return SessionActivitiesData(
+      id: serializer.fromJson<int>(json['id']),
+      sessionId: serializer.fromJson<int>(json['sessionId']),
+      activityId: serializer.fromJson<int>(json['activityId']),
+      position: serializer.fromJson<int>(json['position']),
+      results: serializer.fromJson<String?>(json['results']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'sessionId': serializer.toJson<int>(sessionId),
+      'activityId': serializer.toJson<int>(activityId),
+      'position': serializer.toJson<int>(position),
+      'results': serializer.toJson<String?>(results),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  SessionActivitiesData copyWith(
+          {int? id,
+          int? sessionId,
+          int? activityId,
+          int? position,
+          Value<String?> results = const Value.absent(),
+          DateTime? createdAt}) =>
+      SessionActivitiesData(
+        id: id ?? this.id,
+        sessionId: sessionId ?? this.sessionId,
+        activityId: activityId ?? this.activityId,
+        position: position ?? this.position,
+        results: results.present ? results.value : this.results,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  SessionActivitiesData copyWithCompanion(SessionActivitiesCompanion data) {
+    return SessionActivitiesData(
+      id: data.id.present ? data.id.value : this.id,
+      sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId,
+      activityId:
+          data.activityId.present ? data.activityId.value : this.activityId,
+      position: data.position.present ? data.position.value : this.position,
+      results: data.results.present ? data.results.value : this.results,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionActivitiesData(')
+          ..write('id: $id, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('activityId: $activityId, ')
+          ..write('position: $position, ')
+          ..write('results: $results, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode =>
+      Object.hash(id, sessionId, activityId, position, results, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is SessionActivitiesData &&
+          other.id == this.id &&
+          other.sessionId == this.sessionId &&
+          other.activityId == this.activityId &&
+          other.position == this.position &&
+          other.results == this.results &&
+          other.createdAt == this.createdAt);
+}
+
+class SessionActivitiesCompanion
+    extends UpdateCompanion<SessionActivitiesData> {
+  final Value<int> id;
+  final Value<int> sessionId;
+  final Value<int> activityId;
+  final Value<int> position;
+  final Value<String?> results;
+  final Value<DateTime> createdAt;
+  const SessionActivitiesCompanion({
+    this.id = const Value.absent(),
+    this.sessionId = const Value.absent(),
+    this.activityId = const Value.absent(),
+    this.position = const Value.absent(),
+    this.results = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  SessionActivitiesCompanion.insert({
+    this.id = const Value.absent(),
+    required int sessionId,
+    required int activityId,
+    required int position,
+    this.results = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  })  : sessionId = Value(sessionId),
+        activityId = Value(activityId),
+        position = Value(position);
+  static Insertable<SessionActivitiesData> custom({
+    Expression<int>? id,
+    Expression<int>? sessionId,
+    Expression<int>? activityId,
+    Expression<int>? position,
+    Expression<String>? results,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (sessionId != null) 'session_id': sessionId,
+      if (activityId != null) 'activity_id': activityId,
+      if (position != null) 'position': position,
+      if (results != null) 'results': results,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  SessionActivitiesCompanion copyWith(
+      {Value<int>? id,
+      Value<int>? sessionId,
+      Value<int>? activityId,
+      Value<int>? position,
+      Value<String?>? results,
+      Value<DateTime>? createdAt}) {
+    return SessionActivitiesCompanion(
+      id: id ?? this.id,
+      sessionId: sessionId ?? this.sessionId,
+      activityId: activityId ?? this.activityId,
+      position: position ?? this.position,
+      results: results ?? this.results,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (sessionId.present) {
+      map['session_id'] = Variable<int>(sessionId.value);
+    }
+    if (activityId.present) {
+      map['activity_id'] = Variable<int>(activityId.value);
+    }
+    if (position.present) {
+      map['position'] = Variable<int>(position.value);
+    }
+    if (results.present) {
+      map['results'] = Variable<String>(results.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionActivitiesCompanion(')
+          ..write('id: $id, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('activityId: $activityId, ')
+          ..write('position: $position, ')
+          ..write('results: $results, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class Actions extends Table with TableInfo<Actions, ActionsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  Actions(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 64),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> description = GeneratedColumn<String>(
+      'body', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<int> totalSets = GeneratedColumn<int>(
+      'total_sets', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<String> totalReps = GeneratedColumn<String>(
+      'total_reps', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 1, maxTextLength: 32),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<int> restBeforeSets = GeneratedColumn<int>(
+      'rest_before_sets', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<int> restBetweenSets = GeneratedColumn<int>(
+      'rest_between_sets', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<int> restBetweenReps = GeneratedColumn<int>(
+      'rest_between_reps', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<int> restAfterSets = GeneratedColumn<int>(
+      'rest_after_sets', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<String> repType = GeneratedColumn<String>(
+      'rep_type', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<int> repLength = GeneratedColumn<int>(
+      'rep_length', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<String> repWeights = GeneratedColumn<String>(
+      'rep_weights', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> setWeights = GeneratedColumn<String>(
+      'set_weights', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<bool> isAlternating = GeneratedColumn<bool>(
+      'is_alternating', aliasedName, false,
+      type: DriftSqlType.bool,
+      requiredDuringInsert: false,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'CHECK ("is_alternating" IN (0, 1))'),
+      defaultValue: Variable(false));
+  late final GeneratedColumn<String> tempo = GeneratedColumn<String>(
+      'tempo', aliasedName, true,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 6, maxTextLength: 36),
+      type: DriftSqlType.string,
+      requiredDuringInsert: false);
+  late final GeneratedColumn<String> status = GeneratedColumn<String>(
+      'status', aliasedName, false,
+      type: DriftSqlType.string,
+      requiredDuringInsert: false,
+      defaultValue: Variable('pending'));
+  late final GeneratedColumn<String> state = GeneratedColumn<String>(
+      'state', aliasedName, false,
+      type: DriftSqlType.string,
+      requiredDuringInsert: false,
+      defaultValue: Variable(
+          "{\"currentSet\": 0, \"currentRep\": 0, \"currentActionType\": 0, \"currentTime\": 0, \"currentAction\": 0}"));
+  late final GeneratedColumn<String> set = GeneratedColumn<String>(
+      'set', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns => [
+        id,
+        title,
+        description,
+        totalSets,
+        totalReps,
+        restBeforeSets,
+        restBetweenSets,
+        restBetweenReps,
+        restAfterSets,
+        repType,
+        repLength,
+        repWeights,
+        setWeights,
+        isAlternating,
+        tempo,
+        status,
+        state,
+        set,
+        createdAt
+      ];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'actions';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ActionsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ActionsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      description: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body'])!,
+      totalSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}total_sets'])!,
+      totalReps: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}total_reps'])!,
+      restBeforeSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_before_sets']),
+      restBetweenSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_between_sets']),
+      restBetweenReps: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_between_reps']),
+      restAfterSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_after_sets']),
+      repType: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}rep_type'])!,
+      repLength: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rep_length']),
+      repWeights: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}rep_weights']),
+      setWeights: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}set_weights']),
+      isAlternating: attachedDatabase.typeMapping
+          .read(DriftSqlType.bool, data['${effectivePrefix}is_alternating'])!,
+      tempo: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}tempo']),
+      status: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}status'])!,
+      state: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}state'])!,
+      set: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}set'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  Actions createAlias(String alias) {
+    return Actions(attachedDatabase, alias);
+  }
+}
+
+class ActionsData extends DataClass implements Insertable<ActionsData> {
+  final int id;
+  final String title;
+  final String description;
+  final int totalSets;
+  final String totalReps;
+  final int? restBeforeSets;
+  final int? restBetweenSets;
+  final int? restBetweenReps;
+  final int? restAfterSets;
+  final String repType;
+  final int? repLength;
+  final String? repWeights;
+  final String? setWeights;
+  final bool isAlternating;
+  final String? tempo;
+  final String status;
+  final String state;
+  final String set;
+  final DateTime createdAt;
+  const ActionsData(
+      {required this.id,
+      required this.title,
+      required this.description,
+      required this.totalSets,
+      required this.totalReps,
+      this.restBeforeSets,
+      this.restBetweenSets,
+      this.restBetweenReps,
+      this.restAfterSets,
+      required this.repType,
+      this.repLength,
+      this.repWeights,
+      this.setWeights,
+      required this.isAlternating,
+      this.tempo,
+      required this.status,
+      required this.state,
+      required this.set,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    map['body'] = Variable<String>(description);
+    map['total_sets'] = Variable<int>(totalSets);
+    map['total_reps'] = Variable<String>(totalReps);
+    if (!nullToAbsent || restBeforeSets != null) {
+      map['rest_before_sets'] = Variable<int>(restBeforeSets);
+    }
+    if (!nullToAbsent || restBetweenSets != null) {
+      map['rest_between_sets'] = Variable<int>(restBetweenSets);
+    }
+    if (!nullToAbsent || restBetweenReps != null) {
+      map['rest_between_reps'] = Variable<int>(restBetweenReps);
+    }
+    if (!nullToAbsent || restAfterSets != null) {
+      map['rest_after_sets'] = Variable<int>(restAfterSets);
+    }
+    map['rep_type'] = Variable<String>(repType);
+    if (!nullToAbsent || repLength != null) {
+      map['rep_length'] = Variable<int>(repLength);
+    }
+    if (!nullToAbsent || repWeights != null) {
+      map['rep_weights'] = Variable<String>(repWeights);
+    }
+    if (!nullToAbsent || setWeights != null) {
+      map['set_weights'] = Variable<String>(setWeights);
+    }
+    map['is_alternating'] = Variable<bool>(isAlternating);
+    if (!nullToAbsent || tempo != null) {
+      map['tempo'] = Variable<String>(tempo);
+    }
+    map['status'] = Variable<String>(status);
+    map['state'] = Variable<String>(state);
+    map['set'] = Variable<String>(set);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ActionsCompanion toCompanion(bool nullToAbsent) {
+    return ActionsCompanion(
+      id: Value(id),
+      title: Value(title),
+      description: Value(description),
+      totalSets: Value(totalSets),
+      totalReps: Value(totalReps),
+      restBeforeSets: restBeforeSets == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restBeforeSets),
+      restBetweenSets: restBetweenSets == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restBetweenSets),
+      restBetweenReps: restBetweenReps == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restBetweenReps),
+      restAfterSets: restAfterSets == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restAfterSets),
+      repType: Value(repType),
+      repLength: repLength == null && nullToAbsent
+          ? const Value.absent()
+          : Value(repLength),
+      repWeights: repWeights == null && nullToAbsent
+          ? const Value.absent()
+          : Value(repWeights),
+      setWeights: setWeights == null && nullToAbsent
+          ? const Value.absent()
+          : Value(setWeights),
+      isAlternating: Value(isAlternating),
+      tempo:
+          tempo == null && nullToAbsent ? const Value.absent() : Value(tempo),
+      status: Value(status),
+      state: Value(state),
+      set: Value(set),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ActionsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ActionsData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      description: serializer.fromJson<String>(json['description']),
+      totalSets: serializer.fromJson<int>(json['totalSets']),
+      totalReps: serializer.fromJson<String>(json['totalReps']),
+      restBeforeSets: serializer.fromJson<int?>(json['restBeforeSets']),
+      restBetweenSets: serializer.fromJson<int?>(json['restBetweenSets']),
+      restBetweenReps: serializer.fromJson<int?>(json['restBetweenReps']),
+      restAfterSets: serializer.fromJson<int?>(json['restAfterSets']),
+      repType: serializer.fromJson<String>(json['repType']),
+      repLength: serializer.fromJson<int?>(json['repLength']),
+      repWeights: serializer.fromJson<String?>(json['repWeights']),
+      setWeights: serializer.fromJson<String?>(json['setWeights']),
+      isAlternating: serializer.fromJson<bool>(json['isAlternating']),
+      tempo: serializer.fromJson<String?>(json['tempo']),
+      status: serializer.fromJson<String>(json['status']),
+      state: serializer.fromJson<String>(json['state']),
+      set: serializer.fromJson<String>(json['set']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'description': serializer.toJson<String>(description),
+      'totalSets': serializer.toJson<int>(totalSets),
+      'totalReps': serializer.toJson<String>(totalReps),
+      'restBeforeSets': serializer.toJson<int?>(restBeforeSets),
+      'restBetweenSets': serializer.toJson<int?>(restBetweenSets),
+      'restBetweenReps': serializer.toJson<int?>(restBetweenReps),
+      'restAfterSets': serializer.toJson<int?>(restAfterSets),
+      'repType': serializer.toJson<String>(repType),
+      'repLength': serializer.toJson<int?>(repLength),
+      'repWeights': serializer.toJson<String?>(repWeights),
+      'setWeights': serializer.toJson<String?>(setWeights),
+      'isAlternating': serializer.toJson<bool>(isAlternating),
+      'tempo': serializer.toJson<String?>(tempo),
+      'status': serializer.toJson<String>(status),
+      'state': serializer.toJson<String>(state),
+      'set': serializer.toJson<String>(set),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ActionsData copyWith(
+          {int? id,
+          String? title,
+          String? description,
+          int? totalSets,
+          String? totalReps,
+          Value<int?> restBeforeSets = const Value.absent(),
+          Value<int?> restBetweenSets = const Value.absent(),
+          Value<int?> restBetweenReps = const Value.absent(),
+          Value<int?> restAfterSets = const Value.absent(),
+          String? repType,
+          Value<int?> repLength = const Value.absent(),
+          Value<String?> repWeights = const Value.absent(),
+          Value<String?> setWeights = const Value.absent(),
+          bool? isAlternating,
+          Value<String?> tempo = const Value.absent(),
+          String? status,
+          String? state,
+          String? set,
+          DateTime? createdAt}) =>
+      ActionsData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        description: description ?? this.description,
+        totalSets: totalSets ?? this.totalSets,
+        totalReps: totalReps ?? this.totalReps,
+        restBeforeSets:
+            restBeforeSets.present ? restBeforeSets.value : this.restBeforeSets,
+        restBetweenSets: restBetweenSets.present
+            ? restBetweenSets.value
+            : this.restBetweenSets,
+        restBetweenReps: restBetweenReps.present
+            ? restBetweenReps.value
+            : this.restBetweenReps,
+        restAfterSets:
+            restAfterSets.present ? restAfterSets.value : this.restAfterSets,
+        repType: repType ?? this.repType,
+        repLength: repLength.present ? repLength.value : this.repLength,
+        repWeights: repWeights.present ? repWeights.value : this.repWeights,
+        setWeights: setWeights.present ? setWeights.value : this.setWeights,
+        isAlternating: isAlternating ?? this.isAlternating,
+        tempo: tempo.present ? tempo.value : this.tempo,
+        status: status ?? this.status,
+        state: state ?? this.state,
+        set: set ?? this.set,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ActionsData copyWithCompanion(ActionsCompanion data) {
+    return ActionsData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      description:
+          data.description.present ? data.description.value : this.description,
+      totalSets: data.totalSets.present ? data.totalSets.value : this.totalSets,
+      totalReps: data.totalReps.present ? data.totalReps.value : this.totalReps,
+      restBeforeSets: data.restBeforeSets.present
+          ? data.restBeforeSets.value
+          : this.restBeforeSets,
+      restBetweenSets: data.restBetweenSets.present
+          ? data.restBetweenSets.value
+          : this.restBetweenSets,
+      restBetweenReps: data.restBetweenReps.present
+          ? data.restBetweenReps.value
+          : this.restBetweenReps,
+      restAfterSets: data.restAfterSets.present
+          ? data.restAfterSets.value
+          : this.restAfterSets,
+      repType: data.repType.present ? data.repType.value : this.repType,
+      repLength: data.repLength.present ? data.repLength.value : this.repLength,
+      repWeights:
+          data.repWeights.present ? data.repWeights.value : this.repWeights,
+      setWeights:
+          data.setWeights.present ? data.setWeights.value : this.setWeights,
+      isAlternating: data.isAlternating.present
+          ? data.isAlternating.value
+          : this.isAlternating,
+      tempo: data.tempo.present ? data.tempo.value : this.tempo,
+      status: data.status.present ? data.status.value : this.status,
+      state: data.state.present ? data.state.value : this.state,
+      set: data.set.present ? data.set.value : this.set,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActionsData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('totalSets: $totalSets, ')
+          ..write('totalReps: $totalReps, ')
+          ..write('restBeforeSets: $restBeforeSets, ')
+          ..write('restBetweenSets: $restBetweenSets, ')
+          ..write('restBetweenReps: $restBetweenReps, ')
+          ..write('restAfterSets: $restAfterSets, ')
+          ..write('repType: $repType, ')
+          ..write('repLength: $repLength, ')
+          ..write('repWeights: $repWeights, ')
+          ..write('setWeights: $setWeights, ')
+          ..write('isAlternating: $isAlternating, ')
+          ..write('tempo: $tempo, ')
+          ..write('status: $status, ')
+          ..write('state: $state, ')
+          ..write('set: $set, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(
+      id,
+      title,
+      description,
+      totalSets,
+      totalReps,
+      restBeforeSets,
+      restBetweenSets,
+      restBetweenReps,
+      restAfterSets,
+      repType,
+      repLength,
+      repWeights,
+      setWeights,
+      isAlternating,
+      tempo,
+      status,
+      state,
+      set,
+      createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ActionsData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.description == this.description &&
+          other.totalSets == this.totalSets &&
+          other.totalReps == this.totalReps &&
+          other.restBeforeSets == this.restBeforeSets &&
+          other.restBetweenSets == this.restBetweenSets &&
+          other.restBetweenReps == this.restBetweenReps &&
+          other.restAfterSets == this.restAfterSets &&
+          other.repType == this.repType &&
+          other.repLength == this.repLength &&
+          other.repWeights == this.repWeights &&
+          other.setWeights == this.setWeights &&
+          other.isAlternating == this.isAlternating &&
+          other.tempo == this.tempo &&
+          other.status == this.status &&
+          other.state == this.state &&
+          other.set == this.set &&
+          other.createdAt == this.createdAt);
+}
+
+class ActionsCompanion extends UpdateCompanion<ActionsData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String> description;
+  final Value<int> totalSets;
+  final Value<String> totalReps;
+  final Value<int?> restBeforeSets;
+  final Value<int?> restBetweenSets;
+  final Value<int?> restBetweenReps;
+  final Value<int?> restAfterSets;
+  final Value<String> repType;
+  final Value<int?> repLength;
+  final Value<String?> repWeights;
+  final Value<String?> setWeights;
+  final Value<bool> isAlternating;
+  final Value<String?> tempo;
+  final Value<String> status;
+  final Value<String> state;
+  final Value<String> set;
+  final Value<DateTime> createdAt;
+  const ActionsCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.description = const Value.absent(),
+    this.totalSets = const Value.absent(),
+    this.totalReps = const Value.absent(),
+    this.restBeforeSets = const Value.absent(),
+    this.restBetweenSets = const Value.absent(),
+    this.restBetweenReps = const Value.absent(),
+    this.restAfterSets = const Value.absent(),
+    this.repType = const Value.absent(),
+    this.repLength = const Value.absent(),
+    this.repWeights = const Value.absent(),
+    this.setWeights = const Value.absent(),
+    this.isAlternating = const Value.absent(),
+    this.tempo = const Value.absent(),
+    this.status = const Value.absent(),
+    this.state = const Value.absent(),
+    this.set = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ActionsCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    required String description,
+    required int totalSets,
+    required String totalReps,
+    this.restBeforeSets = const Value.absent(),
+    this.restBetweenSets = const Value.absent(),
+    this.restBetweenReps = const Value.absent(),
+    this.restAfterSets = const Value.absent(),
+    required String repType,
+    this.repLength = const Value.absent(),
+    this.repWeights = const Value.absent(),
+    this.setWeights = const Value.absent(),
+    this.isAlternating = const Value.absent(),
+    this.tempo = const Value.absent(),
+    this.status = const Value.absent(),
+    this.state = const Value.absent(),
+    required String set,
+    this.createdAt = const Value.absent(),
+  })  : title = Value(title),
+        description = Value(description),
+        totalSets = Value(totalSets),
+        totalReps = Value(totalReps),
+        repType = Value(repType),
+        set = Value(set);
+  static Insertable<ActionsData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? description,
+    Expression<int>? totalSets,
+    Expression<String>? totalReps,
+    Expression<int>? restBeforeSets,
+    Expression<int>? restBetweenSets,
+    Expression<int>? restBetweenReps,
+    Expression<int>? restAfterSets,
+    Expression<String>? repType,
+    Expression<int>? repLength,
+    Expression<String>? repWeights,
+    Expression<String>? setWeights,
+    Expression<bool>? isAlternating,
+    Expression<String>? tempo,
+    Expression<String>? status,
+    Expression<String>? state,
+    Expression<String>? set,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (description != null) 'body': description,
+      if (totalSets != null) 'total_sets': totalSets,
+      if (totalReps != null) 'total_reps': totalReps,
+      if (restBeforeSets != null) 'rest_before_sets': restBeforeSets,
+      if (restBetweenSets != null) 'rest_between_sets': restBetweenSets,
+      if (restBetweenReps != null) 'rest_between_reps': restBetweenReps,
+      if (restAfterSets != null) 'rest_after_sets': restAfterSets,
+      if (repType != null) 'rep_type': repType,
+      if (repLength != null) 'rep_length': repLength,
+      if (repWeights != null) 'rep_weights': repWeights,
+      if (setWeights != null) 'set_weights': setWeights,
+      if (isAlternating != null) 'is_alternating': isAlternating,
+      if (tempo != null) 'tempo': tempo,
+      if (status != null) 'status': status,
+      if (state != null) 'state': state,
+      if (set != null) 'set': set,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ActionsCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String>? description,
+      Value<int>? totalSets,
+      Value<String>? totalReps,
+      Value<int?>? restBeforeSets,
+      Value<int?>? restBetweenSets,
+      Value<int?>? restBetweenReps,
+      Value<int?>? restAfterSets,
+      Value<String>? repType,
+      Value<int?>? repLength,
+      Value<String?>? repWeights,
+      Value<String?>? setWeights,
+      Value<bool>? isAlternating,
+      Value<String?>? tempo,
+      Value<String>? status,
+      Value<String>? state,
+      Value<String>? set,
+      Value<DateTime>? createdAt}) {
+    return ActionsCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      description: description ?? this.description,
+      totalSets: totalSets ?? this.totalSets,
+      totalReps: totalReps ?? this.totalReps,
+      restBeforeSets: restBeforeSets ?? this.restBeforeSets,
+      restBetweenSets: restBetweenSets ?? this.restBetweenSets,
+      restBetweenReps: restBetweenReps ?? this.restBetweenReps,
+      restAfterSets: restAfterSets ?? this.restAfterSets,
+      repType: repType ?? this.repType,
+      repLength: repLength ?? this.repLength,
+      repWeights: repWeights ?? this.repWeights,
+      setWeights: setWeights ?? this.setWeights,
+      isAlternating: isAlternating ?? this.isAlternating,
+      tempo: tempo ?? this.tempo,
+      status: status ?? this.status,
+      state: state ?? this.state,
+      set: set ?? this.set,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (description.present) {
+      map['body'] = Variable<String>(description.value);
+    }
+    if (totalSets.present) {
+      map['total_sets'] = Variable<int>(totalSets.value);
+    }
+    if (totalReps.present) {
+      map['total_reps'] = Variable<String>(totalReps.value);
+    }
+    if (restBeforeSets.present) {
+      map['rest_before_sets'] = Variable<int>(restBeforeSets.value);
+    }
+    if (restBetweenSets.present) {
+      map['rest_between_sets'] = Variable<int>(restBetweenSets.value);
+    }
+    if (restBetweenReps.present) {
+      map['rest_between_reps'] = Variable<int>(restBetweenReps.value);
+    }
+    if (restAfterSets.present) {
+      map['rest_after_sets'] = Variable<int>(restAfterSets.value);
+    }
+    if (repType.present) {
+      map['rep_type'] = Variable<String>(repType.value);
+    }
+    if (repLength.present) {
+      map['rep_length'] = Variable<int>(repLength.value);
+    }
+    if (repWeights.present) {
+      map['rep_weights'] = Variable<String>(repWeights.value);
+    }
+    if (setWeights.present) {
+      map['set_weights'] = Variable<String>(setWeights.value);
+    }
+    if (isAlternating.present) {
+      map['is_alternating'] = Variable<bool>(isAlternating.value);
+    }
+    if (tempo.present) {
+      map['tempo'] = Variable<String>(tempo.value);
+    }
+    if (status.present) {
+      map['status'] = Variable<String>(status.value);
+    }
+    if (state.present) {
+      map['state'] = Variable<String>(state.value);
+    }
+    if (set.present) {
+      map['set'] = Variable<String>(set.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActionsCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('totalSets: $totalSets, ')
+          ..write('totalReps: $totalReps, ')
+          ..write('restBeforeSets: $restBeforeSets, ')
+          ..write('restBetweenSets: $restBetweenSets, ')
+          ..write('restBetweenReps: $restBetweenReps, ')
+          ..write('restAfterSets: $restAfterSets, ')
+          ..write('repType: $repType, ')
+          ..write('repLength: $repLength, ')
+          ..write('repWeights: $repWeights, ')
+          ..write('setWeights: $setWeights, ')
+          ..write('isAlternating: $isAlternating, ')
+          ..write('tempo: $tempo, ')
+          ..write('status: $status, ')
+          ..write('state: $state, ')
+          ..write('set: $set, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class ActivityActions extends Table
+    with TableInfo<ActivityActions, ActivityActionsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  ActivityActions(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<int> activityId = GeneratedColumn<int>(
+      'activity_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('REFERENCES activities (id)'));
+  late final GeneratedColumn<int> actionId = GeneratedColumn<int>(
+      'action_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES actions (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> sessionId = GeneratedColumn<int>(
+      'session_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('REFERENCES sessions (id)'));
+  late final GeneratedColumn<int> position = GeneratedColumn<int>(
+      'position', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, activityId, actionId, sessionId, position, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'activity_actions';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ActivityActionsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ActivityActionsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      activityId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!,
+      actionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!,
+      sessionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!,
+      position: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}position'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  ActivityActions createAlias(String alias) {
+    return ActivityActions(attachedDatabase, alias);
+  }
+}
+
+class ActivityActionsData extends DataClass
+    implements Insertable<ActivityActionsData> {
+  final int id;
+  final int activityId;
+  final int actionId;
+  final int sessionId;
+  final int position;
+  final DateTime createdAt;
+  const ActivityActionsData(
+      {required this.id,
+      required this.activityId,
+      required this.actionId,
+      required this.sessionId,
+      required this.position,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['activity_id'] = Variable<int>(activityId);
+    map['action_id'] = Variable<int>(actionId);
+    map['session_id'] = Variable<int>(sessionId);
+    map['position'] = Variable<int>(position);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ActivityActionsCompanion toCompanion(bool nullToAbsent) {
+    return ActivityActionsCompanion(
+      id: Value(id),
+      activityId: Value(activityId),
+      actionId: Value(actionId),
+      sessionId: Value(sessionId),
+      position: Value(position),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ActivityActionsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ActivityActionsData(
+      id: serializer.fromJson<int>(json['id']),
+      activityId: serializer.fromJson<int>(json['activityId']),
+      actionId: serializer.fromJson<int>(json['actionId']),
+      sessionId: serializer.fromJson<int>(json['sessionId']),
+      position: serializer.fromJson<int>(json['position']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'activityId': serializer.toJson<int>(activityId),
+      'actionId': serializer.toJson<int>(actionId),
+      'sessionId': serializer.toJson<int>(sessionId),
+      'position': serializer.toJson<int>(position),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ActivityActionsData copyWith(
+          {int? id,
+          int? activityId,
+          int? actionId,
+          int? sessionId,
+          int? position,
+          DateTime? createdAt}) =>
+      ActivityActionsData(
+        id: id ?? this.id,
+        activityId: activityId ?? this.activityId,
+        actionId: actionId ?? this.actionId,
+        sessionId: sessionId ?? this.sessionId,
+        position: position ?? this.position,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ActivityActionsData copyWithCompanion(ActivityActionsCompanion data) {
+    return ActivityActionsData(
+      id: data.id.present ? data.id.value : this.id,
+      activityId:
+          data.activityId.present ? data.activityId.value : this.activityId,
+      actionId: data.actionId.present ? data.actionId.value : this.actionId,
+      sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId,
+      position: data.position.present ? data.position.value : this.position,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivityActionsData(')
+          ..write('id: $id, ')
+          ..write('activityId: $activityId, ')
+          ..write('actionId: $actionId, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('position: $position, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode =>
+      Object.hash(id, activityId, actionId, sessionId, position, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ActivityActionsData &&
+          other.id == this.id &&
+          other.activityId == this.activityId &&
+          other.actionId == this.actionId &&
+          other.sessionId == this.sessionId &&
+          other.position == this.position &&
+          other.createdAt == this.createdAt);
+}
+
+class ActivityActionsCompanion extends UpdateCompanion<ActivityActionsData> {
+  final Value<int> id;
+  final Value<int> activityId;
+  final Value<int> actionId;
+  final Value<int> sessionId;
+  final Value<int> position;
+  final Value<DateTime> createdAt;
+  const ActivityActionsCompanion({
+    this.id = const Value.absent(),
+    this.activityId = const Value.absent(),
+    this.actionId = const Value.absent(),
+    this.sessionId = const Value.absent(),
+    this.position = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ActivityActionsCompanion.insert({
+    this.id = const Value.absent(),
+    required int activityId,
+    required int actionId,
+    required int sessionId,
+    required int position,
+    this.createdAt = const Value.absent(),
+  })  : activityId = Value(activityId),
+        actionId = Value(actionId),
+        sessionId = Value(sessionId),
+        position = Value(position);
+  static Insertable<ActivityActionsData> custom({
+    Expression<int>? id,
+    Expression<int>? activityId,
+    Expression<int>? actionId,
+    Expression<int>? sessionId,
+    Expression<int>? position,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (activityId != null) 'activity_id': activityId,
+      if (actionId != null) 'action_id': actionId,
+      if (sessionId != null) 'session_id': sessionId,
+      if (position != null) 'position': position,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ActivityActionsCompanion copyWith(
+      {Value<int>? id,
+      Value<int>? activityId,
+      Value<int>? actionId,
+      Value<int>? sessionId,
+      Value<int>? position,
+      Value<DateTime>? createdAt}) {
+    return ActivityActionsCompanion(
+      id: id ?? this.id,
+      activityId: activityId ?? this.activityId,
+      actionId: actionId ?? this.actionId,
+      sessionId: sessionId ?? this.sessionId,
+      position: position ?? this.position,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (activityId.present) {
+      map['activity_id'] = Variable<int>(activityId.value);
+    }
+    if (actionId.present) {
+      map['action_id'] = Variable<int>(actionId.value);
+    }
+    if (sessionId.present) {
+      map['session_id'] = Variable<int>(sessionId.value);
+    }
+    if (position.present) {
+      map['position'] = Variable<int>(position.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivityActionsCompanion(')
+          ..write('id: $id, ')
+          ..write('activityId: $activityId, ')
+          ..write('actionId: $actionId, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('position: $position, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class MediaItems extends Table with TableInfo<MediaItems, MediaItemsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  MediaItems(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 64),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> description = GeneratedColumn<String>(
+      'body', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> reference = GeneratedColumn<String>(
+      'reference', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> type = GeneratedColumn<String>(
+      'type', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, title, description, reference, type, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'media_items';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  MediaItemsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return MediaItemsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      description: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body'])!,
+      reference: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}reference'])!,
+      type: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}type'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  MediaItems createAlias(String alias) {
+    return MediaItems(attachedDatabase, alias);
+  }
+}
+
+class MediaItemsData extends DataClass implements Insertable<MediaItemsData> {
+  final int id;
+  final String title;
+  final String description;
+  final String reference;
+  final String type;
+  final DateTime createdAt;
+  const MediaItemsData(
+      {required this.id,
+      required this.title,
+      required this.description,
+      required this.reference,
+      required this.type,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    map['body'] = Variable<String>(description);
+    map['reference'] = Variable<String>(reference);
+    map['type'] = Variable<String>(type);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  MediaItemsCompanion toCompanion(bool nullToAbsent) {
+    return MediaItemsCompanion(
+      id: Value(id),
+      title: Value(title),
+      description: Value(description),
+      reference: Value(reference),
+      type: Value(type),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory MediaItemsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return MediaItemsData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      description: serializer.fromJson<String>(json['description']),
+      reference: serializer.fromJson<String>(json['reference']),
+      type: serializer.fromJson<String>(json['type']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'description': serializer.toJson<String>(description),
+      'reference': serializer.toJson<String>(reference),
+      'type': serializer.toJson<String>(type),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  MediaItemsData copyWith(
+          {int? id,
+          String? title,
+          String? description,
+          String? reference,
+          String? type,
+          DateTime? createdAt}) =>
+      MediaItemsData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        description: description ?? this.description,
+        reference: reference ?? this.reference,
+        type: type ?? this.type,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  MediaItemsData copyWithCompanion(MediaItemsCompanion data) {
+    return MediaItemsData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      description:
+          data.description.present ? data.description.value : this.description,
+      reference: data.reference.present ? data.reference.value : this.reference,
+      type: data.type.present ? data.type.value : this.type,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('MediaItemsData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('reference: $reference, ')
+          ..write('type: $type, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode =>
+      Object.hash(id, title, description, reference, type, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is MediaItemsData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.description == this.description &&
+          other.reference == this.reference &&
+          other.type == this.type &&
+          other.createdAt == this.createdAt);
+}
+
+class MediaItemsCompanion extends UpdateCompanion<MediaItemsData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String> description;
+  final Value<String> reference;
+  final Value<String> type;
+  final Value<DateTime> createdAt;
+  const MediaItemsCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.description = const Value.absent(),
+    this.reference = const Value.absent(),
+    this.type = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  MediaItemsCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    required String description,
+    required String reference,
+    required String type,
+    this.createdAt = const Value.absent(),
+  })  : title = Value(title),
+        description = Value(description),
+        reference = Value(reference),
+        type = Value(type);
+  static Insertable<MediaItemsData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? description,
+    Expression<String>? reference,
+    Expression<String>? type,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (description != null) 'body': description,
+      if (reference != null) 'reference': reference,
+      if (type != null) 'type': type,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  MediaItemsCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String>? description,
+      Value<String>? reference,
+      Value<String>? type,
+      Value<DateTime>? createdAt}) {
+    return MediaItemsCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      description: description ?? this.description,
+      reference: reference ?? this.reference,
+      type: type ?? this.type,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (description.present) {
+      map['body'] = Variable<String>(description.value);
+    }
+    if (reference.present) {
+      map['reference'] = Variable<String>(reference.value);
+    }
+    if (type.present) {
+      map['type'] = Variable<String>(type.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('MediaItemsCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('reference: $reference, ')
+          ..write('type: $type, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class ObjectMediaItems extends Table
+    with TableInfo<ObjectMediaItems, ObjectMediaItemsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  ObjectMediaItems(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<int> objectId = GeneratedColumn<int>(
+      'object_id', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<String> objectType = GeneratedColumn<String>(
+      'object_type', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<int> mediaId = GeneratedColumn<int>(
+      'media_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES media_items (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, objectId, objectType, mediaId, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'object_media_items';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ObjectMediaItemsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ObjectMediaItemsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      objectId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!,
+      objectType: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}object_type'])!,
+      mediaId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  ObjectMediaItems createAlias(String alias) {
+    return ObjectMediaItems(attachedDatabase, alias);
+  }
+}
+
+class ObjectMediaItemsData extends DataClass
+    implements Insertable<ObjectMediaItemsData> {
+  final int id;
+  final int objectId;
+  final String objectType;
+  final int mediaId;
+  final DateTime createdAt;
+  const ObjectMediaItemsData(
+      {required this.id,
+      required this.objectId,
+      required this.objectType,
+      required this.mediaId,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['object_id'] = Variable<int>(objectId);
+    map['object_type'] = Variable<String>(objectType);
+    map['media_id'] = Variable<int>(mediaId);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ObjectMediaItemsCompanion toCompanion(bool nullToAbsent) {
+    return ObjectMediaItemsCompanion(
+      id: Value(id),
+      objectId: Value(objectId),
+      objectType: Value(objectType),
+      mediaId: Value(mediaId),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ObjectMediaItemsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ObjectMediaItemsData(
+      id: serializer.fromJson<int>(json['id']),
+      objectId: serializer.fromJson<int>(json['objectId']),
+      objectType: serializer.fromJson<String>(json['objectType']),
+      mediaId: serializer.fromJson<int>(json['mediaId']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'objectId': serializer.toJson<int>(objectId),
+      'objectType': serializer.toJson<String>(objectType),
+      'mediaId': serializer.toJson<int>(mediaId),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ObjectMediaItemsData copyWith(
+          {int? id,
+          int? objectId,
+          String? objectType,
+          int? mediaId,
+          DateTime? createdAt}) =>
+      ObjectMediaItemsData(
+        id: id ?? this.id,
+        objectId: objectId ?? this.objectId,
+        objectType: objectType ?? this.objectType,
+        mediaId: mediaId ?? this.mediaId,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ObjectMediaItemsData copyWithCompanion(ObjectMediaItemsCompanion data) {
+    return ObjectMediaItemsData(
+      id: data.id.present ? data.id.value : this.id,
+      objectId: data.objectId.present ? data.objectId.value : this.objectId,
+      objectType:
+          data.objectType.present ? data.objectType.value : this.objectType,
+      mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ObjectMediaItemsData(')
+          ..write('id: $id, ')
+          ..write('objectId: $objectId, ')
+          ..write('objectType: $objectType, ')
+          ..write('mediaId: $mediaId, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ObjectMediaItemsData &&
+          other.id == this.id &&
+          other.objectId == this.objectId &&
+          other.objectType == this.objectType &&
+          other.mediaId == this.mediaId &&
+          other.createdAt == this.createdAt);
+}
+
+class ObjectMediaItemsCompanion extends UpdateCompanion<ObjectMediaItemsData> {
+  final Value<int> id;
+  final Value<int> objectId;
+  final Value<String> objectType;
+  final Value<int> mediaId;
+  final Value<DateTime> createdAt;
+  const ObjectMediaItemsCompanion({
+    this.id = const Value.absent(),
+    this.objectId = const Value.absent(),
+    this.objectType = const Value.absent(),
+    this.mediaId = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ObjectMediaItemsCompanion.insert({
+    this.id = const Value.absent(),
+    required int objectId,
+    required String objectType,
+    required int mediaId,
+    this.createdAt = const Value.absent(),
+  })  : objectId = Value(objectId),
+        objectType = Value(objectType),
+        mediaId = Value(mediaId);
+  static Insertable<ObjectMediaItemsData> custom({
+    Expression<int>? id,
+    Expression<int>? objectId,
+    Expression<String>? objectType,
+    Expression<int>? mediaId,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (objectId != null) 'object_id': objectId,
+      if (objectType != null) 'object_type': objectType,
+      if (mediaId != null) 'media_id': mediaId,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ObjectMediaItemsCompanion copyWith(
+      {Value<int>? id,
+      Value<int>? objectId,
+      Value<String>? objectType,
+      Value<int>? mediaId,
+      Value<DateTime>? createdAt}) {
+    return ObjectMediaItemsCompanion(
+      id: id ?? this.id,
+      objectId: objectId ?? this.objectId,
+      objectType: objectType ?? this.objectType,
+      mediaId: mediaId ?? this.mediaId,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (objectId.present) {
+      map['object_id'] = Variable<int>(objectId.value);
+    }
+    if (objectType.present) {
+      map['object_type'] = Variable<String>(objectType.value);
+    }
+    if (mediaId.present) {
+      map['media_id'] = Variable<int>(mediaId.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ObjectMediaItemsCompanion(')
+          ..write('id: $id, ')
+          ..write('objectId: $objectId, ')
+          ..write('objectType: $objectType, ')
+          ..write('mediaId: $mediaId, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class DatabaseAtV34 extends GeneratedDatabase {
+  DatabaseAtV34(QueryExecutor e) : super(e);
+  late final Sessions sessions = Sessions(this);
+  late final Activities activities = Activities(this);
+  late final SessionActivities sessionActivities = SessionActivities(this);
+  late final Actions actions = Actions(this);
+  late final ActivityActions activityActions = ActivityActions(this);
+  late final MediaItems mediaItems = MediaItems(this);
+  late final ObjectMediaItems objectMediaItems = ObjectMediaItems(this);
+  @override
+  Iterable<TableInfo<Table, Object?>> get allTables =>
+      allSchemaEntities.whereType<TableInfo<Table, Object?>>();
+  @override
+  List<DatabaseSchemaEntity> get allSchemaEntities => [
+        sessions,
+        activities,
+        sessionActivities,
+        actions,
+        activityActions,
+        mediaItems,
+        objectMediaItems
+      ];
+  @override
+  int get schemaVersion => 34;
+}
diff --git a/test/drift/sendtrain/generated/schema_v35.dart b/test/drift/sendtrain/generated/schema_v35.dart
new file mode 100644
index 0000000..8b16461
--- /dev/null
+++ b/test/drift/sendtrain/generated/schema_v35.dart
@@ -0,0 +1,2733 @@
+// dart format width=80
+// GENERATED CODE, DO NOT EDIT BY HAND.
+// ignore_for_file: type=lint
+import 'package:drift/drift.dart';
+
+class Sessions extends Table with TableInfo<Sessions, SessionsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  Sessions(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> content = GeneratedColumn<String>(
+      'body', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> status = GeneratedColumn<String>(
+      'status', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> achievements = GeneratedColumn<String>(
+      'achievements', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> address = GeneratedColumn<String>(
+      'address', aliasedName, true,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256),
+      type: DriftSqlType.string,
+      requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> date = GeneratedColumn<DateTime>(
+      'date', aliasedName, true,
+      type: DriftSqlType.dateTime, requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, title, content, status, achievements, address, date, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'sessions';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  SessionsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return SessionsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      content: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body'])!,
+      status: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}status'])!,
+      achievements: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}achievements']),
+      address: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}address']),
+      date: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}date']),
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  Sessions createAlias(String alias) {
+    return Sessions(attachedDatabase, alias);
+  }
+}
+
+class SessionsData extends DataClass implements Insertable<SessionsData> {
+  final int id;
+  final String title;
+  final String content;
+  final String status;
+  final String? achievements;
+  final String? address;
+  final DateTime? date;
+  final DateTime createdAt;
+  const SessionsData(
+      {required this.id,
+      required this.title,
+      required this.content,
+      required this.status,
+      this.achievements,
+      this.address,
+      this.date,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    map['body'] = Variable<String>(content);
+    map['status'] = Variable<String>(status);
+    if (!nullToAbsent || achievements != null) {
+      map['achievements'] = Variable<String>(achievements);
+    }
+    if (!nullToAbsent || address != null) {
+      map['address'] = Variable<String>(address);
+    }
+    if (!nullToAbsent || date != null) {
+      map['date'] = Variable<DateTime>(date);
+    }
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  SessionsCompanion toCompanion(bool nullToAbsent) {
+    return SessionsCompanion(
+      id: Value(id),
+      title: Value(title),
+      content: Value(content),
+      status: Value(status),
+      achievements: achievements == null && nullToAbsent
+          ? const Value.absent()
+          : Value(achievements),
+      address: address == null && nullToAbsent
+          ? const Value.absent()
+          : Value(address),
+      date: date == null && nullToAbsent ? const Value.absent() : Value(date),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory SessionsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return SessionsData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      content: serializer.fromJson<String>(json['content']),
+      status: serializer.fromJson<String>(json['status']),
+      achievements: serializer.fromJson<String?>(json['achievements']),
+      address: serializer.fromJson<String?>(json['address']),
+      date: serializer.fromJson<DateTime?>(json['date']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'content': serializer.toJson<String>(content),
+      'status': serializer.toJson<String>(status),
+      'achievements': serializer.toJson<String?>(achievements),
+      'address': serializer.toJson<String?>(address),
+      'date': serializer.toJson<DateTime?>(date),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  SessionsData copyWith(
+          {int? id,
+          String? title,
+          String? content,
+          String? status,
+          Value<String?> achievements = const Value.absent(),
+          Value<String?> address = const Value.absent(),
+          Value<DateTime?> date = const Value.absent(),
+          DateTime? createdAt}) =>
+      SessionsData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        content: content ?? this.content,
+        status: status ?? this.status,
+        achievements:
+            achievements.present ? achievements.value : this.achievements,
+        address: address.present ? address.value : this.address,
+        date: date.present ? date.value : this.date,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  SessionsData copyWithCompanion(SessionsCompanion data) {
+    return SessionsData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      content: data.content.present ? data.content.value : this.content,
+      status: data.status.present ? data.status.value : this.status,
+      achievements: data.achievements.present
+          ? data.achievements.value
+          : this.achievements,
+      address: data.address.present ? data.address.value : this.address,
+      date: data.date.present ? data.date.value : this.date,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionsData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('content: $content, ')
+          ..write('status: $status, ')
+          ..write('achievements: $achievements, ')
+          ..write('address: $address, ')
+          ..write('date: $date, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(
+      id, title, content, status, achievements, address, date, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is SessionsData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.content == this.content &&
+          other.status == this.status &&
+          other.achievements == this.achievements &&
+          other.address == this.address &&
+          other.date == this.date &&
+          other.createdAt == this.createdAt);
+}
+
+class SessionsCompanion extends UpdateCompanion<SessionsData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String> content;
+  final Value<String> status;
+  final Value<String?> achievements;
+  final Value<String?> address;
+  final Value<DateTime?> date;
+  final Value<DateTime> createdAt;
+  const SessionsCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.content = const Value.absent(),
+    this.status = const Value.absent(),
+    this.achievements = const Value.absent(),
+    this.address = const Value.absent(),
+    this.date = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  SessionsCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    required String content,
+    required String status,
+    this.achievements = const Value.absent(),
+    this.address = const Value.absent(),
+    this.date = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  })  : title = Value(title),
+        content = Value(content),
+        status = Value(status);
+  static Insertable<SessionsData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? content,
+    Expression<String>? status,
+    Expression<String>? achievements,
+    Expression<String>? address,
+    Expression<DateTime>? date,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (content != null) 'body': content,
+      if (status != null) 'status': status,
+      if (achievements != null) 'achievements': achievements,
+      if (address != null) 'address': address,
+      if (date != null) 'date': date,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  SessionsCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String>? content,
+      Value<String>? status,
+      Value<String?>? achievements,
+      Value<String?>? address,
+      Value<DateTime?>? date,
+      Value<DateTime>? createdAt}) {
+    return SessionsCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      content: content ?? this.content,
+      status: status ?? this.status,
+      achievements: achievements ?? this.achievements,
+      address: address ?? this.address,
+      date: date ?? this.date,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (content.present) {
+      map['body'] = Variable<String>(content.value);
+    }
+    if (status.present) {
+      map['status'] = Variable<String>(status.value);
+    }
+    if (achievements.present) {
+      map['achievements'] = Variable<String>(achievements.value);
+    }
+    if (address.present) {
+      map['address'] = Variable<String>(address.value);
+    }
+    if (date.present) {
+      map['date'] = Variable<DateTime>(date.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionsCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('content: $content, ')
+          ..write('status: $status, ')
+          ..write('achievements: $achievements, ')
+          ..write('address: $address, ')
+          ..write('date: $date, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class Activities extends Table with TableInfo<Activities, ActivitiesData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  Activities(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 100),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> type = GeneratedColumn<String>(
+      'type', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> description = GeneratedColumn<String>(
+      'body', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> category = GeneratedColumn<String>(
+      'category', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> force = GeneratedColumn<String>(
+      'force', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> level = GeneratedColumn<String>(
+      'level', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> mechanic = GeneratedColumn<String>(
+      'mechanic', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> equipment = GeneratedColumn<String>(
+      'equipment', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> primaryMuscles = GeneratedColumn<String>(
+      'primary_muscles', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> secondaryMuscles = GeneratedColumn<String>(
+      'secondary_muscles', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns => [
+        id,
+        title,
+        type,
+        description,
+        category,
+        force,
+        level,
+        mechanic,
+        equipment,
+        primaryMuscles,
+        secondaryMuscles,
+        createdAt
+      ];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'activities';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ActivitiesData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ActivitiesData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      type: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}type']),
+      description: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body']),
+      category: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}category']),
+      force: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}force']),
+      level: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}level']),
+      mechanic: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}mechanic']),
+      equipment: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}equipment']),
+      primaryMuscles: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}primary_muscles']),
+      secondaryMuscles: attachedDatabase.typeMapping.read(
+          DriftSqlType.string, data['${effectivePrefix}secondary_muscles']),
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  Activities createAlias(String alias) {
+    return Activities(attachedDatabase, alias);
+  }
+}
+
+class ActivitiesData extends DataClass implements Insertable<ActivitiesData> {
+  final int id;
+  final String title;
+  final String? type;
+  final String? description;
+  final String? category;
+  final String? force;
+  final String? level;
+  final String? mechanic;
+  final String? equipment;
+  final String? primaryMuscles;
+  final String? secondaryMuscles;
+  final DateTime createdAt;
+  const ActivitiesData(
+      {required this.id,
+      required this.title,
+      this.type,
+      this.description,
+      this.category,
+      this.force,
+      this.level,
+      this.mechanic,
+      this.equipment,
+      this.primaryMuscles,
+      this.secondaryMuscles,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    if (!nullToAbsent || type != null) {
+      map['type'] = Variable<String>(type);
+    }
+    if (!nullToAbsent || description != null) {
+      map['body'] = Variable<String>(description);
+    }
+    if (!nullToAbsent || category != null) {
+      map['category'] = Variable<String>(category);
+    }
+    if (!nullToAbsent || force != null) {
+      map['force'] = Variable<String>(force);
+    }
+    if (!nullToAbsent || level != null) {
+      map['level'] = Variable<String>(level);
+    }
+    if (!nullToAbsent || mechanic != null) {
+      map['mechanic'] = Variable<String>(mechanic);
+    }
+    if (!nullToAbsent || equipment != null) {
+      map['equipment'] = Variable<String>(equipment);
+    }
+    if (!nullToAbsent || primaryMuscles != null) {
+      map['primary_muscles'] = Variable<String>(primaryMuscles);
+    }
+    if (!nullToAbsent || secondaryMuscles != null) {
+      map['secondary_muscles'] = Variable<String>(secondaryMuscles);
+    }
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ActivitiesCompanion toCompanion(bool nullToAbsent) {
+    return ActivitiesCompanion(
+      id: Value(id),
+      title: Value(title),
+      type: type == null && nullToAbsent ? const Value.absent() : Value(type),
+      description: description == null && nullToAbsent
+          ? const Value.absent()
+          : Value(description),
+      category: category == null && nullToAbsent
+          ? const Value.absent()
+          : Value(category),
+      force:
+          force == null && nullToAbsent ? const Value.absent() : Value(force),
+      level:
+          level == null && nullToAbsent ? const Value.absent() : Value(level),
+      mechanic: mechanic == null && nullToAbsent
+          ? const Value.absent()
+          : Value(mechanic),
+      equipment: equipment == null && nullToAbsent
+          ? const Value.absent()
+          : Value(equipment),
+      primaryMuscles: primaryMuscles == null && nullToAbsent
+          ? const Value.absent()
+          : Value(primaryMuscles),
+      secondaryMuscles: secondaryMuscles == null && nullToAbsent
+          ? const Value.absent()
+          : Value(secondaryMuscles),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ActivitiesData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ActivitiesData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      type: serializer.fromJson<String?>(json['type']),
+      description: serializer.fromJson<String?>(json['description']),
+      category: serializer.fromJson<String?>(json['category']),
+      force: serializer.fromJson<String?>(json['force']),
+      level: serializer.fromJson<String?>(json['level']),
+      mechanic: serializer.fromJson<String?>(json['mechanic']),
+      equipment: serializer.fromJson<String?>(json['equipment']),
+      primaryMuscles: serializer.fromJson<String?>(json['primaryMuscles']),
+      secondaryMuscles: serializer.fromJson<String?>(json['secondaryMuscles']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'type': serializer.toJson<String?>(type),
+      'description': serializer.toJson<String?>(description),
+      'category': serializer.toJson<String?>(category),
+      'force': serializer.toJson<String?>(force),
+      'level': serializer.toJson<String?>(level),
+      'mechanic': serializer.toJson<String?>(mechanic),
+      'equipment': serializer.toJson<String?>(equipment),
+      'primaryMuscles': serializer.toJson<String?>(primaryMuscles),
+      'secondaryMuscles': serializer.toJson<String?>(secondaryMuscles),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ActivitiesData copyWith(
+          {int? id,
+          String? title,
+          Value<String?> type = const Value.absent(),
+          Value<String?> description = const Value.absent(),
+          Value<String?> category = const Value.absent(),
+          Value<String?> force = const Value.absent(),
+          Value<String?> level = const Value.absent(),
+          Value<String?> mechanic = const Value.absent(),
+          Value<String?> equipment = const Value.absent(),
+          Value<String?> primaryMuscles = const Value.absent(),
+          Value<String?> secondaryMuscles = const Value.absent(),
+          DateTime? createdAt}) =>
+      ActivitiesData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        type: type.present ? type.value : this.type,
+        description: description.present ? description.value : this.description,
+        category: category.present ? category.value : this.category,
+        force: force.present ? force.value : this.force,
+        level: level.present ? level.value : this.level,
+        mechanic: mechanic.present ? mechanic.value : this.mechanic,
+        equipment: equipment.present ? equipment.value : this.equipment,
+        primaryMuscles:
+            primaryMuscles.present ? primaryMuscles.value : this.primaryMuscles,
+        secondaryMuscles: secondaryMuscles.present
+            ? secondaryMuscles.value
+            : this.secondaryMuscles,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ActivitiesData copyWithCompanion(ActivitiesCompanion data) {
+    return ActivitiesData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      type: data.type.present ? data.type.value : this.type,
+      description:
+          data.description.present ? data.description.value : this.description,
+      category: data.category.present ? data.category.value : this.category,
+      force: data.force.present ? data.force.value : this.force,
+      level: data.level.present ? data.level.value : this.level,
+      mechanic: data.mechanic.present ? data.mechanic.value : this.mechanic,
+      equipment: data.equipment.present ? data.equipment.value : this.equipment,
+      primaryMuscles: data.primaryMuscles.present
+          ? data.primaryMuscles.value
+          : this.primaryMuscles,
+      secondaryMuscles: data.secondaryMuscles.present
+          ? data.secondaryMuscles.value
+          : this.secondaryMuscles,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivitiesData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('type: $type, ')
+          ..write('description: $description, ')
+          ..write('category: $category, ')
+          ..write('force: $force, ')
+          ..write('level: $level, ')
+          ..write('mechanic: $mechanic, ')
+          ..write('equipment: $equipment, ')
+          ..write('primaryMuscles: $primaryMuscles, ')
+          ..write('secondaryMuscles: $secondaryMuscles, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(id, title, type, description, category, force,
+      level, mechanic, equipment, primaryMuscles, secondaryMuscles, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ActivitiesData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.type == this.type &&
+          other.description == this.description &&
+          other.category == this.category &&
+          other.force == this.force &&
+          other.level == this.level &&
+          other.mechanic == this.mechanic &&
+          other.equipment == this.equipment &&
+          other.primaryMuscles == this.primaryMuscles &&
+          other.secondaryMuscles == this.secondaryMuscles &&
+          other.createdAt == this.createdAt);
+}
+
+class ActivitiesCompanion extends UpdateCompanion<ActivitiesData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String?> type;
+  final Value<String?> description;
+  final Value<String?> category;
+  final Value<String?> force;
+  final Value<String?> level;
+  final Value<String?> mechanic;
+  final Value<String?> equipment;
+  final Value<String?> primaryMuscles;
+  final Value<String?> secondaryMuscles;
+  final Value<DateTime> createdAt;
+  const ActivitiesCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.type = const Value.absent(),
+    this.description = const Value.absent(),
+    this.category = const Value.absent(),
+    this.force = const Value.absent(),
+    this.level = const Value.absent(),
+    this.mechanic = const Value.absent(),
+    this.equipment = const Value.absent(),
+    this.primaryMuscles = const Value.absent(),
+    this.secondaryMuscles = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ActivitiesCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    this.type = const Value.absent(),
+    this.description = const Value.absent(),
+    this.category = const Value.absent(),
+    this.force = const Value.absent(),
+    this.level = const Value.absent(),
+    this.mechanic = const Value.absent(),
+    this.equipment = const Value.absent(),
+    this.primaryMuscles = const Value.absent(),
+    this.secondaryMuscles = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  }) : title = Value(title);
+  static Insertable<ActivitiesData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? type,
+    Expression<String>? description,
+    Expression<String>? category,
+    Expression<String>? force,
+    Expression<String>? level,
+    Expression<String>? mechanic,
+    Expression<String>? equipment,
+    Expression<String>? primaryMuscles,
+    Expression<String>? secondaryMuscles,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (type != null) 'type': type,
+      if (description != null) 'body': description,
+      if (category != null) 'category': category,
+      if (force != null) 'force': force,
+      if (level != null) 'level': level,
+      if (mechanic != null) 'mechanic': mechanic,
+      if (equipment != null) 'equipment': equipment,
+      if (primaryMuscles != null) 'primary_muscles': primaryMuscles,
+      if (secondaryMuscles != null) 'secondary_muscles': secondaryMuscles,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ActivitiesCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String?>? type,
+      Value<String?>? description,
+      Value<String?>? category,
+      Value<String?>? force,
+      Value<String?>? level,
+      Value<String?>? mechanic,
+      Value<String?>? equipment,
+      Value<String?>? primaryMuscles,
+      Value<String?>? secondaryMuscles,
+      Value<DateTime>? createdAt}) {
+    return ActivitiesCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      type: type ?? this.type,
+      description: description ?? this.description,
+      category: category ?? this.category,
+      force: force ?? this.force,
+      level: level ?? this.level,
+      mechanic: mechanic ?? this.mechanic,
+      equipment: equipment ?? this.equipment,
+      primaryMuscles: primaryMuscles ?? this.primaryMuscles,
+      secondaryMuscles: secondaryMuscles ?? this.secondaryMuscles,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (type.present) {
+      map['type'] = Variable<String>(type.value);
+    }
+    if (description.present) {
+      map['body'] = Variable<String>(description.value);
+    }
+    if (category.present) {
+      map['category'] = Variable<String>(category.value);
+    }
+    if (force.present) {
+      map['force'] = Variable<String>(force.value);
+    }
+    if (level.present) {
+      map['level'] = Variable<String>(level.value);
+    }
+    if (mechanic.present) {
+      map['mechanic'] = Variable<String>(mechanic.value);
+    }
+    if (equipment.present) {
+      map['equipment'] = Variable<String>(equipment.value);
+    }
+    if (primaryMuscles.present) {
+      map['primary_muscles'] = Variable<String>(primaryMuscles.value);
+    }
+    if (secondaryMuscles.present) {
+      map['secondary_muscles'] = Variable<String>(secondaryMuscles.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivitiesCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('type: $type, ')
+          ..write('description: $description, ')
+          ..write('category: $category, ')
+          ..write('force: $force, ')
+          ..write('level: $level, ')
+          ..write('mechanic: $mechanic, ')
+          ..write('equipment: $equipment, ')
+          ..write('primaryMuscles: $primaryMuscles, ')
+          ..write('secondaryMuscles: $secondaryMuscles, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class SessionActivities extends Table
+    with TableInfo<SessionActivities, SessionActivitiesData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  SessionActivities(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<int> sessionId = GeneratedColumn<int>(
+      'session_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES sessions (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> activityId = GeneratedColumn<int>(
+      'activity_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES activities (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> position = GeneratedColumn<int>(
+      'position', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<String> results = GeneratedColumn<String>(
+      'results', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, sessionId, activityId, position, results, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'session_activities';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  SessionActivitiesData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return SessionActivitiesData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      sessionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!,
+      activityId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!,
+      position: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}position'])!,
+      results: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}results']),
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  SessionActivities createAlias(String alias) {
+    return SessionActivities(attachedDatabase, alias);
+  }
+}
+
+class SessionActivitiesData extends DataClass
+    implements Insertable<SessionActivitiesData> {
+  final int id;
+  final int sessionId;
+  final int activityId;
+  final int position;
+  final String? results;
+  final DateTime createdAt;
+  const SessionActivitiesData(
+      {required this.id,
+      required this.sessionId,
+      required this.activityId,
+      required this.position,
+      this.results,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['session_id'] = Variable<int>(sessionId);
+    map['activity_id'] = Variable<int>(activityId);
+    map['position'] = Variable<int>(position);
+    if (!nullToAbsent || results != null) {
+      map['results'] = Variable<String>(results);
+    }
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  SessionActivitiesCompanion toCompanion(bool nullToAbsent) {
+    return SessionActivitiesCompanion(
+      id: Value(id),
+      sessionId: Value(sessionId),
+      activityId: Value(activityId),
+      position: Value(position),
+      results: results == null && nullToAbsent
+          ? const Value.absent()
+          : Value(results),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory SessionActivitiesData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return SessionActivitiesData(
+      id: serializer.fromJson<int>(json['id']),
+      sessionId: serializer.fromJson<int>(json['sessionId']),
+      activityId: serializer.fromJson<int>(json['activityId']),
+      position: serializer.fromJson<int>(json['position']),
+      results: serializer.fromJson<String?>(json['results']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'sessionId': serializer.toJson<int>(sessionId),
+      'activityId': serializer.toJson<int>(activityId),
+      'position': serializer.toJson<int>(position),
+      'results': serializer.toJson<String?>(results),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  SessionActivitiesData copyWith(
+          {int? id,
+          int? sessionId,
+          int? activityId,
+          int? position,
+          Value<String?> results = const Value.absent(),
+          DateTime? createdAt}) =>
+      SessionActivitiesData(
+        id: id ?? this.id,
+        sessionId: sessionId ?? this.sessionId,
+        activityId: activityId ?? this.activityId,
+        position: position ?? this.position,
+        results: results.present ? results.value : this.results,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  SessionActivitiesData copyWithCompanion(SessionActivitiesCompanion data) {
+    return SessionActivitiesData(
+      id: data.id.present ? data.id.value : this.id,
+      sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId,
+      activityId:
+          data.activityId.present ? data.activityId.value : this.activityId,
+      position: data.position.present ? data.position.value : this.position,
+      results: data.results.present ? data.results.value : this.results,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionActivitiesData(')
+          ..write('id: $id, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('activityId: $activityId, ')
+          ..write('position: $position, ')
+          ..write('results: $results, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode =>
+      Object.hash(id, sessionId, activityId, position, results, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is SessionActivitiesData &&
+          other.id == this.id &&
+          other.sessionId == this.sessionId &&
+          other.activityId == this.activityId &&
+          other.position == this.position &&
+          other.results == this.results &&
+          other.createdAt == this.createdAt);
+}
+
+class SessionActivitiesCompanion
+    extends UpdateCompanion<SessionActivitiesData> {
+  final Value<int> id;
+  final Value<int> sessionId;
+  final Value<int> activityId;
+  final Value<int> position;
+  final Value<String?> results;
+  final Value<DateTime> createdAt;
+  const SessionActivitiesCompanion({
+    this.id = const Value.absent(),
+    this.sessionId = const Value.absent(),
+    this.activityId = const Value.absent(),
+    this.position = const Value.absent(),
+    this.results = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  SessionActivitiesCompanion.insert({
+    this.id = const Value.absent(),
+    required int sessionId,
+    required int activityId,
+    required int position,
+    this.results = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  })  : sessionId = Value(sessionId),
+        activityId = Value(activityId),
+        position = Value(position);
+  static Insertable<SessionActivitiesData> custom({
+    Expression<int>? id,
+    Expression<int>? sessionId,
+    Expression<int>? activityId,
+    Expression<int>? position,
+    Expression<String>? results,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (sessionId != null) 'session_id': sessionId,
+      if (activityId != null) 'activity_id': activityId,
+      if (position != null) 'position': position,
+      if (results != null) 'results': results,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  SessionActivitiesCompanion copyWith(
+      {Value<int>? id,
+      Value<int>? sessionId,
+      Value<int>? activityId,
+      Value<int>? position,
+      Value<String?>? results,
+      Value<DateTime>? createdAt}) {
+    return SessionActivitiesCompanion(
+      id: id ?? this.id,
+      sessionId: sessionId ?? this.sessionId,
+      activityId: activityId ?? this.activityId,
+      position: position ?? this.position,
+      results: results ?? this.results,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (sessionId.present) {
+      map['session_id'] = Variable<int>(sessionId.value);
+    }
+    if (activityId.present) {
+      map['activity_id'] = Variable<int>(activityId.value);
+    }
+    if (position.present) {
+      map['position'] = Variable<int>(position.value);
+    }
+    if (results.present) {
+      map['results'] = Variable<String>(results.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('SessionActivitiesCompanion(')
+          ..write('id: $id, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('activityId: $activityId, ')
+          ..write('position: $position, ')
+          ..write('results: $results, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class Actions extends Table with TableInfo<Actions, ActionsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  Actions(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 64),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> description = GeneratedColumn<String>(
+      'body', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<int> totalSets = GeneratedColumn<int>(
+      'total_sets', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<String> totalReps = GeneratedColumn<String>(
+      'total_reps', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 1, maxTextLength: 32),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<int> restBeforeSets = GeneratedColumn<int>(
+      'rest_before_sets', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<int> restBetweenSets = GeneratedColumn<int>(
+      'rest_between_sets', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<int> restBetweenReps = GeneratedColumn<int>(
+      'rest_between_reps', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<int> restAfterSets = GeneratedColumn<int>(
+      'rest_after_sets', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<String> repType = GeneratedColumn<String>(
+      'rep_type', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<int> repLength = GeneratedColumn<int>(
+      'rep_length', aliasedName, true,
+      type: DriftSqlType.int, requiredDuringInsert: false);
+  late final GeneratedColumn<String> repWeights = GeneratedColumn<String>(
+      'rep_weights', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<String> setWeights = GeneratedColumn<String>(
+      'set_weights', aliasedName, true,
+      type: DriftSqlType.string, requiredDuringInsert: false);
+  late final GeneratedColumn<bool> isAlternating = GeneratedColumn<bool>(
+      'is_alternating', aliasedName, false,
+      type: DriftSqlType.bool,
+      requiredDuringInsert: false,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'CHECK ("is_alternating" IN (0, 1))'),
+      defaultValue: Variable(false));
+  late final GeneratedColumn<String> tempo = GeneratedColumn<String>(
+      'tempo', aliasedName, true,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 6, maxTextLength: 36),
+      type: DriftSqlType.string,
+      requiredDuringInsert: false);
+  late final GeneratedColumn<String> status = GeneratedColumn<String>(
+      'status', aliasedName, false,
+      type: DriftSqlType.string,
+      requiredDuringInsert: false,
+      defaultValue: Variable('pending'));
+  late final GeneratedColumn<String> state = GeneratedColumn<String>(
+      'state', aliasedName, false,
+      type: DriftSqlType.string,
+      requiredDuringInsert: false,
+      defaultValue: Variable(
+          "{\"currentSet\": 0, \"currentRep\": 0, \"currentActionType\": 0, \"currentTime\": 0, \"currentAction\": 0}"));
+  late final GeneratedColumn<String> set = GeneratedColumn<String>(
+      'set', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns => [
+        id,
+        title,
+        description,
+        totalSets,
+        totalReps,
+        restBeforeSets,
+        restBetweenSets,
+        restBetweenReps,
+        restAfterSets,
+        repType,
+        repLength,
+        repWeights,
+        setWeights,
+        isAlternating,
+        tempo,
+        status,
+        state,
+        set,
+        createdAt
+      ];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'actions';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ActionsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ActionsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      description: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body'])!,
+      totalSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}total_sets'])!,
+      totalReps: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}total_reps'])!,
+      restBeforeSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_before_sets']),
+      restBetweenSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_between_sets']),
+      restBetweenReps: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_between_reps']),
+      restAfterSets: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rest_after_sets']),
+      repType: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}rep_type'])!,
+      repLength: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}rep_length']),
+      repWeights: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}rep_weights']),
+      setWeights: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}set_weights']),
+      isAlternating: attachedDatabase.typeMapping
+          .read(DriftSqlType.bool, data['${effectivePrefix}is_alternating'])!,
+      tempo: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}tempo']),
+      status: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}status'])!,
+      state: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}state'])!,
+      set: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}set'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  Actions createAlias(String alias) {
+    return Actions(attachedDatabase, alias);
+  }
+}
+
+class ActionsData extends DataClass implements Insertable<ActionsData> {
+  final int id;
+  final String title;
+  final String description;
+  final int totalSets;
+  final String totalReps;
+  final int? restBeforeSets;
+  final int? restBetweenSets;
+  final int? restBetweenReps;
+  final int? restAfterSets;
+  final String repType;
+  final int? repLength;
+  final String? repWeights;
+  final String? setWeights;
+  final bool isAlternating;
+  final String? tempo;
+  final String status;
+  final String state;
+  final String set;
+  final DateTime createdAt;
+  const ActionsData(
+      {required this.id,
+      required this.title,
+      required this.description,
+      required this.totalSets,
+      required this.totalReps,
+      this.restBeforeSets,
+      this.restBetweenSets,
+      this.restBetweenReps,
+      this.restAfterSets,
+      required this.repType,
+      this.repLength,
+      this.repWeights,
+      this.setWeights,
+      required this.isAlternating,
+      this.tempo,
+      required this.status,
+      required this.state,
+      required this.set,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    map['body'] = Variable<String>(description);
+    map['total_sets'] = Variable<int>(totalSets);
+    map['total_reps'] = Variable<String>(totalReps);
+    if (!nullToAbsent || restBeforeSets != null) {
+      map['rest_before_sets'] = Variable<int>(restBeforeSets);
+    }
+    if (!nullToAbsent || restBetweenSets != null) {
+      map['rest_between_sets'] = Variable<int>(restBetweenSets);
+    }
+    if (!nullToAbsent || restBetweenReps != null) {
+      map['rest_between_reps'] = Variable<int>(restBetweenReps);
+    }
+    if (!nullToAbsent || restAfterSets != null) {
+      map['rest_after_sets'] = Variable<int>(restAfterSets);
+    }
+    map['rep_type'] = Variable<String>(repType);
+    if (!nullToAbsent || repLength != null) {
+      map['rep_length'] = Variable<int>(repLength);
+    }
+    if (!nullToAbsent || repWeights != null) {
+      map['rep_weights'] = Variable<String>(repWeights);
+    }
+    if (!nullToAbsent || setWeights != null) {
+      map['set_weights'] = Variable<String>(setWeights);
+    }
+    map['is_alternating'] = Variable<bool>(isAlternating);
+    if (!nullToAbsent || tempo != null) {
+      map['tempo'] = Variable<String>(tempo);
+    }
+    map['status'] = Variable<String>(status);
+    map['state'] = Variable<String>(state);
+    map['set'] = Variable<String>(set);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ActionsCompanion toCompanion(bool nullToAbsent) {
+    return ActionsCompanion(
+      id: Value(id),
+      title: Value(title),
+      description: Value(description),
+      totalSets: Value(totalSets),
+      totalReps: Value(totalReps),
+      restBeforeSets: restBeforeSets == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restBeforeSets),
+      restBetweenSets: restBetweenSets == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restBetweenSets),
+      restBetweenReps: restBetweenReps == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restBetweenReps),
+      restAfterSets: restAfterSets == null && nullToAbsent
+          ? const Value.absent()
+          : Value(restAfterSets),
+      repType: Value(repType),
+      repLength: repLength == null && nullToAbsent
+          ? const Value.absent()
+          : Value(repLength),
+      repWeights: repWeights == null && nullToAbsent
+          ? const Value.absent()
+          : Value(repWeights),
+      setWeights: setWeights == null && nullToAbsent
+          ? const Value.absent()
+          : Value(setWeights),
+      isAlternating: Value(isAlternating),
+      tempo:
+          tempo == null && nullToAbsent ? const Value.absent() : Value(tempo),
+      status: Value(status),
+      state: Value(state),
+      set: Value(set),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ActionsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ActionsData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      description: serializer.fromJson<String>(json['description']),
+      totalSets: serializer.fromJson<int>(json['totalSets']),
+      totalReps: serializer.fromJson<String>(json['totalReps']),
+      restBeforeSets: serializer.fromJson<int?>(json['restBeforeSets']),
+      restBetweenSets: serializer.fromJson<int?>(json['restBetweenSets']),
+      restBetweenReps: serializer.fromJson<int?>(json['restBetweenReps']),
+      restAfterSets: serializer.fromJson<int?>(json['restAfterSets']),
+      repType: serializer.fromJson<String>(json['repType']),
+      repLength: serializer.fromJson<int?>(json['repLength']),
+      repWeights: serializer.fromJson<String?>(json['repWeights']),
+      setWeights: serializer.fromJson<String?>(json['setWeights']),
+      isAlternating: serializer.fromJson<bool>(json['isAlternating']),
+      tempo: serializer.fromJson<String?>(json['tempo']),
+      status: serializer.fromJson<String>(json['status']),
+      state: serializer.fromJson<String>(json['state']),
+      set: serializer.fromJson<String>(json['set']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'description': serializer.toJson<String>(description),
+      'totalSets': serializer.toJson<int>(totalSets),
+      'totalReps': serializer.toJson<String>(totalReps),
+      'restBeforeSets': serializer.toJson<int?>(restBeforeSets),
+      'restBetweenSets': serializer.toJson<int?>(restBetweenSets),
+      'restBetweenReps': serializer.toJson<int?>(restBetweenReps),
+      'restAfterSets': serializer.toJson<int?>(restAfterSets),
+      'repType': serializer.toJson<String>(repType),
+      'repLength': serializer.toJson<int?>(repLength),
+      'repWeights': serializer.toJson<String?>(repWeights),
+      'setWeights': serializer.toJson<String?>(setWeights),
+      'isAlternating': serializer.toJson<bool>(isAlternating),
+      'tempo': serializer.toJson<String?>(tempo),
+      'status': serializer.toJson<String>(status),
+      'state': serializer.toJson<String>(state),
+      'set': serializer.toJson<String>(set),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ActionsData copyWith(
+          {int? id,
+          String? title,
+          String? description,
+          int? totalSets,
+          String? totalReps,
+          Value<int?> restBeforeSets = const Value.absent(),
+          Value<int?> restBetweenSets = const Value.absent(),
+          Value<int?> restBetweenReps = const Value.absent(),
+          Value<int?> restAfterSets = const Value.absent(),
+          String? repType,
+          Value<int?> repLength = const Value.absent(),
+          Value<String?> repWeights = const Value.absent(),
+          Value<String?> setWeights = const Value.absent(),
+          bool? isAlternating,
+          Value<String?> tempo = const Value.absent(),
+          String? status,
+          String? state,
+          String? set,
+          DateTime? createdAt}) =>
+      ActionsData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        description: description ?? this.description,
+        totalSets: totalSets ?? this.totalSets,
+        totalReps: totalReps ?? this.totalReps,
+        restBeforeSets:
+            restBeforeSets.present ? restBeforeSets.value : this.restBeforeSets,
+        restBetweenSets: restBetweenSets.present
+            ? restBetweenSets.value
+            : this.restBetweenSets,
+        restBetweenReps: restBetweenReps.present
+            ? restBetweenReps.value
+            : this.restBetweenReps,
+        restAfterSets:
+            restAfterSets.present ? restAfterSets.value : this.restAfterSets,
+        repType: repType ?? this.repType,
+        repLength: repLength.present ? repLength.value : this.repLength,
+        repWeights: repWeights.present ? repWeights.value : this.repWeights,
+        setWeights: setWeights.present ? setWeights.value : this.setWeights,
+        isAlternating: isAlternating ?? this.isAlternating,
+        tempo: tempo.present ? tempo.value : this.tempo,
+        status: status ?? this.status,
+        state: state ?? this.state,
+        set: set ?? this.set,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ActionsData copyWithCompanion(ActionsCompanion data) {
+    return ActionsData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      description:
+          data.description.present ? data.description.value : this.description,
+      totalSets: data.totalSets.present ? data.totalSets.value : this.totalSets,
+      totalReps: data.totalReps.present ? data.totalReps.value : this.totalReps,
+      restBeforeSets: data.restBeforeSets.present
+          ? data.restBeforeSets.value
+          : this.restBeforeSets,
+      restBetweenSets: data.restBetweenSets.present
+          ? data.restBetweenSets.value
+          : this.restBetweenSets,
+      restBetweenReps: data.restBetweenReps.present
+          ? data.restBetweenReps.value
+          : this.restBetweenReps,
+      restAfterSets: data.restAfterSets.present
+          ? data.restAfterSets.value
+          : this.restAfterSets,
+      repType: data.repType.present ? data.repType.value : this.repType,
+      repLength: data.repLength.present ? data.repLength.value : this.repLength,
+      repWeights:
+          data.repWeights.present ? data.repWeights.value : this.repWeights,
+      setWeights:
+          data.setWeights.present ? data.setWeights.value : this.setWeights,
+      isAlternating: data.isAlternating.present
+          ? data.isAlternating.value
+          : this.isAlternating,
+      tempo: data.tempo.present ? data.tempo.value : this.tempo,
+      status: data.status.present ? data.status.value : this.status,
+      state: data.state.present ? data.state.value : this.state,
+      set: data.set.present ? data.set.value : this.set,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActionsData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('totalSets: $totalSets, ')
+          ..write('totalReps: $totalReps, ')
+          ..write('restBeforeSets: $restBeforeSets, ')
+          ..write('restBetweenSets: $restBetweenSets, ')
+          ..write('restBetweenReps: $restBetweenReps, ')
+          ..write('restAfterSets: $restAfterSets, ')
+          ..write('repType: $repType, ')
+          ..write('repLength: $repLength, ')
+          ..write('repWeights: $repWeights, ')
+          ..write('setWeights: $setWeights, ')
+          ..write('isAlternating: $isAlternating, ')
+          ..write('tempo: $tempo, ')
+          ..write('status: $status, ')
+          ..write('state: $state, ')
+          ..write('set: $set, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(
+      id,
+      title,
+      description,
+      totalSets,
+      totalReps,
+      restBeforeSets,
+      restBetweenSets,
+      restBetweenReps,
+      restAfterSets,
+      repType,
+      repLength,
+      repWeights,
+      setWeights,
+      isAlternating,
+      tempo,
+      status,
+      state,
+      set,
+      createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ActionsData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.description == this.description &&
+          other.totalSets == this.totalSets &&
+          other.totalReps == this.totalReps &&
+          other.restBeforeSets == this.restBeforeSets &&
+          other.restBetweenSets == this.restBetweenSets &&
+          other.restBetweenReps == this.restBetweenReps &&
+          other.restAfterSets == this.restAfterSets &&
+          other.repType == this.repType &&
+          other.repLength == this.repLength &&
+          other.repWeights == this.repWeights &&
+          other.setWeights == this.setWeights &&
+          other.isAlternating == this.isAlternating &&
+          other.tempo == this.tempo &&
+          other.status == this.status &&
+          other.state == this.state &&
+          other.set == this.set &&
+          other.createdAt == this.createdAt);
+}
+
+class ActionsCompanion extends UpdateCompanion<ActionsData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String> description;
+  final Value<int> totalSets;
+  final Value<String> totalReps;
+  final Value<int?> restBeforeSets;
+  final Value<int?> restBetweenSets;
+  final Value<int?> restBetweenReps;
+  final Value<int?> restAfterSets;
+  final Value<String> repType;
+  final Value<int?> repLength;
+  final Value<String?> repWeights;
+  final Value<String?> setWeights;
+  final Value<bool> isAlternating;
+  final Value<String?> tempo;
+  final Value<String> status;
+  final Value<String> state;
+  final Value<String> set;
+  final Value<DateTime> createdAt;
+  const ActionsCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.description = const Value.absent(),
+    this.totalSets = const Value.absent(),
+    this.totalReps = const Value.absent(),
+    this.restBeforeSets = const Value.absent(),
+    this.restBetweenSets = const Value.absent(),
+    this.restBetweenReps = const Value.absent(),
+    this.restAfterSets = const Value.absent(),
+    this.repType = const Value.absent(),
+    this.repLength = const Value.absent(),
+    this.repWeights = const Value.absent(),
+    this.setWeights = const Value.absent(),
+    this.isAlternating = const Value.absent(),
+    this.tempo = const Value.absent(),
+    this.status = const Value.absent(),
+    this.state = const Value.absent(),
+    this.set = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ActionsCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    required String description,
+    required int totalSets,
+    required String totalReps,
+    this.restBeforeSets = const Value.absent(),
+    this.restBetweenSets = const Value.absent(),
+    this.restBetweenReps = const Value.absent(),
+    this.restAfterSets = const Value.absent(),
+    required String repType,
+    this.repLength = const Value.absent(),
+    this.repWeights = const Value.absent(),
+    this.setWeights = const Value.absent(),
+    this.isAlternating = const Value.absent(),
+    this.tempo = const Value.absent(),
+    this.status = const Value.absent(),
+    this.state = const Value.absent(),
+    required String set,
+    this.createdAt = const Value.absent(),
+  })  : title = Value(title),
+        description = Value(description),
+        totalSets = Value(totalSets),
+        totalReps = Value(totalReps),
+        repType = Value(repType),
+        set = Value(set);
+  static Insertable<ActionsData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? description,
+    Expression<int>? totalSets,
+    Expression<String>? totalReps,
+    Expression<int>? restBeforeSets,
+    Expression<int>? restBetweenSets,
+    Expression<int>? restBetweenReps,
+    Expression<int>? restAfterSets,
+    Expression<String>? repType,
+    Expression<int>? repLength,
+    Expression<String>? repWeights,
+    Expression<String>? setWeights,
+    Expression<bool>? isAlternating,
+    Expression<String>? tempo,
+    Expression<String>? status,
+    Expression<String>? state,
+    Expression<String>? set,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (description != null) 'body': description,
+      if (totalSets != null) 'total_sets': totalSets,
+      if (totalReps != null) 'total_reps': totalReps,
+      if (restBeforeSets != null) 'rest_before_sets': restBeforeSets,
+      if (restBetweenSets != null) 'rest_between_sets': restBetweenSets,
+      if (restBetweenReps != null) 'rest_between_reps': restBetweenReps,
+      if (restAfterSets != null) 'rest_after_sets': restAfterSets,
+      if (repType != null) 'rep_type': repType,
+      if (repLength != null) 'rep_length': repLength,
+      if (repWeights != null) 'rep_weights': repWeights,
+      if (setWeights != null) 'set_weights': setWeights,
+      if (isAlternating != null) 'is_alternating': isAlternating,
+      if (tempo != null) 'tempo': tempo,
+      if (status != null) 'status': status,
+      if (state != null) 'state': state,
+      if (set != null) 'set': set,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ActionsCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String>? description,
+      Value<int>? totalSets,
+      Value<String>? totalReps,
+      Value<int?>? restBeforeSets,
+      Value<int?>? restBetweenSets,
+      Value<int?>? restBetweenReps,
+      Value<int?>? restAfterSets,
+      Value<String>? repType,
+      Value<int?>? repLength,
+      Value<String?>? repWeights,
+      Value<String?>? setWeights,
+      Value<bool>? isAlternating,
+      Value<String?>? tempo,
+      Value<String>? status,
+      Value<String>? state,
+      Value<String>? set,
+      Value<DateTime>? createdAt}) {
+    return ActionsCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      description: description ?? this.description,
+      totalSets: totalSets ?? this.totalSets,
+      totalReps: totalReps ?? this.totalReps,
+      restBeforeSets: restBeforeSets ?? this.restBeforeSets,
+      restBetweenSets: restBetweenSets ?? this.restBetweenSets,
+      restBetweenReps: restBetweenReps ?? this.restBetweenReps,
+      restAfterSets: restAfterSets ?? this.restAfterSets,
+      repType: repType ?? this.repType,
+      repLength: repLength ?? this.repLength,
+      repWeights: repWeights ?? this.repWeights,
+      setWeights: setWeights ?? this.setWeights,
+      isAlternating: isAlternating ?? this.isAlternating,
+      tempo: tempo ?? this.tempo,
+      status: status ?? this.status,
+      state: state ?? this.state,
+      set: set ?? this.set,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (description.present) {
+      map['body'] = Variable<String>(description.value);
+    }
+    if (totalSets.present) {
+      map['total_sets'] = Variable<int>(totalSets.value);
+    }
+    if (totalReps.present) {
+      map['total_reps'] = Variable<String>(totalReps.value);
+    }
+    if (restBeforeSets.present) {
+      map['rest_before_sets'] = Variable<int>(restBeforeSets.value);
+    }
+    if (restBetweenSets.present) {
+      map['rest_between_sets'] = Variable<int>(restBetweenSets.value);
+    }
+    if (restBetweenReps.present) {
+      map['rest_between_reps'] = Variable<int>(restBetweenReps.value);
+    }
+    if (restAfterSets.present) {
+      map['rest_after_sets'] = Variable<int>(restAfterSets.value);
+    }
+    if (repType.present) {
+      map['rep_type'] = Variable<String>(repType.value);
+    }
+    if (repLength.present) {
+      map['rep_length'] = Variable<int>(repLength.value);
+    }
+    if (repWeights.present) {
+      map['rep_weights'] = Variable<String>(repWeights.value);
+    }
+    if (setWeights.present) {
+      map['set_weights'] = Variable<String>(setWeights.value);
+    }
+    if (isAlternating.present) {
+      map['is_alternating'] = Variable<bool>(isAlternating.value);
+    }
+    if (tempo.present) {
+      map['tempo'] = Variable<String>(tempo.value);
+    }
+    if (status.present) {
+      map['status'] = Variable<String>(status.value);
+    }
+    if (state.present) {
+      map['state'] = Variable<String>(state.value);
+    }
+    if (set.present) {
+      map['set'] = Variable<String>(set.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActionsCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('totalSets: $totalSets, ')
+          ..write('totalReps: $totalReps, ')
+          ..write('restBeforeSets: $restBeforeSets, ')
+          ..write('restBetweenSets: $restBetweenSets, ')
+          ..write('restBetweenReps: $restBetweenReps, ')
+          ..write('restAfterSets: $restAfterSets, ')
+          ..write('repType: $repType, ')
+          ..write('repLength: $repLength, ')
+          ..write('repWeights: $repWeights, ')
+          ..write('setWeights: $setWeights, ')
+          ..write('isAlternating: $isAlternating, ')
+          ..write('tempo: $tempo, ')
+          ..write('status: $status, ')
+          ..write('state: $state, ')
+          ..write('set: $set, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class ActivityActions extends Table
+    with TableInfo<ActivityActions, ActivityActionsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  ActivityActions(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<int> activityId = GeneratedColumn<int>(
+      'activity_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES activities (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> actionId = GeneratedColumn<int>(
+      'action_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES actions (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> sessionId = GeneratedColumn<int>(
+      'session_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES sessions (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<int> position = GeneratedColumn<int>(
+      'position', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, activityId, actionId, sessionId, position, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'activity_actions';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ActivityActionsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ActivityActionsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      activityId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!,
+      actionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!,
+      sessionId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!,
+      position: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}position'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  ActivityActions createAlias(String alias) {
+    return ActivityActions(attachedDatabase, alias);
+  }
+}
+
+class ActivityActionsData extends DataClass
+    implements Insertable<ActivityActionsData> {
+  final int id;
+  final int activityId;
+  final int actionId;
+  final int sessionId;
+  final int position;
+  final DateTime createdAt;
+  const ActivityActionsData(
+      {required this.id,
+      required this.activityId,
+      required this.actionId,
+      required this.sessionId,
+      required this.position,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['activity_id'] = Variable<int>(activityId);
+    map['action_id'] = Variable<int>(actionId);
+    map['session_id'] = Variable<int>(sessionId);
+    map['position'] = Variable<int>(position);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ActivityActionsCompanion toCompanion(bool nullToAbsent) {
+    return ActivityActionsCompanion(
+      id: Value(id),
+      activityId: Value(activityId),
+      actionId: Value(actionId),
+      sessionId: Value(sessionId),
+      position: Value(position),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ActivityActionsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ActivityActionsData(
+      id: serializer.fromJson<int>(json['id']),
+      activityId: serializer.fromJson<int>(json['activityId']),
+      actionId: serializer.fromJson<int>(json['actionId']),
+      sessionId: serializer.fromJson<int>(json['sessionId']),
+      position: serializer.fromJson<int>(json['position']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'activityId': serializer.toJson<int>(activityId),
+      'actionId': serializer.toJson<int>(actionId),
+      'sessionId': serializer.toJson<int>(sessionId),
+      'position': serializer.toJson<int>(position),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ActivityActionsData copyWith(
+          {int? id,
+          int? activityId,
+          int? actionId,
+          int? sessionId,
+          int? position,
+          DateTime? createdAt}) =>
+      ActivityActionsData(
+        id: id ?? this.id,
+        activityId: activityId ?? this.activityId,
+        actionId: actionId ?? this.actionId,
+        sessionId: sessionId ?? this.sessionId,
+        position: position ?? this.position,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ActivityActionsData copyWithCompanion(ActivityActionsCompanion data) {
+    return ActivityActionsData(
+      id: data.id.present ? data.id.value : this.id,
+      activityId:
+          data.activityId.present ? data.activityId.value : this.activityId,
+      actionId: data.actionId.present ? data.actionId.value : this.actionId,
+      sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId,
+      position: data.position.present ? data.position.value : this.position,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivityActionsData(')
+          ..write('id: $id, ')
+          ..write('activityId: $activityId, ')
+          ..write('actionId: $actionId, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('position: $position, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode =>
+      Object.hash(id, activityId, actionId, sessionId, position, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ActivityActionsData &&
+          other.id == this.id &&
+          other.activityId == this.activityId &&
+          other.actionId == this.actionId &&
+          other.sessionId == this.sessionId &&
+          other.position == this.position &&
+          other.createdAt == this.createdAt);
+}
+
+class ActivityActionsCompanion extends UpdateCompanion<ActivityActionsData> {
+  final Value<int> id;
+  final Value<int> activityId;
+  final Value<int> actionId;
+  final Value<int> sessionId;
+  final Value<int> position;
+  final Value<DateTime> createdAt;
+  const ActivityActionsCompanion({
+    this.id = const Value.absent(),
+    this.activityId = const Value.absent(),
+    this.actionId = const Value.absent(),
+    this.sessionId = const Value.absent(),
+    this.position = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ActivityActionsCompanion.insert({
+    this.id = const Value.absent(),
+    required int activityId,
+    required int actionId,
+    required int sessionId,
+    required int position,
+    this.createdAt = const Value.absent(),
+  })  : activityId = Value(activityId),
+        actionId = Value(actionId),
+        sessionId = Value(sessionId),
+        position = Value(position);
+  static Insertable<ActivityActionsData> custom({
+    Expression<int>? id,
+    Expression<int>? activityId,
+    Expression<int>? actionId,
+    Expression<int>? sessionId,
+    Expression<int>? position,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (activityId != null) 'activity_id': activityId,
+      if (actionId != null) 'action_id': actionId,
+      if (sessionId != null) 'session_id': sessionId,
+      if (position != null) 'position': position,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ActivityActionsCompanion copyWith(
+      {Value<int>? id,
+      Value<int>? activityId,
+      Value<int>? actionId,
+      Value<int>? sessionId,
+      Value<int>? position,
+      Value<DateTime>? createdAt}) {
+    return ActivityActionsCompanion(
+      id: id ?? this.id,
+      activityId: activityId ?? this.activityId,
+      actionId: actionId ?? this.actionId,
+      sessionId: sessionId ?? this.sessionId,
+      position: position ?? this.position,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (activityId.present) {
+      map['activity_id'] = Variable<int>(activityId.value);
+    }
+    if (actionId.present) {
+      map['action_id'] = Variable<int>(actionId.value);
+    }
+    if (sessionId.present) {
+      map['session_id'] = Variable<int>(sessionId.value);
+    }
+    if (position.present) {
+      map['position'] = Variable<int>(position.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ActivityActionsCompanion(')
+          ..write('id: $id, ')
+          ..write('activityId: $activityId, ')
+          ..write('actionId: $actionId, ')
+          ..write('sessionId: $sessionId, ')
+          ..write('position: $position, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class MediaItems extends Table with TableInfo<MediaItems, MediaItemsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  MediaItems(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<String> title = GeneratedColumn<String>(
+      'title', aliasedName, false,
+      additionalChecks:
+          GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 64),
+      type: DriftSqlType.string,
+      requiredDuringInsert: true);
+  late final GeneratedColumn<String> description = GeneratedColumn<String>(
+      'body', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> reference = GeneratedColumn<String>(
+      'reference', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<String> type = GeneratedColumn<String>(
+      'type', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, title, description, reference, type, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'media_items';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  MediaItemsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return MediaItemsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      title: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}title'])!,
+      description: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}body'])!,
+      reference: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}reference'])!,
+      type: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}type'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  MediaItems createAlias(String alias) {
+    return MediaItems(attachedDatabase, alias);
+  }
+}
+
+class MediaItemsData extends DataClass implements Insertable<MediaItemsData> {
+  final int id;
+  final String title;
+  final String description;
+  final String reference;
+  final String type;
+  final DateTime createdAt;
+  const MediaItemsData(
+      {required this.id,
+      required this.title,
+      required this.description,
+      required this.reference,
+      required this.type,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['title'] = Variable<String>(title);
+    map['body'] = Variable<String>(description);
+    map['reference'] = Variable<String>(reference);
+    map['type'] = Variable<String>(type);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  MediaItemsCompanion toCompanion(bool nullToAbsent) {
+    return MediaItemsCompanion(
+      id: Value(id),
+      title: Value(title),
+      description: Value(description),
+      reference: Value(reference),
+      type: Value(type),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory MediaItemsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return MediaItemsData(
+      id: serializer.fromJson<int>(json['id']),
+      title: serializer.fromJson<String>(json['title']),
+      description: serializer.fromJson<String>(json['description']),
+      reference: serializer.fromJson<String>(json['reference']),
+      type: serializer.fromJson<String>(json['type']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'title': serializer.toJson<String>(title),
+      'description': serializer.toJson<String>(description),
+      'reference': serializer.toJson<String>(reference),
+      'type': serializer.toJson<String>(type),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  MediaItemsData copyWith(
+          {int? id,
+          String? title,
+          String? description,
+          String? reference,
+          String? type,
+          DateTime? createdAt}) =>
+      MediaItemsData(
+        id: id ?? this.id,
+        title: title ?? this.title,
+        description: description ?? this.description,
+        reference: reference ?? this.reference,
+        type: type ?? this.type,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  MediaItemsData copyWithCompanion(MediaItemsCompanion data) {
+    return MediaItemsData(
+      id: data.id.present ? data.id.value : this.id,
+      title: data.title.present ? data.title.value : this.title,
+      description:
+          data.description.present ? data.description.value : this.description,
+      reference: data.reference.present ? data.reference.value : this.reference,
+      type: data.type.present ? data.type.value : this.type,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('MediaItemsData(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('reference: $reference, ')
+          ..write('type: $type, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode =>
+      Object.hash(id, title, description, reference, type, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is MediaItemsData &&
+          other.id == this.id &&
+          other.title == this.title &&
+          other.description == this.description &&
+          other.reference == this.reference &&
+          other.type == this.type &&
+          other.createdAt == this.createdAt);
+}
+
+class MediaItemsCompanion extends UpdateCompanion<MediaItemsData> {
+  final Value<int> id;
+  final Value<String> title;
+  final Value<String> description;
+  final Value<String> reference;
+  final Value<String> type;
+  final Value<DateTime> createdAt;
+  const MediaItemsCompanion({
+    this.id = const Value.absent(),
+    this.title = const Value.absent(),
+    this.description = const Value.absent(),
+    this.reference = const Value.absent(),
+    this.type = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  MediaItemsCompanion.insert({
+    this.id = const Value.absent(),
+    required String title,
+    required String description,
+    required String reference,
+    required String type,
+    this.createdAt = const Value.absent(),
+  })  : title = Value(title),
+        description = Value(description),
+        reference = Value(reference),
+        type = Value(type);
+  static Insertable<MediaItemsData> custom({
+    Expression<int>? id,
+    Expression<String>? title,
+    Expression<String>? description,
+    Expression<String>? reference,
+    Expression<String>? type,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (title != null) 'title': title,
+      if (description != null) 'body': description,
+      if (reference != null) 'reference': reference,
+      if (type != null) 'type': type,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  MediaItemsCompanion copyWith(
+      {Value<int>? id,
+      Value<String>? title,
+      Value<String>? description,
+      Value<String>? reference,
+      Value<String>? type,
+      Value<DateTime>? createdAt}) {
+    return MediaItemsCompanion(
+      id: id ?? this.id,
+      title: title ?? this.title,
+      description: description ?? this.description,
+      reference: reference ?? this.reference,
+      type: type ?? this.type,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (title.present) {
+      map['title'] = Variable<String>(title.value);
+    }
+    if (description.present) {
+      map['body'] = Variable<String>(description.value);
+    }
+    if (reference.present) {
+      map['reference'] = Variable<String>(reference.value);
+    }
+    if (type.present) {
+      map['type'] = Variable<String>(type.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('MediaItemsCompanion(')
+          ..write('id: $id, ')
+          ..write('title: $title, ')
+          ..write('description: $description, ')
+          ..write('reference: $reference, ')
+          ..write('type: $type, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class ObjectMediaItems extends Table
+    with TableInfo<ObjectMediaItems, ObjectMediaItemsData> {
+  @override
+  final GeneratedDatabase attachedDatabase;
+  final String? _alias;
+  ObjectMediaItems(this.attachedDatabase, [this._alias]);
+  late final GeneratedColumn<int> id = GeneratedColumn<int>(
+      'id', aliasedName, false,
+      hasAutoIncrement: true,
+      type: DriftSqlType.int,
+      requiredDuringInsert: false,
+      defaultConstraints:
+          GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT'));
+  late final GeneratedColumn<int> objectId = GeneratedColumn<int>(
+      'object_id', aliasedName, false,
+      type: DriftSqlType.int, requiredDuringInsert: true);
+  late final GeneratedColumn<String> objectType = GeneratedColumn<String>(
+      'object_type', aliasedName, false,
+      type: DriftSqlType.string, requiredDuringInsert: true);
+  late final GeneratedColumn<int> mediaId = GeneratedColumn<int>(
+      'media_id', aliasedName, false,
+      type: DriftSqlType.int,
+      requiredDuringInsert: true,
+      defaultConstraints: GeneratedColumn.constraintIsAlways(
+          'REFERENCES media_items (id) ON DELETE CASCADE'));
+  late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
+      'created_at', aliasedName, false,
+      type: DriftSqlType.dateTime,
+      requiredDuringInsert: false,
+      defaultValue: Variable(DateTime.now()));
+  @override
+  List<GeneratedColumn> get $columns =>
+      [id, objectId, objectType, mediaId, createdAt];
+  @override
+  String get aliasedName => _alias ?? actualTableName;
+  @override
+  String get actualTableName => $name;
+  static const String $name = 'object_media_items';
+  @override
+  Set<GeneratedColumn> get $primaryKey => {id};
+  @override
+  ObjectMediaItemsData map(Map<String, dynamic> data, {String? tablePrefix}) {
+    final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
+    return ObjectMediaItemsData(
+      id: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}id'])!,
+      objectId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!,
+      objectType: attachedDatabase.typeMapping
+          .read(DriftSqlType.string, data['${effectivePrefix}object_type'])!,
+      mediaId: attachedDatabase.typeMapping
+          .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!,
+      createdAt: attachedDatabase.typeMapping
+          .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!,
+    );
+  }
+
+  @override
+  ObjectMediaItems createAlias(String alias) {
+    return ObjectMediaItems(attachedDatabase, alias);
+  }
+}
+
+class ObjectMediaItemsData extends DataClass
+    implements Insertable<ObjectMediaItemsData> {
+  final int id;
+  final int objectId;
+  final String objectType;
+  final int mediaId;
+  final DateTime createdAt;
+  const ObjectMediaItemsData(
+      {required this.id,
+      required this.objectId,
+      required this.objectType,
+      required this.mediaId,
+      required this.createdAt});
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    map['id'] = Variable<int>(id);
+    map['object_id'] = Variable<int>(objectId);
+    map['object_type'] = Variable<String>(objectType);
+    map['media_id'] = Variable<int>(mediaId);
+    map['created_at'] = Variable<DateTime>(createdAt);
+    return map;
+  }
+
+  ObjectMediaItemsCompanion toCompanion(bool nullToAbsent) {
+    return ObjectMediaItemsCompanion(
+      id: Value(id),
+      objectId: Value(objectId),
+      objectType: Value(objectType),
+      mediaId: Value(mediaId),
+      createdAt: Value(createdAt),
+    );
+  }
+
+  factory ObjectMediaItemsData.fromJson(Map<String, dynamic> json,
+      {ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return ObjectMediaItemsData(
+      id: serializer.fromJson<int>(json['id']),
+      objectId: serializer.fromJson<int>(json['objectId']),
+      objectType: serializer.fromJson<String>(json['objectType']),
+      mediaId: serializer.fromJson<int>(json['mediaId']),
+      createdAt: serializer.fromJson<DateTime>(json['createdAt']),
+    );
+  }
+  @override
+  Map<String, dynamic> toJson({ValueSerializer? serializer}) {
+    serializer ??= driftRuntimeOptions.defaultSerializer;
+    return <String, dynamic>{
+      'id': serializer.toJson<int>(id),
+      'objectId': serializer.toJson<int>(objectId),
+      'objectType': serializer.toJson<String>(objectType),
+      'mediaId': serializer.toJson<int>(mediaId),
+      'createdAt': serializer.toJson<DateTime>(createdAt),
+    };
+  }
+
+  ObjectMediaItemsData copyWith(
+          {int? id,
+          int? objectId,
+          String? objectType,
+          int? mediaId,
+          DateTime? createdAt}) =>
+      ObjectMediaItemsData(
+        id: id ?? this.id,
+        objectId: objectId ?? this.objectId,
+        objectType: objectType ?? this.objectType,
+        mediaId: mediaId ?? this.mediaId,
+        createdAt: createdAt ?? this.createdAt,
+      );
+  ObjectMediaItemsData copyWithCompanion(ObjectMediaItemsCompanion data) {
+    return ObjectMediaItemsData(
+      id: data.id.present ? data.id.value : this.id,
+      objectId: data.objectId.present ? data.objectId.value : this.objectId,
+      objectType:
+          data.objectType.present ? data.objectType.value : this.objectType,
+      mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId,
+      createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
+    );
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ObjectMediaItemsData(')
+          ..write('id: $id, ')
+          ..write('objectId: $objectId, ')
+          ..write('objectType: $objectType, ')
+          ..write('mediaId: $mediaId, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+
+  @override
+  int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt);
+  @override
+  bool operator ==(Object other) =>
+      identical(this, other) ||
+      (other is ObjectMediaItemsData &&
+          other.id == this.id &&
+          other.objectId == this.objectId &&
+          other.objectType == this.objectType &&
+          other.mediaId == this.mediaId &&
+          other.createdAt == this.createdAt);
+}
+
+class ObjectMediaItemsCompanion extends UpdateCompanion<ObjectMediaItemsData> {
+  final Value<int> id;
+  final Value<int> objectId;
+  final Value<String> objectType;
+  final Value<int> mediaId;
+  final Value<DateTime> createdAt;
+  const ObjectMediaItemsCompanion({
+    this.id = const Value.absent(),
+    this.objectId = const Value.absent(),
+    this.objectType = const Value.absent(),
+    this.mediaId = const Value.absent(),
+    this.createdAt = const Value.absent(),
+  });
+  ObjectMediaItemsCompanion.insert({
+    this.id = const Value.absent(),
+    required int objectId,
+    required String objectType,
+    required int mediaId,
+    this.createdAt = const Value.absent(),
+  })  : objectId = Value(objectId),
+        objectType = Value(objectType),
+        mediaId = Value(mediaId);
+  static Insertable<ObjectMediaItemsData> custom({
+    Expression<int>? id,
+    Expression<int>? objectId,
+    Expression<String>? objectType,
+    Expression<int>? mediaId,
+    Expression<DateTime>? createdAt,
+  }) {
+    return RawValuesInsertable({
+      if (id != null) 'id': id,
+      if (objectId != null) 'object_id': objectId,
+      if (objectType != null) 'object_type': objectType,
+      if (mediaId != null) 'media_id': mediaId,
+      if (createdAt != null) 'created_at': createdAt,
+    });
+  }
+
+  ObjectMediaItemsCompanion copyWith(
+      {Value<int>? id,
+      Value<int>? objectId,
+      Value<String>? objectType,
+      Value<int>? mediaId,
+      Value<DateTime>? createdAt}) {
+    return ObjectMediaItemsCompanion(
+      id: id ?? this.id,
+      objectId: objectId ?? this.objectId,
+      objectType: objectType ?? this.objectType,
+      mediaId: mediaId ?? this.mediaId,
+      createdAt: createdAt ?? this.createdAt,
+    );
+  }
+
+  @override
+  Map<String, Expression> toColumns(bool nullToAbsent) {
+    final map = <String, Expression>{};
+    if (id.present) {
+      map['id'] = Variable<int>(id.value);
+    }
+    if (objectId.present) {
+      map['object_id'] = Variable<int>(objectId.value);
+    }
+    if (objectType.present) {
+      map['object_type'] = Variable<String>(objectType.value);
+    }
+    if (mediaId.present) {
+      map['media_id'] = Variable<int>(mediaId.value);
+    }
+    if (createdAt.present) {
+      map['created_at'] = Variable<DateTime>(createdAt.value);
+    }
+    return map;
+  }
+
+  @override
+  String toString() {
+    return (StringBuffer('ObjectMediaItemsCompanion(')
+          ..write('id: $id, ')
+          ..write('objectId: $objectId, ')
+          ..write('objectType: $objectType, ')
+          ..write('mediaId: $mediaId, ')
+          ..write('createdAt: $createdAt')
+          ..write(')'))
+        .toString();
+  }
+}
+
+class DatabaseAtV35 extends GeneratedDatabase {
+  DatabaseAtV35(QueryExecutor e) : super(e);
+  late final Sessions sessions = Sessions(this);
+  late final Activities activities = Activities(this);
+  late final SessionActivities sessionActivities = SessionActivities(this);
+  late final Actions actions = Actions(this);
+  late final ActivityActions activityActions = ActivityActions(this);
+  late final MediaItems mediaItems = MediaItems(this);
+  late final ObjectMediaItems objectMediaItems = ObjectMediaItems(this);
+  @override
+  Iterable<TableInfo<Table, Object?>> get allTables =>
+      allSchemaEntities.whereType<TableInfo<Table, Object?>>();
+  @override
+  List<DatabaseSchemaEntity> get allSchemaEntities => [
+        sessions,
+        activities,
+        sessionActivities,
+        actions,
+        activityActions,
+        mediaItems,
+        objectMediaItems
+      ];
+  @override
+  int get schemaVersion => 35;
+}