Added mailboxes as local data sources (#1022)
Build and Release / Determine run mode (push) Waiting to run
Build and Release / Read metadata (push) Blocked by required conditions
Build and Release / Sync Flatpak repo (push) Blocked by required conditions
Build and Release / Collect Flatpak artifacts (push) Blocked by required conditions
Build and Release / Verify (push) Waiting to run
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Prepare & create release (push) Blocked by required conditions
Build and Release / Publish release (push) Blocked by required conditions

This commit is contained in:
Thorsten Sommer authored and GitHub committed 2026-10-04 12:26:26 +02:00
1 parent 93be539e50
commit c4400c0ff6
343 files changed
+26051 -3122

No files matched your search

@@ -0,0 +1,251 @@
#nullable disable
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
namespace AIStudio.Tools.Databases.IndexStore.Migrations;
/// <summary>
/// Adds what the index keeps about mailboxes beyond the text of their mails.
/// </summary>
/// <remarks>
/// Every mail is a row in embedded_files like any document, so search, chunks and full-text index
/// stay the same for both. These tables hold what only a mail has: its addresses, its parts, the
/// folders and places it lies in, and how far the sync of each mailbox got. All of them go with
/// their data source, except mailbox_auth_state: a refused sign-in has to survive a rebuild.
/// </remarks>
[DbContext(typeof(IndexStoreDbContext))]
[Migration("20261001000000_MailboxIndex")]
public partial class MailboxIndex : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "mail_messages",
columns: table => new
{
parent_file_id = table.Column<string>(type: "TEXT", nullable: false),
data_source_id = table.Column<string>(type: "TEXT", nullable: false),
message_id = table.Column<string>(type: "TEXT", nullable: false),
in_reply_to = table.Column<string>(type: "TEXT", nullable: false),
reference_message_ids = table.Column<string>(type: "TEXT", nullable: false),
sent_at_utc = table.Column<string>(type: "TEXT", nullable: true),
received_at_utc = table.Column<string>(type: "TEXT", nullable: false),
importance = table.Column<string>(type: "TEXT", nullable: false),
encryption_kind = table.Column<string>(type: "TEXT", nullable: false),
mail_hash = table.Column<string>(type: "TEXT", nullable: false),
first_seen_utc = table.Column<string>(type: "TEXT", nullable: false),
orphaned_at_utc = table.Column<string>(type: "TEXT", nullable: true),
},
constraints: table =>
{
table.PrimaryKey("PK_mail_messages", mail => mail.parent_file_id);
table.ForeignKey(
name: "FK_mail_messages_data_sources_data_source_id",
column: mail => mail.data_source_id,
principalTable: "data_sources",
principalColumn: "data_source_id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_mail_messages_embedded_files_parent_file_id",
column: mail => mail.parent_file_id,
principalTable: "embedded_files",
principalColumn: "parent_file_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "mail_folders",
columns: table => new
{
id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
data_source_id = table.Column<string>(type: "TEXT", nullable: false),
path = table.Column<string>(type: "TEXT", nullable: false),
special_use = table.Column<string>(type: "TEXT", nullable: false),
uid_validity = table.Column<long>(type: "INTEGER", nullable: false),
uid_next = table.Column<long>(type: "INTEGER", nullable: true),
highest_mod_seq = table.Column<long>(type: "INTEGER", nullable: true),
server_message_count = table.Column<long>(type: "INTEGER", nullable: true),
server_unseen_count = table.Column<long>(type: "INTEGER", nullable: true),
initial_sync_completed_utc = table.Column<string>(type: "TEXT", nullable: true),
},
constraints: table =>
{
table.PrimaryKey("PK_mail_folders", folder => folder.id);
table.ForeignKey(
name: "FK_mail_folders_data_sources_data_source_id",
column: folder => folder.data_source_id,
principalTable: "data_sources",
principalColumn: "data_source_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "mail_addresses",
columns: table => new
{
id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
parent_file_id = table.Column<string>(type: "TEXT", nullable: false),
role = table.Column<string>(type: "TEXT", nullable: false),
position = table.Column<int>(type: "INTEGER", nullable: false),
address = table.Column<string>(type: "TEXT", nullable: false, collation: "NOCASE"),
display_name = table.Column<string>(type: "TEXT", nullable: false),
},
constraints: table =>
{
table.PrimaryKey("PK_mail_addresses", address => address.id);
table.ForeignKey(
name: "FK_mail_addresses_mail_messages_parent_file_id",
column: address => address.parent_file_id,
principalTable: "mail_messages",
principalColumn: "parent_file_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "mail_parts",
columns: table => new
{
id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
parent_file_id = table.Column<string>(type: "TEXT", nullable: false),
kind = table.Column<string>(type: "TEXT", nullable: false),
position = table.Column<int>(type: "INTEGER", nullable: false),
name = table.Column<string>(type: "TEXT", nullable: false),
content_type = table.Column<string>(type: "TEXT", nullable: false),
part_size = table.Column<long>(type: "INTEGER", nullable: false),
text = table.Column<string>(type: "TEXT", nullable: true),
text_state = table.Column<string>(type: "TEXT", nullable: false),
},
constraints: table =>
{
table.PrimaryKey("PK_mail_parts", part => part.id);
table.ForeignKey(
name: "FK_mail_parts_mail_messages_parent_file_id",
column: part => part.parent_file_id,
principalTable: "mail_messages",
principalColumn: "parent_file_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "mail_locations",
columns: table => new
{
id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
parent_file_id = table.Column<string>(type: "TEXT", nullable: false),
folder_id = table.Column<int>(type: "INTEGER", nullable: false),
uid = table.Column<long>(type: "INTEGER", nullable: false),
is_seen = table.Column<bool>(type: "INTEGER", nullable: false),
is_flagged = table.Column<bool>(type: "INTEGER", nullable: false),
is_answered = table.Column<bool>(type: "INTEGER", nullable: false),
},
constraints: table =>
{
table.PrimaryKey("PK_mail_locations", location => location.id);
table.ForeignKey(
name: "FK_mail_locations_mail_folders_folder_id",
column: location => location.folder_id,
principalTable: "mail_folders",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_mail_locations_mail_messages_parent_file_id",
column: location => location.parent_file_id,
principalTable: "mail_messages",
principalColumn: "parent_file_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "mailbox_sync_state",
columns: table => new
{
data_source_id = table.Column<string>(type: "TEXT", nullable: false),
last_sync_completed_utc = table.Column<string>(type: "TEXT", nullable: true),
pending_removal_count = table.Column<int>(type: "INTEGER", nullable: true),
pending_removal_approved_utc = table.Column<string>(type: "TEXT", nullable: true),
},
constraints: table =>
{
table.PrimaryKey("PK_mailbox_sync_state", state => state.data_source_id);
table.ForeignKey(
name: "FK_mailbox_sync_state_data_sources_data_source_id",
column: state => state.data_source_id,
principalTable: "data_sources",
principalColumn: "data_source_id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "mailbox_auth_state",
columns: table => new
{
data_source_id = table.Column<string>(type: "TEXT", nullable: false),
failed_at_utc = table.Column<string>(type: "TEXT", nullable: false),
failure_message = table.Column<string>(type: "TEXT", nullable: false),
},
constraints: table =>
{
table.PrimaryKey("PK_mailbox_auth_state", state => state.data_source_id);
});
migrationBuilder.CreateIndex(
name: "idx_mail_messages_data_source_message_id",
table: "mail_messages",
columns: ["data_source_id", "message_id"]);
migrationBuilder.CreateIndex(
name: "idx_mail_messages_data_source_received",
table: "mail_messages",
columns: ["data_source_id", "received_at_utc"]);
migrationBuilder.CreateIndex(
name: "idx_mail_folders_data_source_path",
table: "mail_folders",
columns: ["data_source_id", "path"],
unique: true);
migrationBuilder.CreateIndex(
name: "idx_mail_addresses_address",
table: "mail_addresses",
column: "address");
migrationBuilder.CreateIndex(
name: "idx_mail_addresses_parent_file_role_position",
table: "mail_addresses",
columns: ["parent_file_id", "role", "position"],
unique: true);
migrationBuilder.CreateIndex(
name: "idx_mail_parts_parent_file_kind_position",
table: "mail_parts",
columns: ["parent_file_id", "kind", "position"],
unique: true);
migrationBuilder.CreateIndex(
name: "idx_mail_locations_folder_uid",
table: "mail_locations",
columns: ["folder_id", "uid"],
unique: true);
migrationBuilder.CreateIndex(
name: "idx_mail_locations_parent_file",
table: "mail_locations",
column: "parent_file_id");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "mailbox_auth_state");
migrationBuilder.DropTable(name: "mailbox_sync_state");
migrationBuilder.DropTable(name: "mail_locations");
migrationBuilder.DropTable(name: "mail_parts");
migrationBuilder.DropTable(name: "mail_addresses");
migrationBuilder.DropTable(name: "mail_folders");
migrationBuilder.DropTable(name: "mail_messages");
}
}
@@ -315,6 +315,325 @@ partial class IndexStoreDbContextModelSnapshot : ModelSnapshot
entity.ToView("embedding_chunk_search_results");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailAddressEntity", entity =>
{
entity.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("id")
.HasAnnotation("Sqlite:Autoincrement", true);
entity.Property<string>("Address")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("address")
.UseCollation("NOCASE");
entity.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("display_name");
entity.Property<string>("ParentFileId")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("parent_file_id");
entity.Property<int>("Position")
.HasColumnType("INTEGER")
.HasColumnName("position");
entity.Property<string>("Role")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("role");
entity.HasKey("Id");
entity.HasIndex("Address")
.HasDatabaseName("idx_mail_addresses_address");
entity.HasIndex("ParentFileId", "Role", "Position")
.IsUnique()
.HasDatabaseName("idx_mail_addresses_parent_file_role_position");
entity.ToTable("mail_addresses");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailFolderEntity", entity =>
{
entity.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("id")
.HasAnnotation("Sqlite:Autoincrement", true);
entity.Property<string>("DataSourceId")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("data_source_id");
entity.Property<long?>("HighestModSeq")
.HasColumnType("INTEGER")
.HasColumnName("highest_mod_seq");
entity.Property<DateTimeOffset?>("InitialSyncCompletedUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("initial_sync_completed_utc");
entity.Property<string>("Path")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("path");
entity.Property<long?>("ServerMessageCount")
.HasColumnType("INTEGER")
.HasColumnName("server_message_count");
entity.Property<long?>("ServerUnseenCount")
.HasColumnType("INTEGER")
.HasColumnName("server_unseen_count");
entity.Property<string>("SpecialUse")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("special_use");
entity.Property<long?>("UidNext")
.HasColumnType("INTEGER")
.HasColumnName("uid_next");
entity.Property<long>("UidValidity")
.HasColumnType("INTEGER")
.HasColumnName("uid_validity");
entity.HasKey("Id");
entity.HasIndex("DataSourceId", "Path")
.IsUnique()
.HasDatabaseName("idx_mail_folders_data_source_path");
entity.ToTable("mail_folders");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailLocationEntity", entity =>
{
entity.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("id")
.HasAnnotation("Sqlite:Autoincrement", true);
entity.Property<int>("FolderId")
.HasColumnType("INTEGER")
.HasColumnName("folder_id");
entity.Property<bool>("IsAnswered")
.HasColumnType("INTEGER")
.HasColumnName("is_answered");
entity.Property<bool>("IsFlagged")
.HasColumnType("INTEGER")
.HasColumnName("is_flagged");
entity.Property<bool>("IsSeen")
.HasColumnType("INTEGER")
.HasColumnName("is_seen");
entity.Property<string>("ParentFileId")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("parent_file_id");
entity.Property<long>("Uid")
.HasColumnType("INTEGER")
.HasColumnName("uid");
entity.HasKey("Id");
entity.HasIndex("ParentFileId")
.HasDatabaseName("idx_mail_locations_parent_file");
entity.HasIndex("FolderId", "Uid")
.IsUnique()
.HasDatabaseName("idx_mail_locations_folder_uid");
entity.ToTable("mail_locations");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", entity =>
{
entity.Property<string>("ParentFileId")
.HasColumnType("TEXT")
.HasColumnName("parent_file_id");
entity.Property<string>("DataSourceId")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("data_source_id");
entity.Property<string>("EncryptionKind")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("encryption_kind");
entity.Property<DateTimeOffset>("FirstSeenUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("first_seen_utc");
entity.Property<string>("Importance")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("importance");
entity.Property<string>("InReplyTo")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("in_reply_to");
entity.Property<string>("MailHash")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("mail_hash");
entity.Property<string>("MessageId")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("message_id");
entity.Property<DateTimeOffset?>("OrphanedAtUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("orphaned_at_utc");
entity.Property<DateTimeOffset>("ReceivedAtUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("received_at_utc");
entity.Property<string>("ReferenceMessageIds")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("reference_message_ids");
entity.Property<DateTimeOffset?>("SentAtUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("sent_at_utc");
entity.HasKey("ParentFileId");
entity.HasIndex("DataSourceId", "MessageId")
.HasDatabaseName("idx_mail_messages_data_source_message_id");
entity.HasIndex("DataSourceId", "ReceivedAtUtc")
.HasDatabaseName("idx_mail_messages_data_source_received");
entity.ToTable("mail_messages");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailPartEntity", entity =>
{
entity.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasColumnName("id")
.HasAnnotation("Sqlite:Autoincrement", true);
entity.Property<string>("ContentType")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("content_type");
entity.Property<string>("Kind")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("kind");
entity.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("name");
entity.Property<string>("ParentFileId")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("parent_file_id");
entity.Property<long>("PartSize")
.HasColumnType("INTEGER")
.HasColumnName("part_size");
entity.Property<int>("Position")
.HasColumnType("INTEGER")
.HasColumnName("position");
entity.Property<string>("Text")
.HasColumnType("TEXT")
.HasColumnName("text");
entity.Property<string>("TextState")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("text_state");
entity.HasKey("Id");
entity.HasIndex("ParentFileId", "Kind", "Position")
.IsUnique()
.HasDatabaseName("idx_mail_parts_parent_file_kind_position");
entity.ToTable("mail_parts");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailboxAuthStateEntity", entity =>
{
entity.Property<string>("DataSourceId")
.HasColumnType("TEXT")
.HasColumnName("data_source_id");
entity.Property<DateTimeOffset>("FailedAtUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("failed_at_utc");
entity.Property<string>("FailureMessage")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("failure_message");
entity.HasKey("DataSourceId");
entity.ToTable("mailbox_auth_state");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailboxSyncStateEntity", entity =>
{
entity.Property<string>("DataSourceId")
.HasColumnType("TEXT")
.HasColumnName("data_source_id");
entity.Property<DateTimeOffset?>("LastSyncCompletedUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("last_sync_completed_utc");
entity.Property<DateTimeOffset?>("PendingRemovalApprovedUtc")
.HasConversion(utcDateTimeOffsetConverter)
.HasColumnType("TEXT")
.HasColumnName("pending_removal_approved_utc");
entity.Property<int?>("PendingRemovalCount")
.HasColumnType("INTEGER")
.HasColumnName("pending_removal_count");
entity.HasKey("DataSourceId");
entity.ToTable("mailbox_sync_state");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.EmbeddingStateFileEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.EmbeddingStateDataSourceEntity", "DataSource")
@@ -348,6 +667,80 @@ partial class IndexStoreDbContextModelSnapshot : ModelSnapshot
entity.Navigation("DataSource");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailAddressEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", "Message")
.WithMany("Addresses")
.HasForeignKey("ParentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
entity.Navigation("Message");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailFolderEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.EmbeddingStateDataSourceEntity", null)
.WithMany()
.HasForeignKey("DataSourceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailLocationEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.MailFolderEntity", "Folder")
.WithMany("Locations")
.HasForeignKey("FolderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
entity.HasOne("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", "Message")
.WithMany("Locations")
.HasForeignKey("ParentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
entity.Navigation("Folder");
entity.Navigation("Message");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.EmbeddingStateDataSourceEntity", null)
.WithMany()
.HasForeignKey("DataSourceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
entity.HasOne("AIStudio.Tools.Databases.IndexStore.EmbeddingStateFileEntity", null)
.WithOne()
.HasForeignKey("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", "ParentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailPartEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", "Message")
.WithMany("Parts")
.HasForeignKey("ParentFileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
entity.Navigation("Message");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailboxSyncStateEntity", entity =>
{
entity.HasOne("AIStudio.Tools.Databases.IndexStore.EmbeddingStateDataSourceEntity", null)
.WithOne()
.HasForeignKey("AIStudio.Tools.Databases.IndexStore.MailboxSyncStateEntity", "DataSourceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.EmbeddingStateDataSourceEntity", entity =>
{
entity.Navigation("Files");
@@ -359,6 +752,20 @@ partial class IndexStoreDbContextModelSnapshot : ModelSnapshot
{
entity.Navigation("Chunks");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailFolderEntity", entity =>
{
entity.Navigation("Locations");
});
modelBuilder.Entity("AIStudio.Tools.Databases.IndexStore.MailMessageEntity", entity =>
{
entity.Navigation("Addresses");
entity.Navigation("Locations");
entity.Navigation("Parts");
});
#pragma warning restore 612, 618
}
}