using System.Collections.Generic;
namespace SHH.ProcessLaunchers
{
///
/// 进程启动配置项
///
public class ProcessConfig
{
#region --- 身份标识 (Identity) ---
//
/// [核心变更] 唯一标识符 (Key)
/// 用于管理器内部索引,不可重复。例如: "Streamer_01", "Streamer_02"
///
public string Id { get; set; } = string.Empty;
///
/// [核心变更] 通用显示名称 (Category/Type)
/// 描述这是一类什么程序。例如: "VideoStreamingService"
/// 多个实例可以拥有相同的 DisplayName。
///
public string DisplayName { get; set; } = string.Empty;
///
/// 描述备注 (可选)
/// 例如: "负责处理 192.168.1.10 的视频流"
///
public string Description { get; set; } = string.Empty;
#endregion
#region --- 启动参数 (Launch Args) ---
/// 可执行文件路径 (绝对路径或相对路径)
public string ExePath { get; set; } = string.Empty;
/// 启动参数字符串 (例如 "--id=1 --debug")
public string Arguments { get; set; } = string.Empty;
/// 工作目录 (默认为 Exe 所在目录)
public string WorkingDirectory { get; set; } = string.Empty;
#endregion
#region --- 表现层配置 ---
///
/// 是否显示程序窗口
/// True: 弹出控制台窗口或UI | False: 后台静默运行 (CreateNoWindow=true)
///
public bool Visible { get; set; } = false;
///
/// 是否接管标准输出/错误流 (RedirectStandardOutput)
/// True: 启动器将捕获 Console.WriteLine 内容并通过日志接口转发。
/// 注意: 如果 Visible=true,建议设为 false,否则控制台窗口将是黑屏。
///
public bool EnableLogRedirect { get; set; } = true;
#endregion
#region --- 守护策略配置 ---
/// 意外退出后的常规重启延迟 (毫秒),默认 3000ms
public int RestartDelayMs { get; set; } = 3000;
/// 连续失败阈值 (达到此次数后触发熔断),默认 3 次
public int MaxConsecutiveFailures { get; set; } = 3;
/// 熔断冷却时长 (毫秒),默认 30分钟 (1800000ms)
public int CircuitBreakerDelayMs { get; set; } = 30 * 60 * 1000;
///
/// 稳定运行判定阈值 (毫秒)
/// 如果进程存活时间超过此值,则视为启动成功,重置失败计数器。
///
public int StabilityThresholdMs { get; set; } = 60 * 1000;
///
/// 自动重启间隔 (分钟)。0 表示不启用定时重启。
/// 用于防止内存碎片或长期运行的不稳定性。
///
public int AutoRestartIntervalMinutes { get; set; } = 0;
#endregion
#region --- 排序启动 ---
///
/// [新增] 启动顺序权重
/// 数字越小越先启动 (0, 1, 2...)
///
public int StartupOrder { get; set; } = 0;
///
/// [新增] 启动后等待时长 (毫秒)
/// 当前进程启动后,等待多久再启动下一个进程。用于防止瞬间 CPU 峰值或依赖等待。
///
public int PostStartupDelayMs { get; set; } = 3000;
#endregion
/// 资源哨兵列表 (内存监控、心跳监控等)
public List Guards { get; set; } = new List();
}
}