_original/WorkloadManager.ps1

# ============================================================
# WorkloadManager.ps1 v4.5
# Autor: Dante / SafeAutentic
#
# Controla WorkloadsSessionHost.exe en Copilot+ PCs
# Cada PID nuevo recibe 60 segundos de vida y luego se mata
# Compatible con Click to Do - Windows 11 24H2 / 25H2
# AMD Ryzen AI / Intel Lunar Lake / Snapdragon X
# ============================================================

$TIMER_VIDA     = 60   # segundos de vida por cada PID
$INTERVALO_LOOP = 6   # frecuencia de escaneo en segundos

New-EventLog -LogName Application -Source "WorkloadManager" -ErrorAction SilentlyContinue

function Write-WM ($msg, $id = 1000) {
    Write-EventLog -LogName Application -Source "WorkloadManager" `
        -EventId $id -EntryType Information -Message $msg -ErrorAction SilentlyContinue
}

$pidTimers = New-Object System.Collections.Generic.Dictionary"[string,datetime]"
Write-WM "WorkloadManager v4.5 iniciado. Timer: ${TIMER_VIDA}s / Intervalo: ${INTERVALO_LOOP}s" 1001

while ($true) {
    try {
        Start-Sleep -Seconds $INTERVALO_LOOP

        $ahora      = Get-Date
        $rawProcs   = @(Get-Process WorkloadsSessionHost -ErrorAction SilentlyContinue)
        $pidActivos = $rawProcs | ForEach-Object { "$($_.Id)" }

        # Limpiar PIDs que ya murieron solos
        $muertos = @($pidTimers.Keys | Where-Object { $pidActivos -notcontains $_ })
        foreach ($p in $muertos) { $pidTimers.Remove($p) }

        # Registrar nuevos y matar vencidos en un solo recorrido
        foreach ($p in $pidActivos) {
            if (-not $pidTimers.ContainsKey($p)) {
                $pidTimers[$p] = $ahora
                Write-WM "PID $p detectado. Timer: ${TIMER_VIDA}s" 1002
            } elseif (($ahora - $pidTimers[$p]).TotalSeconds -ge $TIMER_VIDA) {
                try {
                    $proc = Get-Process -Id ([int]$p) -ErrorAction Stop
                    $mb   = [math]::Round($proc.WorkingSet64 / 1MB)
                    Stop-Process -Id ([int]$p) -Force -ErrorAction Stop
                    Write-WM "PID $p terminado tras ${TIMER_VIDA}s (${mb}MB liberados)" 1003
                } catch {}
                $pidTimers.Remove($p)
            }
        }
    } catch {
        Write-WM "Error en ciclo: $_" 9001
        Start-Sleep -Seconds 5
    }
}