Multi-agent AI laboratory with ASP.NET Core 8.0 backend and Flutter frontend. Implements CQRS architecture, OpenAPI contract-first API design. BACKEND: Agent management, conversations, executions with PostgreSQL + Ollama FRONTEND: Cross-platform UI with strict typing and Result-based error handling Co-Authored-By: Jean-Philippe Brule <jp@svrnty.io>
379 lines
13 KiB
C#
379 lines
13 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using System.Text.Json;
|
|
using Codex.Dal;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Migrations;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
|
|
#nullable disable
|
|
|
|
namespace Codex.Dal.Migrations
|
|
{
|
|
[DbContext(typeof(CodexDbContext))]
|
|
[Migration("20251026190533_InitialAgentSchema")]
|
|
partial class InitialAgentSchema
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder
|
|
.HasAnnotation("ProductVersion", "8.0.11")
|
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
|
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.Agent", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("ApiKeyEncrypted")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<int>("ConversationWindowSize")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Description")
|
|
.IsRequired()
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)");
|
|
|
|
b.Property<bool>("EnableMemory")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<bool>("IsDeleted")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<int>("MaxTokens")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<string>("ModelEndpoint")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)");
|
|
|
|
b.Property<string>("ModelName")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)");
|
|
|
|
b.Property<string>("ModelProvider")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<int>("ProviderType")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<int>("Status")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<string>("SystemPrompt")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.Property<double>("Temperature")
|
|
.HasColumnType("double precision");
|
|
|
|
b.Property<int>("Type")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<DateTime>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Type");
|
|
|
|
b.HasIndex("Status", "IsDeleted");
|
|
|
|
b.ToTable("Agents");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.AgentExecution", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<Guid>("AgentId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime?>("CompletedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid?>("ConversationId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("ErrorMessage")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<decimal?>("EstimatedCost")
|
|
.HasPrecision(18, 6)
|
|
.HasColumnType("numeric(18,6)");
|
|
|
|
b.Property<long?>("ExecutionTimeMs")
|
|
.HasColumnType("bigint");
|
|
|
|
b.Property<string>("Input")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<int?>("InputTokens")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<string>("Output")
|
|
.IsRequired()
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("text")
|
|
.HasDefaultValue("");
|
|
|
|
b.Property<int?>("OutputTokens")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<DateTime>("StartedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<int>("Status")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<string>("ToolCallResults")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("ToolCalls")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<int?>("TotalTokens")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<string>("UserPrompt")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("ConversationId");
|
|
|
|
b.HasIndex("Status");
|
|
|
|
b.HasIndex("AgentId", "StartedAt")
|
|
.IsDescending(false, true);
|
|
|
|
b.ToTable("AgentExecutions");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.AgentTool", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<Guid>("AgentId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("ApiBaseUrl")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)");
|
|
|
|
b.Property<string>("ApiKeyEncrypted")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<JsonDocument>("Configuration")
|
|
.HasColumnType("jsonb");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<bool>("IsEnabled")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<string>("McpAuthTokenEncrypted")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("McpServerUrl")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)");
|
|
|
|
b.Property<string>("ToolName")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)");
|
|
|
|
b.Property<int>("Type")
|
|
.HasColumnType("integer");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Type");
|
|
|
|
b.HasIndex("AgentId", "IsEnabled");
|
|
|
|
b.ToTable("AgentTools");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.Conversation", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<DateTime>("LastMessageAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<int>("MessageCount")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<DateTime>("StartedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Summary")
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("character varying(2000)");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("IsActive", "LastMessageAt")
|
|
.IsDescending(false, true);
|
|
|
|
b.ToTable("Conversations");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.ConversationMessage", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Content")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.Property<Guid>("ConversationId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTime>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<Guid?>("ExecutionId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<bool>("IsInActiveWindow")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<int>("MessageIndex")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<int>("Role")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<int?>("TokenCount")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<string>("ToolCalls")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("ToolResults")
|
|
.HasColumnType("text");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("ExecutionId");
|
|
|
|
b.HasIndex("Role");
|
|
|
|
b.HasIndex("ConversationId", "MessageIndex");
|
|
|
|
b.HasIndex("ConversationId", "IsInActiveWindow", "MessageIndex");
|
|
|
|
b.ToTable("ConversationMessages");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.AgentExecution", b =>
|
|
{
|
|
b.HasOne("Codex.Dal.Entities.Agent", "Agent")
|
|
.WithMany("Executions")
|
|
.HasForeignKey("AgentId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Codex.Dal.Entities.Conversation", "Conversation")
|
|
.WithMany("Executions")
|
|
.HasForeignKey("ConversationId")
|
|
.OnDelete(DeleteBehavior.SetNull);
|
|
|
|
b.Navigation("Agent");
|
|
|
|
b.Navigation("Conversation");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.AgentTool", b =>
|
|
{
|
|
b.HasOne("Codex.Dal.Entities.Agent", "Agent")
|
|
.WithMany("Tools")
|
|
.HasForeignKey("AgentId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Agent");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.ConversationMessage", b =>
|
|
{
|
|
b.HasOne("Codex.Dal.Entities.Conversation", "Conversation")
|
|
.WithMany("Messages")
|
|
.HasForeignKey("ConversationId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Codex.Dal.Entities.AgentExecution", "Execution")
|
|
.WithMany("Messages")
|
|
.HasForeignKey("ExecutionId")
|
|
.OnDelete(DeleteBehavior.SetNull);
|
|
|
|
b.Navigation("Conversation");
|
|
|
|
b.Navigation("Execution");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.Agent", b =>
|
|
{
|
|
b.Navigation("Executions");
|
|
|
|
b.Navigation("Tools");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.AgentExecution", b =>
|
|
{
|
|
b.Navigation("Messages");
|
|
});
|
|
|
|
modelBuilder.Entity("Codex.Dal.Entities.Conversation", b =>
|
|
{
|
|
b.Navigation("Executions");
|
|
|
|
b.Navigation("Messages");
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|