namespace Nexus.Api.Data;
///
/// Durable Nexus projection of one OpenClaw chat run. Nexus owns the
/// correlation and audit metadata; OpenClaw remains the execution authority.
///
public sealed class OpenClawRun
{
public Guid Id { get; init; } = Guid.NewGuid();
public required string Title { get; set; }
public required string Prompt { get; set; }
public required string AgentId { get; set; }
public required string SessionKey { get; set; }
public string Status { get; set; } = OpenClawRunStates.Dispatching;
public Guid? TaskId { get; set; }
public Guid? ProjectId { get; set; }
public string? OpenClawRunId { get; set; }
public Guid? RetriedFromRunId { get; set; }
public required string StartIdempotencyKey { get; set; }
public required string CorrelationId { get; set; }
public required string Actor { get; set; }
public string? TraceParent { get; set; }
public string? LastError { get; set; }
public long? LastGatewaySequence { get; set; }
public bool SequenceGapDetected { get; set; }
public int Revision { get; set; }
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? StartedAt { get; set; }
public DateTimeOffset? FinishedAt { get; set; }
public ICollection History { get; set; } = new List();
}
///
/// Append-only action and state-transition ledger for an OpenClaw run.
///
public sealed class OpenClawRunHistory
{
public long Id { get; init; }
public Guid RunId { get; set; }
public OpenClawRun Run { get; set; } = null!;
public required string Action { get; set; }
public required string FromStatus { get; set; }
public required string ToStatus { get; set; }
public required string Message { get; set; }
public required string Actor { get; set; }
public required string CorrelationId { get; set; }
public string? IdempotencyKey { get; set; }
public string? TraceParent { get; set; }
public string? GatewayEventId { get; set; }
public long? GatewaySequence { get; set; }
public bool SequenceGapDetected { get; set; }
public Guid? ResultRunId { get; set; }
public DateTimeOffset OccurredAt { get; set; } = DateTimeOffset.UtcNow;
}
public static class OpenClawRunStates
{
public const string Dispatching = "dispatching";
public const string Running = "running";
public const string Stopping = "stopping";
public const string Stopped = "stopped";
public const string Completed = "completed";
public const string Failed = "failed";
public const string Blocked = "blocked";
public const string Unsupported = "unsupported";
public static bool IsTerminal(string state)
=> state is Stopped or Completed or Failed or Blocked or Unsupported;
}