Private/Get-IdleAvailableCapabilities.ps1

Set-StrictMode -Version Latest

function Get-IdleAvailableCapabilities {
    <#
    .SYNOPSIS
    Aggregates capabilities from all providers.

    .DESCRIPTION
    Collects capabilities from all provider instances and returns a unique sorted list.
    Uses the simpler nested helper version of Get-IdleProviderCapabilities that directly
    calls GetCapabilities() without inference logic.
    #>

    [CmdletBinding()]
    param(
        [Parameter()]
        [AllowNull()]
        [object] $Providers
    )

    function Get-ProviderCapabilitiesSimple {
        <#
        .SYNOPSIS
        Gets the capability list advertised by a provider (simplified version).

        .DESCRIPTION
        Providers are expected to expose a GetCapabilities() method.
        If not present, the provider is treated as advertising no capabilities.
        This is the planning-time version without inference logic.
        #>

        [CmdletBinding()]
        param(
            [Parameter()]
            [AllowNull()]
            [object] $Provider
        )

        if ($null -eq $Provider) {
            return @()
        }

        if ($Provider.PSObject.Methods.Name -contains 'GetCapabilities') {
            $caps = $Provider.GetCapabilities()
            if ($null -eq $caps) {
                return @()
            }
            return @(ConvertTo-IdleCapabilityList -Capabilities $caps -Normalize -Unique)
        }

        return @()
    }

    $providerInstances = @(Get-IdleProvidersFromMap -Providers $Providers)

    $caps = @()
    foreach ($p in $providerInstances) {
        $caps += @(Get-ProviderCapabilitiesSimple -Provider $p)
    }

    return @($caps | Sort-Object -Unique)
}