namespace WiBLL.Common; // Abstraction over the SignalR hub push (WiHub lives in WiSL — BLL must stay free of ASP.NET/ // SignalR types per CLAUDE.md). Concrete implementation: WiSL/EndPoints/Hubs/WiHubNotifier.cs, // wrapping IHubContext. Registered as a Singleton in WiModule.cs — mirrors // DXPBLL.Common.IDXPHubNotifier / DXPSL.Hubs.DXPHubNotifier exactly. // // Must never throw — a push failure is non-fatal to the underlying save that triggered it; the // implementation logs and swallows (same contract as IDXPHubNotifier's doc comment). public interface IWiHubNotifier { Task NotifyExecutionChangedAsync(int workStationId, int wiExecutionId, byte execStatus, CancellationToken ct = default); Task NotifyStaffingChangedAsync(int productionLineId, DateOnly shiftDate, int shiftId, CancellationToken ct = default); Task NotifyAllocationChangedAsync(int productionLineId, DateOnly shiftDate, int shiftId, CancellationToken ct = default); // Pushed to the LINE group, not the workstation group — Line Digital Twin (the only current // consumer) only ever joins wi:line:{id}, never a per-workstation group, same as staffing/ // allocation changes above. Task NotifyWorkstationOutageChangedAsync(int productionLineId, int workStationId, CancellationToken ct = default); }