File: Auxiliary\NativeAuxiliaryDataTypes.cs
Web Access
Project: src\src\Aspire.Hosting.Native.Server\Aspire.Hosting.Native.Server.csproj (Aspire.Hosting.Native.Server)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using System.Text.Json.Serialization;
 
namespace Aspire.Hosting.Native.Auxiliary;
 
// BCL-only subsets of BackchannelDataTypes.cs. No ATS annotations: this is the existing
// Hosting/CLI wire contract, not an extension to the generated native integration API.
internal sealed record NativeAuxiliaryEmptyRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
}
internal sealed record NativeAuxiliaryTraceContext(string? TraceParent, string? TraceState, Dictionary<string, string>? Baggage);
internal sealed record NativeAuxiliaryResourcesRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public string? Filter { get; init; }
    public string[] ClientCapabilities { get; init; } = [];
}
internal sealed record NativeAuxiliaryLogsRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public string? ResourceName { get; init; }
    public bool Follow { get; init; }
    public string? Search { get; init; }
    public int? Tail { get; init; }
    public bool IncludeHidden { get; init; }
}
internal sealed record NativeAuxiliaryCommandRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public required string ResourceName { get; init; }
    public required string CommandName { get; init; }
    public JsonElement? Arguments { get; init; }
    public bool ValidateOnly { get; init; }
    public bool NonInteractive { get; init; } = true;
    public bool ReturnArgumentInputs { get; init; }
}
internal sealed record NativeAuxiliaryWaitRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public required string ResourceName { get; init; }
    public required string Status { get; init; }
    public int TimeoutSeconds { get; init; } = 120;
}
internal sealed record NativeAuxiliaryMcpRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public required string ResourceName { get; init; }
    public required string ToolName { get; init; }
    public JsonElement? Arguments { get; init; }
}
internal sealed record NativeAuxiliaryTerminalRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public required string ResourceName { get; init; }
}
internal sealed record NativeAuxiliaryStopRequest
{
    public NativeAuxiliaryTraceContext? TraceContext { get; init; }
    public int? ExitCode { get; init; }
}
internal sealed record NativeAuxiliaryCapabilities(string[] Capabilities);
internal sealed record NativeAuxiliaryAppHostInformation
{
    public required string AppHostPath { get; init; }
    public int ProcessId { get; init; }
    public int? CliProcessId { get; init; }
    public DateTimeOffset? StartedAt { get; init; }
    public DateTimeOffset? StableStartedAt { get; init; }
    public DateTimeOffset? CliStartedAt { get; init; }
    public DateTimeOffset? CliStableStartedAt { get; init; }
    public string? CliLogFilePath { get; init; }
}
internal sealed record NativeAuxiliaryAppHostInfo(string Pid, string AspireHostVersion, string AppHostPath,
    int? CliProcessId, DateTimeOffset? StartedAt, string? CliLogFilePath);
internal sealed record NativeAuxiliaryDashboardInfo(string? ApiBaseUrl, string? ApiToken, string[] DashboardUrls, bool IsHealthy);
internal sealed record NativeAuxiliaryReady(bool IsReady);
internal sealed record NativeAuxiliaryResources(NativeAuxiliaryResourceSnapshot[] Resources);
internal sealed record NativeAuxiliaryEmptyResponse;
internal sealed record NativeAuxiliaryCommandResponse
{
    public required bool Success { get; init; }
    public bool Canceled { get; init; }
    public string? ErrorMessage { get; init; }
    public string? Message { get; init; }
    public NativeAuxiliaryCommandResult? Value { get; init; }
    public NativeAuxiliaryValidationError[] ValidationErrors { get; init; } = [];
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
    public NativeAuxiliaryCommandArgument[]? ArgumentInputs { get; init; }
}
internal sealed record NativeAuxiliaryCommandResult(string Value, string Format, bool DisplayImmediately);
internal sealed record NativeAuxiliaryValidationError(string ArgumentName, string ErrorMessage);
internal sealed record NativeAuxiliaryWaitResponse
{
    public required bool Success { get; init; }
    public string? State { get; init; }
    public string? HealthStatus { get; init; }
    public bool ResourceNotFound { get; init; }
    public bool TimedOut { get; init; }
    public string? ErrorMessage { get; init; }
}
internal sealed record NativeAuxiliaryTerminalInfo(bool IsAvailable = false, string? SocketPath = null,
    int Columns = 0, int Rows = 0, NativeAuxiliaryEmptyResponse[]? Replicas = null);
internal sealed record NativeAuxiliaryTerminals
{
    public NativeAuxiliaryEmptyResponse[] ResourceTerminals { get; init; } = [];
    public NativeAuxiliaryEmptyResponse[] AppHostTerminals { get; init; } = [];
}
internal sealed record NativeAuxiliaryLogLine(string ResourceName, int LineNumber, string Content, bool IsError);
internal sealed record NativeAuxiliaryLogBatch(NativeAuxiliaryLogLine[] Lines);
internal sealed record NativeAuxiliaryResourceSnapshot
{
    public required string Name { get; init; }
    public long Version { get; init; }
    public string? DisplayName { get; init; }
    public string? ResourceType { get; init; }
    public string? Type => ResourceType;
    public string? State { get; init; }
    public string[]? WaitingFor { get; init; }
    public string? StateStyle { get; init; }
    public string? HealthStatus { get; init; }
    public int? ExitCode { get; init; }
    public DateTimeOffset? CreatedAt { get; init; }
    public DateTimeOffset? StartedAt { get; init; }
    public DateTimeOffset? StoppedAt { get; init; }
    public NativeAuxiliaryUrl[] Urls { get; init; } = [];
    public NativeAuxiliaryRelationship[] Relationships { get; init; } = [];
    public NativeAuxiliaryHealthReport[] HealthReports { get; init; } = [];
    public NativeAuxiliaryVolume[] Volumes { get; init; } = [];
    public NativeAuxiliaryEnvironmentVariable[] EnvironmentVariables { get; init; } = [];
    public Dictionary<string, JsonElement> Properties { get; init; } = [];
    public bool IsHidden { get; init; }
    public NativeAuxiliaryEmptyResponse? McpServer { get; init; }
    public NativeAuxiliaryCommand[] Commands { get; init; } = [];
}
internal sealed record NativeAuxiliaryUrl(string Name, string Url, bool IsInternal = false,
    NativeAuxiliaryUrlDisplayProperties? DisplayProperties = null);
internal sealed record NativeAuxiliaryUrlDisplayProperties(string? DisplayName, int SortOrder);
internal sealed record NativeAuxiliaryRelationship(string ResourceName, string Type);
internal sealed record NativeAuxiliaryHealthReport(string Name, string? Description, string? Status, string? ExceptionText);
internal sealed record NativeAuxiliaryVolume(string? Source, string Target, string MountType, bool IsReadOnly);
internal sealed record NativeAuxiliaryEnvironmentVariable(string Name, string? Value, bool IsFromSpec);
internal sealed record NativeAuxiliaryCommand
{
    public required string Name { get; init; }
    public string? DisplayName { get; init; }
    public string? Description { get; init; }
    public NativeAuxiliaryCommandArgument[] ArgumentInputs { get; init; } = [];
    public string Visibility { get; init; } = "UI, Api";
    public required string State { get; init; }
}
// Native commands have no argument declarations. This named type keeps the empty arrays
// extensible without pulling managed command execution or interaction implementations into AOT.
internal sealed record NativeAuxiliaryCommandArgument(string Name, string InputType);
 
[JsonSerializable(typeof(NativeAuxiliaryEmptyRequest))]
[JsonSerializable(typeof(NativeAuxiliaryResourcesRequest))]
[JsonSerializable(typeof(NativeAuxiliaryLogsRequest))]
[JsonSerializable(typeof(NativeAuxiliaryCommandRequest))]
[JsonSerializable(typeof(NativeAuxiliaryWaitRequest))]
[JsonSerializable(typeof(NativeAuxiliaryMcpRequest))]
[JsonSerializable(typeof(NativeAuxiliaryTerminalRequest))]
[JsonSerializable(typeof(NativeAuxiliaryStopRequest))]
[JsonSerializable(typeof(NativeAuxiliaryCapabilities))]
[JsonSerializable(typeof(NativeAuxiliaryAppHostInformation))]
[JsonSerializable(typeof(NativeAuxiliaryAppHostInfo))]
[JsonSerializable(typeof(NativeAuxiliaryDashboardInfo))]
[JsonSerializable(typeof(NativeAuxiliaryReady))]
[JsonSerializable(typeof(NativeAuxiliaryResources))]
[JsonSerializable(typeof(NativeAuxiliaryResourceSnapshot[]))]
[JsonSerializable(typeof(NativeAuxiliaryResourceSnapshot))]
[JsonSerializable(typeof(NativeAuxiliaryCommandResponse))]
[JsonSerializable(typeof(NativeAuxiliaryWaitResponse))]
[JsonSerializable(typeof(NativeAuxiliaryEmptyResponse))]
[JsonSerializable(typeof(NativeAuxiliaryTerminalInfo))]
[JsonSerializable(typeof(NativeAuxiliaryTerminals))]
[JsonSerializable(typeof(NativeAuxiliaryLogLine))]
[JsonSerializable(typeof(NativeAuxiliaryLogBatch))]
[JsonSerializable(typeof(long))]
[JsonSerializable(typeof(string))]
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
    PropertyNameCaseInsensitive = true, RespectNullableAnnotations = true)]
internal sealed partial class NativeAuxiliaryJsonContext : JsonSerializerContext;