using System.Text.Json.Serialization; namespace Aryx.AgentHost.Contracts; public sealed class PatternAgentDefinitionDto { public string Id { get; init; } = string.Empty; public string Name { get; init; } = string.Empty; public string Description { get; init; } = string.Empty; public string Instructions { get; init; } = string.Empty; public string Model { get; init; } = string.Empty; public string? ReasoningEffort { get; init; } } public sealed class PatternGraphPositionDto { public double X { get; init; } public double Y { get; init; } } public sealed class PatternGraphNodeDto { public string Id { get; init; } = string.Empty; public string Kind { get; init; } = string.Empty; public PatternGraphPositionDto Position { get; init; } = new(); public string? AgentId { get; init; } public int? Order { get; init; } } public sealed class PatternGraphEdgeDto { public string Id { get; init; } = string.Empty; public string Source { get; init; } = string.Empty; public string Target { get; init; } = string.Empty; } public sealed class PatternGraphDto { public IReadOnlyList Nodes { get; init; } = []; public IReadOnlyList Edges { get; init; } = []; } public sealed class PatternDefinitionDto { public string Id { get; init; } = string.Empty; public string Name { get; init; } = string.Empty; public string Description { get; init; } = string.Empty; public string Mode { get; init; } = string.Empty; public string Availability { get; init; } = "available"; public string? UnavailabilityReason { get; init; } public int MaxIterations { get; init; } public ApprovalPolicyDto? ApprovalPolicy { get; init; } public IReadOnlyList Agents { get; init; } = []; public PatternGraphDto? Graph { get; init; } public string CreatedAt { get; init; } = string.Empty; public string UpdatedAt { get; init; } = string.Empty; } public sealed class ApprovalPolicyDto { public IReadOnlyList Rules { get; init; } = []; public IReadOnlyList AutoApprovedToolNames { get; init; } = []; } public sealed class ApprovalCheckpointRuleDto { public string Kind { get; init; } = string.Empty; public IReadOnlyList AgentIds { get; init; } = []; } public sealed class ChatMessageDto { public string Id { get; init; } = string.Empty; public string Role { get; init; } = string.Empty; public string AuthorName { get; init; } = string.Empty; public string Content { get; init; } = string.Empty; public string CreatedAt { get; init; } = string.Empty; } public sealed class PatternValidationIssueDto { public string Level { get; init; } = "error"; public string? Field { get; init; } public string Message { get; init; } = string.Empty; } public sealed class SidecarModeCapabilityDto { public bool Available { get; init; } public string? Reason { get; init; } } public sealed class SidecarModelCapabilityDto { public string Id { get; init; } = string.Empty; public string Name { get; init; } = string.Empty; public IReadOnlyList SupportedReasoningEfforts { get; init; } = []; public string? DefaultReasoningEffort { get; init; } } public sealed class SidecarRuntimeToolDto { public string Id { get; init; } = string.Empty; public string Label { get; init; } = string.Empty; public string? Description { get; init; } } public sealed class SidecarConnectionDiagnosticsDto { public string Status { get; init; } = "copilot-error"; public string Summary { get; init; } = string.Empty; public string? Detail { get; init; } public string? CopilotCliPath { get; init; } public SidecarCopilotCliVersionDiagnosticsDto? CopilotCliVersion { get; init; } public SidecarCopilotAccountDiagnosticsDto? Account { get; init; } public string CheckedAt { get; init; } = string.Empty; } public sealed class SidecarCopilotCliVersionDiagnosticsDto { public string Status { get; init; } = "unknown"; public string? InstalledVersion { get; init; } public string? LatestVersion { get; init; } public string? Detail { get; init; } } public sealed class SidecarCopilotAccountDiagnosticsDto { public bool Authenticated { get; init; } public string? Login { get; init; } public string? Host { get; init; } public string? AuthType { get; init; } public string? StatusMessage { get; init; } public IReadOnlyList? Organizations { get; init; } } public sealed class SidecarCapabilitiesDto { public string Runtime { get; init; } = "dotnet-maf"; public Dictionary Modes { get; init; } = new(StringComparer.OrdinalIgnoreCase); public IReadOnlyList Models { get; init; } = []; public IReadOnlyList RuntimeTools { get; init; } = []; public SidecarConnectionDiagnosticsDto Connection { get; init; } = new(); } public class SidecarCommandEnvelope { public string Type { get; init; } = string.Empty; public string RequestId { get; init; } = string.Empty; } public sealed class DescribeCapabilitiesCommandDto : SidecarCommandEnvelope; public sealed class ValidatePatternCommandDto : SidecarCommandEnvelope { public PatternDefinitionDto Pattern { get; init; } = new(); } public sealed class RunTurnCommandDto : SidecarCommandEnvelope { public string SessionId { get; init; } = string.Empty; public string ProjectPath { get; init; } = string.Empty; public string WorkspaceKind { get; init; } = "project"; public string Mode { get; init; } = "interactive"; public PatternDefinitionDto Pattern { get; init; } = new(); public IReadOnlyList Messages { get; init; } = []; public RunTurnToolingConfigDto? Tooling { get; init; } } public sealed class CancelTurnCommandDto : SidecarCommandEnvelope { public string TargetRequestId { get; init; } = string.Empty; } public sealed class ResolveApprovalCommandDto : SidecarCommandEnvelope { public string ApprovalId { get; init; } = string.Empty; public string Decision { get; init; } = string.Empty; public bool AlwaysApprove { get; init; } } public sealed class ResolveUserInputCommandDto : SidecarCommandEnvelope { public string UserInputId { get; init; } = string.Empty; public string Answer { get; init; } = string.Empty; public bool WasFreeform { get; init; } } public sealed class RunTurnToolingConfigDto { public IReadOnlyList McpServers { get; init; } = []; public IReadOnlyList LspProfiles { get; init; } = []; } public sealed class RunTurnMcpServerConfigDto { public string Id { get; init; } = string.Empty; public string Name { get; init; } = string.Empty; public string Transport { get; init; } = "local"; public IReadOnlyList Tools { get; init; } = []; public int? TimeoutMs { get; init; } public string? Command { get; init; } public IReadOnlyList? Args { get; init; } public IReadOnlyDictionary? Env { get; init; } public string? Cwd { get; init; } public string? Url { get; init; } public IReadOnlyDictionary? Headers { get; init; } } public sealed class RunTurnLspProfileConfigDto { public string Id { get; init; } = string.Empty; public string Name { get; init; } = string.Empty; public string Command { get; init; } = string.Empty; public IReadOnlyList Args { get; init; } = []; public string LanguageId { get; init; } = string.Empty; public IReadOnlyList FileExtensions { get; init; } = []; } public abstract class SidecarEventDto { public string Type { get; init; } = string.Empty; public string RequestId { get; init; } = string.Empty; } public sealed class CapabilitiesEventDto : SidecarEventDto { public SidecarCapabilitiesDto Capabilities { get; init; } = new(); } public sealed class PatternValidationEventDto : SidecarEventDto { public IReadOnlyList Issues { get; init; } = []; } public sealed class TurnDeltaEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public string MessageId { get; init; } = string.Empty; public string AuthorName { get; init; } = string.Empty; public string ContentDelta { get; init; } = string.Empty; public string? Content { get; init; } } public sealed class TurnCompleteEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public IReadOnlyList Messages { get; init; } = []; public bool Cancelled { get; init; } } public sealed class AgentActivityEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public string ActivityType { get; init; } = string.Empty; public string? AgentId { get; init; } public string? AgentName { get; init; } public string? SourceAgentId { get; init; } public string? SourceAgentName { get; init; } public string? ToolName { get; init; } } public sealed class PermissionDetailDto { public string Kind { get; init; } = string.Empty; public string? Intention { get; init; } public string? Command { get; init; } public string? Warning { get; init; } public IReadOnlyList? PossiblePaths { get; init; } public IReadOnlyList? PossibleUrls { get; init; } public bool? HasWriteFileRedirection { get; init; } public string? FileName { get; init; } public string? Diff { get; init; } public string? NewFileContents { get; init; } public string? Path { get; init; } public string? ServerName { get; init; } public string? ToolTitle { get; init; } public object? Args { get; init; } public bool? ReadOnly { get; init; } public string? Url { get; init; } public string? Subject { get; init; } public string? Fact { get; init; } public string? Citations { get; init; } public string? ToolDescription { get; init; } public string? HookMessage { get; init; } } public sealed class ApprovalRequestedEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public string ApprovalId { get; init; } = string.Empty; public string ApprovalKind { get; init; } = string.Empty; public string? AgentId { get; init; } public string? AgentName { get; init; } public string? ToolName { get; init; } public string? PermissionKind { get; init; } public string Title { get; init; } = string.Empty; public string? Detail { get; init; } public PermissionDetailDto? PermissionDetail { get; init; } } public sealed class UserInputRequestedEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public string UserInputId { get; init; } = string.Empty; public string? AgentId { get; init; } public string? AgentName { get; init; } public string Question { get; init; } = string.Empty; public IReadOnlyList? Choices { get; init; } public bool? AllowFreeform { get; init; } } public sealed class McpOauthStaticClientConfigDto { public string ClientId { get; init; } = string.Empty; public bool? PublicClient { get; init; } } public sealed class McpOauthRequiredEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public string OauthRequestId { get; init; } = string.Empty; public string? AgentId { get; init; } public string? AgentName { get; init; } public string ServerName { get; init; } = string.Empty; public string ServerUrl { get; init; } = string.Empty; public McpOauthStaticClientConfigDto? StaticClientConfig { get; init; } } public sealed class ExitPlanModeRequestedEventDto : SidecarEventDto { public string SessionId { get; init; } = string.Empty; public string ExitPlanId { get; init; } = string.Empty; public string? AgentId { get; init; } public string? AgentName { get; init; } public string Summary { get; init; } = string.Empty; public string PlanContent { get; init; } = string.Empty; public IReadOnlyList? Actions { get; init; } public string? RecommendedAction { get; init; } } public sealed class CommandErrorEventDto : SidecarEventDto { public string Message { get; init; } = string.Empty; } public sealed class CommandCompleteEventDto : SidecarEventDto;