Spinner.ps1

# 加载动画:后台线程旋转字符指示器(winget 风格 |/-\ 青色)
# 权限解释:spinner 用 System.Threading.Timer 后台线程回调写屏,
# PowerShell scriptblock 跨线程调用不安全,回调必须是纯 .NET 代码;Console.Write 内部自带锁,跨线程安全。
# 重定向判断放在 PS 层(Invoke-WithSpinner),C# 只负责真实终端下的写屏,不判断重定向。

# 后台 spinner 已独立到 ClaudeCodeTask.Core(预编译 dll);Timer 后台线程回调需纯 .NET 代码
if (-not ('CctSpinner' -as [type])) {
    Add-Type -Path (Join-Path $PSScriptRoot 'lib\ClaudeCodeTask.Core.dll')
}

# PS 封装:控制台未重定向时启动 spinner,否则直接跑脚本(零输出)
# ScriptBlock 的返回值(含管道输出)原样透传
function Invoke-WithSpinner {
    param(
        [string]$Text,
        [scriptblock]$ScriptBlock,
        [int]$AutoStopMs = 8000
    )
    if ([Console]::IsOutputRedirected) {
        return & $ScriptBlock
    }
    $timer = [CctSpinner]::Start($Text, 100, $AutoStopMs)
    try {
        return & $ScriptBlock
    } finally {
        [CctSpinner]::Stop($timer)
    }
}