core/public/Write-JaxRunHeader.ps1

function Write-JaxRunHeader {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string] $RepoRoot,
        [Parameter(Mandatory = $true)]
        [object] $SelectedEnv,
        [Parameter(Mandatory = $true)]
        [object] $FlowConfigEntry,
        [System.Collections.IDictionary] $Config,
        [System.Collections.IDictionary] $Resolved = @{}
    )

    # Quiet mode: skip the framed run-settings box entirely.
    if ($null -ne $Resolved -and $Resolved.Contains('quiet') -and [bool]$Resolved['quiet']) {
        $isOverride = $Resolved.Contains('noQuiet') -and [bool]$Resolved['noQuiet']
        $isVerbose = $VerbosePreference -eq 'Continue' -or $DebugPreference -eq 'Continue'
        if (-not $isOverride -and -not $isVerbose) { return }
    }

    $envName = $null
    if ($null -ne $SelectedEnv -and $SelectedEnv.PSObject.Properties.Match('Name').Count -gt 0) {
        $envName = [string]$SelectedEnv.Name
    }
    $flowName = $null
    if ($null -ne $FlowConfigEntry -and $FlowConfigEntry.PSObject.Properties.Match('Configuration').Count -gt 0) {
        $flowName = [string]$FlowConfigEntry.Configuration
    }
    if ([string]::IsNullOrWhiteSpace($flowName) -and $null -ne $FlowConfigEntry -and $FlowConfigEntry.PSObject.Properties.Match('Name').Count -gt 0) {
        $flowName = [string]$FlowConfigEntry.Name
    }

    # Set terminal tab title for supported interactive terminals (Ghostty/cmux etc.).
    # Never affects CI, Docker, redirected output, or non-supported terminals.
    try {
        $initialTitle = Get-JaxTabTitleForRun -EnvName $envName -FlowName $flowName
        if (-not [string]::IsNullOrWhiteSpace($initialTitle)) {
            Set-JaxTerminalTabTitle -Title $initialTitle
        }
    } catch {
        # best effort only
    }

    $gitBranch = $null
    $gitCommit = $null
    try {
        $gitBranch = (& git -C $RepoRoot rev-parse --abbrev-ref HEAD 2>$null)
        $gitCommit = (& git -C $RepoRoot rev-parse --short HEAD 2>$null)
    } catch {
        # ignore
    }
    if ($gitBranch) { $gitBranch = ([string]$gitBranch).Trim() }
    if ($gitCommit) { $gitCommit = ([string]$gitCommit).Trim() }

    $gout = $null
    if ($Resolved -and $Resolved.ContainsKey('gout')) {
        $gout = [string]$Resolved['gout']
    }

    $vaultState = 'unknown'
    try {
        if ($Config -and $Config.ContainsKey('plugins')) {
            $plugins = $Config['plugins']
            if ($plugins -is [System.Collections.IDictionary]) {
                $enabled = @()
                $disabled = @()
                if ($plugins.ContainsKey('enabled')) { $enabled = @($plugins['enabled']) }
                if ($plugins.ContainsKey('disabled')) { $disabled = @($plugins['disabled']) }
                if ($disabled -contains 'vault') { $vaultState = 'disabled' }
                elseif ($enabled -contains 'vault') { $vaultState = 'enabled' }
            }
        }
    } catch {
        # ignore
    }

    # CLI/state override: allow -vault/-novault to temporarily flip vault behavior without modifying config.
    try {
        if ($Resolved -and $Resolved.ContainsKey('vaultEnabledOverride') -and $Resolved['vaultEnabledOverride'] -is [bool]) {
            $vaultState = if ([bool]$Resolved['vaultEnabledOverride']) { 'enabled' } else { 'disabled' }
        } elseif ($Resolved -and $Resolved.ContainsKey('novault') -and [bool]$Resolved['novault']) {
            $vaultState = 'disabled'
        } elseif ($Resolved -and $Resolved.ContainsKey('vault') -and [bool]$Resolved['vault']) {
            $vaultState = 'enabled'
        }
    } catch {
        # ignore
    }

    Write-Host ''
    Write-Host '┌─── 🏃 Run settings ───'
    if (-not [string]::IsNullOrWhiteSpace($envName)) {
        if (-not [string]::IsNullOrWhiteSpace($flowName)) {
            Write-Host ("│ 📜 Env: {0} [{1}]" -f $envName, $flowName)
        } else {
            Write-Host ("│ 📜 Env: {0}" -f $envName)
        }
    }
    if (-not [string]::IsNullOrWhiteSpace($gout)) {
        Write-Host ("│ 🍰 Gout: {0}" -f $gout)
    }
    if (-not [string]::IsNullOrWhiteSpace($gitBranch) -or -not [string]::IsNullOrWhiteSpace($gitCommit)) {
        $gitText = if ($gitBranch -and $gitCommit) { "🌿 $gitBranch (commit '$gitCommit')" } elseif ($gitBranch) { "🌿 $gitBranch" } else { "commit '$gitCommit'" }
        Write-Host ("│ 🐙 Git: {0}" -f $gitText)
    }
    Write-Host ("│ 🔐 Vault: {0}" -f $vaultState)
    Write-Host '└──────────────────────'
    Write-Host ''
}