feat: ship agent-first mission control v0.2.57
CI - Build & Test / Backend (.NET) (push) Successful in 42s
CI - Build & Test / Frontend (Vue/TS) (push) Successful in 2m46s
CI - Build & Test / Security Check (push) Successful in 3s
CI - Build & Test / Deploy Nexus (push) Successful in 56s

This commit is contained in:
AzuTear
2026-07-31 22:39:47 +02:00
parent 3bc7622977
commit f5552218bc
535 changed files with 95242 additions and 8791 deletions
@@ -51,9 +51,225 @@ namespace Nexus.Api.Migrations
b.HasIndex("TaskId");
b.HasIndex("TaskId", "CreatedAt", "Id")
.IsDescending(false, true, true)
.HasDatabaseName("IX_Activity_TaskId_CreatedAt_Id")
.HasFilter("\"TaskId\" IS NOT NULL");
b.ToTable("Activity");
});
modelBuilder.Entity("Nexus.Api.Data.AgentProposal", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("ApprovedBy")
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<DateTimeOffset?>("ApprovedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Avatar")
.HasMaxLength(2048)
.HasColumnType("character varying(2048)");
b.Property<DateTimeOffset?>("CompletedAt")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Description")
.HasMaxLength(4000)
.HasColumnType("character varying(4000)");
b.Property<string>("Emoji")
.HasMaxLength(32)
.HasColumnType("character varying(32)");
b.Property<string>("LastErrorCode")
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.Property<string>("LastErrorMessage")
.HasMaxLength(2000)
.HasColumnType("character varying(2000)");
b.Property<string>("Model")
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<string>("OpenClawAgentId")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<string>("OpenClawWorkspace")
.HasMaxLength(2048)
.HasColumnType("character varying(2048)");
b.Property<string>("RejectedBy")
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<DateTimeOffset?>("RejectedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("RejectionReason")
.HasMaxLength(1000)
.HasColumnType("character varying(1000)");
b.Property<string>("RequestedAgentId")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
b.Property<string>("RequestedBy")
.IsRequired()
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<string>("RequestedName")
.IsRequired()
.HasMaxLength(80)
.HasColumnType("character varying(80)");
b.Property<int>("Revision")
.IsConcurrencyToken()
.HasColumnType("integer");
b.Property<string>("Role")
.HasMaxLength(160)
.HasColumnType("character varying(160)");
b.Property<string>("Source")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<string>("StandardFilesHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
b.Property<string>("StandardFilesJson")
.IsRequired()
.HasColumnType("jsonb");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<DateTimeOffset>("UpdatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Workspace")
.IsRequired()
.HasMaxLength(2048)
.HasColumnType("character varying(2048)");
b.HasKey("Id");
b.HasIndex("OpenClawAgentId");
b.HasIndex("RequestedAgentId");
b.HasIndex("Status", "UpdatedAt");
b.ToTable("AgentProposals");
});
modelBuilder.Entity("Nexus.Api.Data.AgentProvisionRequest", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("Actor")
.IsRequired()
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<int>("Attempt")
.HasColumnType("integer");
b.Property<DateTimeOffset?>("CompletedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("CorrelationId")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset?>("DispatchStartedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("IdempotencyKeyHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
b.Property<string>("LastErrorCode")
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.Property<string>("LastErrorMessage")
.HasMaxLength(2000)
.HasColumnType("character varying(2000)");
b.Property<string>("LeaseOwner")
.HasMaxLength(160)
.HasColumnType("character varying(160)");
b.Property<DateTimeOffset?>("LeaseUntil")
.HasColumnType("timestamp with time zone");
b.Property<string>("OpenClawAgentId")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<Guid>("ProposalId")
.HasColumnType("uuid");
b.Property<int>("Revision")
.IsConcurrencyToken()
.HasColumnType("integer");
b.Property<string>("Stage")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<string>("TraceParent")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<DateTimeOffset>("UpdatedAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("LeaseUntil");
b.HasIndex("ProposalId", "Attempt")
.IsUnique();
b.HasIndex("Status", "CreatedAt");
b.ToTable("AgentProvisionRequests");
});
modelBuilder.Entity("Nexus.Api.Data.NexusUser", b =>
{
b.Property<Guid>("Id")
@@ -141,6 +357,370 @@ namespace Nexus.Api.Migrations
b.ToTable("Notifications");
});
modelBuilder.Entity("Nexus.Api.Data.OpenClawConnectionProfile", b =>
{
b.Property<string>("ProfileId")
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<DateTimeOffset?>("AdoptedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("AdoptionState")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<string>("CapabilityHash")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("DeviceId")
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<string>("DiscoverySource")
.IsRequired()
.HasMaxLength(80)
.HasColumnType("character varying(80)");
b.Property<string>("Endpoint")
.IsRequired()
.HasMaxLength(2048)
.HasColumnType("character varying(2048)");
b.Property<DateTimeOffset?>("LastProbedAt")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset?>("LastVerifiedAt")
.HasColumnType("timestamp with time zone");
b.Property<bool>("ManagementEnabled")
.HasColumnType("boolean");
b.Property<string>("RequiredVersion")
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.Property<int>("Revision")
.IsConcurrencyToken()
.HasColumnType("integer");
b.Property<string>("TlsCertificateFingerprint")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<DateTimeOffset>("UpdatedAt")
.HasColumnType("timestamp with time zone");
b.HasKey("ProfileId");
b.ToTable("OpenClawConnectionProfiles", null, t =>
{
t.HasCheckConstraint("CK_OpenClawConnectionProfiles_Primary", "\"ProfileId\" = 'primary'");
});
});
modelBuilder.Entity("Nexus.Api.Data.OpenClawRun", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<string>("Actor")
.IsRequired()
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<string>("AgentId")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)");
b.Property<string>("CorrelationId")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset?>("FinishedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("LastError")
.HasMaxLength(2000)
.HasColumnType("character varying(2000)");
b.Property<long?>("LastGatewaySequence")
.HasColumnType("bigint");
b.Property<string>("OpenClawRunId")
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<Guid?>("ProjectId")
.HasColumnType("uuid");
b.Property<string>("Prompt")
.IsRequired()
.HasColumnType("text");
b.Property<Guid?>("RetriedFromRunId")
.HasColumnType("uuid");
b.Property<int>("Revision")
.IsConcurrencyToken()
.HasColumnType("integer");
b.Property<bool>("SequenceGapDetected")
.HasColumnType("boolean");
b.Property<string>("SessionKey")
.IsRequired()
.HasMaxLength(500)
.HasColumnType("character varying(500)");
b.Property<string>("StartIdempotencyKey")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)");
b.Property<DateTimeOffset?>("StartedAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<Guid?>("TaskId")
.HasColumnType("uuid");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(160)
.HasColumnType("character varying(160)");
b.Property<string>("TraceParent")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<DateTimeOffset>("UpdatedAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("OpenClawRunId")
.IsUnique();
b.HasIndex("ProjectId");
b.HasIndex("RetriedFromRunId");
b.HasIndex("SessionKey");
b.HasIndex("StartIdempotencyKey")
.IsUnique();
b.HasIndex("TaskId");
b.HasIndex("Status", "UpdatedAt");
b.ToTable("OpenClawRuns");
});
modelBuilder.Entity("Nexus.Api.Data.OpenClawRunHistory", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id"));
b.Property<string>("Action")
.IsRequired()
.HasMaxLength(80)
.HasColumnType("character varying(80)");
b.Property<string>("Actor")
.IsRequired()
.HasMaxLength(240)
.HasColumnType("character varying(240)");
b.Property<string>("CorrelationId")
.IsRequired()
.HasMaxLength(200)
.HasColumnType("character varying(200)");
b.Property<string>("FromStatus")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<string>("GatewayEventId")
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.Property<long?>("GatewaySequence")
.HasColumnType("bigint");
b.Property<string>("IdempotencyKey")
.HasMaxLength(200)
.HasColumnType("character varying(200)");
b.Property<string>("Message")
.IsRequired()
.HasMaxLength(2000)
.HasColumnType("character varying(2000)");
b.Property<DateTimeOffset>("OccurredAt")
.HasColumnType("timestamp with time zone");
b.Property<Guid?>("ResultRunId")
.HasColumnType("uuid");
b.Property<Guid>("RunId")
.HasColumnType("uuid");
b.Property<bool>("SequenceGapDetected")
.HasColumnType("boolean");
b.Property<string>("ToStatus")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.Property<string>("TraceParent")
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.HasKey("Id");
b.HasIndex("GatewayEventId")
.IsUnique();
b.HasIndex("RunId", "OccurredAt");
b.HasIndex("RunId", "Action", "IdempotencyKey")
.IsUnique();
b.ToTable("OpenClawRunHistory");
});
modelBuilder.Entity("Nexus.Api.Data.OperationClaim", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
b.Property<DateTimeOffset?>("CompletedAt")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset>("CreatedAt")
.HasColumnType("timestamp with time zone");
b.Property<DateTimeOffset>("ExpiresAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("IdempotencyKeyHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
b.Property<string>("Operation")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)");
b.Property<string>("RequestHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
b.Property<Guid?>("ResourceId")
.HasColumnType("uuid");
b.Property<string>("ResultCode")
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.Property<string>("State")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("character varying(40)");
b.HasKey("Id");
b.HasIndex("ExpiresAt");
b.HasIndex("Operation", "IdempotencyKeyHash")
.IsUnique();
b.ToTable("OperationClaims");
});
modelBuilder.Entity("Nexus.Api.Data.OutboxEvent", b =>
{
b.Property<long>("Sequence")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Sequence"));
b.Property<string>("AggregateId")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<int>("AggregateRevision")
.HasColumnType("integer");
b.Property<string>("AggregateType")
.IsRequired()
.HasMaxLength(80)
.HasColumnType("character varying(80)");
b.Property<Guid>("EventId")
.HasColumnType("uuid");
b.Property<string>("LastErrorCode")
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.Property<DateTimeOffset>("OccurredAt")
.HasColumnType("timestamp with time zone");
b.Property<string>("PayloadJson")
.IsRequired()
.HasColumnType("jsonb");
b.Property<DateTimeOffset?>("PublishedAt")
.HasColumnType("timestamp with time zone");
b.Property<int>("PublishAttempts")
.HasColumnType("integer");
b.Property<string>("Type")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("character varying(120)");
b.HasKey("Sequence");
b.HasIndex("EventId")
.IsUnique();
b.HasIndex("OccurredAt");
b.HasIndex("PublishedAt", "Sequence");
b.ToTable("OutboxEvents");
});
modelBuilder.Entity("Nexus.Api.Data.Project", b =>
{
b.Property<Guid>("Id")
@@ -294,9 +874,51 @@ namespace Nexus.Api.Migrations
b.HasIndex("Source");
b.HasIndex("ExpectedFrom", "State", "UpdatedAt", "Id")
.IsDescending(false, false, true, false)
.HasDatabaseName("IX_Tasks_AgentWorkflow")
.HasFilter("\"IsAgentTask\" = TRUE");
b.HasIndex("ParentTaskId", "State")
.HasDatabaseName("IX_Tasks_ParentTaskId_State")
.HasFilter("\"ParentTaskId\" IS NOT NULL");
b.HasIndex("State", "UpdatedAt", "Id")
.IsDescending(false, true, false)
.HasDatabaseName("IX_Tasks_State_UpdatedAt_Id_Board");
b.HasIndex("UpdatedAt", "Id")
.IsDescending(true, true)
.HasDatabaseName("IX_Tasks_Done_UpdatedAt_Id")
.HasFilter("\"State\" = 'Done'");
b.ToTable("Tasks");
});
modelBuilder.Entity("Nexus.Api.Data.OpenClawRun", b =>
{
b.HasOne("Nexus.Api.Data.Project", null)
.WithMany()
.HasForeignKey("ProjectId")
.OnDelete(DeleteBehavior.SetNull);
b.HasOne("Nexus.Api.Data.WorkTask", null)
.WithMany()
.HasForeignKey("TaskId")
.OnDelete(DeleteBehavior.SetNull);
});
modelBuilder.Entity("Nexus.Api.Data.OpenClawRunHistory", b =>
{
b.HasOne("Nexus.Api.Data.OpenClawRun", "Run")
.WithMany("History")
.HasForeignKey("RunId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Run");
});
modelBuilder.Entity("Nexus.Api.Data.RefreshToken", b =>
{
b.HasOne("Nexus.Api.Data.NexusUser", "User")
@@ -323,6 +945,27 @@ namespace Nexus.Api.Migrations
b.Navigation("RefreshTokens");
});
modelBuilder.Entity("Nexus.Api.Data.AgentProposal", b =>
{
b.Navigation("ProvisionRequests");
});
modelBuilder.Entity("Nexus.Api.Data.AgentProvisionRequest", b =>
{
b.HasOne("Nexus.Api.Data.AgentProposal", "Proposal")
.WithMany("ProvisionRequests")
.HasForeignKey("ProposalId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Proposal");
});
modelBuilder.Entity("Nexus.Api.Data.OpenClawRun", b =>
{
b.Navigation("History");
});
modelBuilder.Entity("Nexus.Api.Data.WorkTask", b =>
{
b.Navigation("ChildTasks");