Public/Invoke-DATRemovePackages.ps1

function Invoke-DATRemovePackages {
    <#
    .SYNOPSIS
        Removes one or more DAT-managed packages from ConfigMgr with optional source cleanup.
    .DESCRIPTION
        Public wrapper around Remove-DATLegacyPackage intended for use in background runspaces.
        Establishes a ConfigMgr connection then removes each specified package in sequence,
        returning a result object per package so callers can report success/failure.
    .PARAMETER SiteServer
        The ConfigMgr site server FQDN.
    .PARAMETER SiteCode
        The ConfigMgr site code.
    .PARAMETER UseSSL
        Use WinRM over SSL.
    .PARAMETER Packages
        Array of hashtables with keys 'ID' (PackageID) and 'Name' (display name).
    .PARAMETER CleanSource
        Also remove the source content directory for each package.
    .OUTPUTS
        Array of hashtables: { ID, Name, Status ('Success'|'Failed'), Error }
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$SiteServer,

        [string]$SiteCode,

        [switch]$UseSSL,

        [Parameter(Mandatory)]
        [hashtable[]]$Packages,

        [switch]$CleanSource
    )

    $ConnectParams = @{ SiteServer = $SiteServer }
    if ($SiteCode) { $ConnectParams['SiteCode'] = $SiteCode }
    if ($UseSSL)   { $ConnectParams['UseSSL']   = $true }

    Connect-DATConfigMgr @ConnectParams

    $Results = [System.Collections.Generic.List[hashtable]]::new()
    foreach ($Pkg in $Packages) {
        try {
            Remove-DATLegacyPackage -PackageID $Pkg.ID -CleanSource:$CleanSource
            $Results.Add(@{ ID = $Pkg.ID; Name = $Pkg.Name; Status = 'Success' })
        } catch {
            $Results.Add(@{ ID = $Pkg.ID; Name = $Pkg.Name; Status = 'Failed'; Error = $_.Exception.Message })
        }
    }

    return $Results.ToArray()
}