# Instalador do Cialai para Windows. # # irm https://cialai.com.br/install.ps1 | iex # # No cmd, a mesma linha entra pelo PowerShell: # # powershell -c "irm https://cialai.com.br/install.ps1 | iex" # # Baixa Cialai_x64-setup.exe e o SHA256SUMS.txt de https://cialai.com.br/downloads, confere a soma com Get-FileHash e # abre o instalador. O Windows 11 em ARM roda a versão x64 por emulação. CIALAI_BASE_URL aponta para outro espelho. # Tudo fica em funções e só a última linha executa, então um download cortado no meio não roda nada. Os erros param # com throw, nunca com exit, para não fechar o PowerShell de quem colou o comando. function Assert-CialaiWindows { if ($PSVersionTable.PSEdition -eq 'Core' -and -not $IsWindows) { throw 'Este instalador é para Windows. No Linux e no Mac, rode: curl -fsSL https://cialai.com.br/install.sh | bash' } # Um PowerShell de 32 bits num Windows de 64 bits informa a arquitetura real em PROCESSOR_ARCHITEW6432. $arch = $env:PROCESSOR_ARCHITEW6432 if (-not $arch) { $arch = $env:PROCESSOR_ARCHITECTURE } if ($arch -ne 'AMD64' -and $arch -ne 'ARM64') { throw "O Cialai para Windows é publicado para x64, e esta máquina é $arch." } } # A linha do SHA256SUMS.txt segue o formato do sha256sum: a soma, dois espaços e o nome do arquivo. function Get-CialaiExpectedHash { param([Parameter(Mandatory = $true)][string]$Sums, [Parameter(Mandatory = $true)][string]$Name) foreach ($line in Get-Content -LiteralPath $Sums) { if ($line -match '^([0-9a-fA-F]{64}) (\S+)$' -and $Matches[2] -eq $Name) { return $Matches[1].ToLowerInvariant() } } throw "O SHA256SUMS.txt não tem $Name." } # Baixa o instalador para a pasta informada e só devolve o caminho depois de conferir a soma. function Save-CialaiInstaller { param([Parameter(Mandatory = $true)][string]$BaseUrl, [Parameter(Mandatory = $true)][string]$Directory) $name = 'Cialai_x64-setup.exe' $version = '' try { $latest = Join-Path $Directory 'latest.json' Invoke-WebRequest -UseBasicParsing -Uri "$BaseUrl/latest.json" -OutFile $latest $version = (Get-Content -LiteralPath $latest -Raw | ConvertFrom-Json).version } catch { $version = '' } $sums = Join-Path $Directory 'SHA256SUMS.txt' Invoke-WebRequest -UseBasicParsing -Uri "$BaseUrl/SHA256SUMS.txt" -OutFile $sums $expected = Get-CialaiExpectedHash -Sums $sums -Name $name if ($version) { Write-Host "Baixando o Cialai $version, $name" } else { Write-Host "Baixando $name" } $file = Join-Path $Directory $name Invoke-WebRequest -UseBasicParsing -Uri "$BaseUrl/$name" -OutFile $file $actual = (Get-FileHash -Algorithm SHA256 -LiteralPath $file).Hash.ToLowerInvariant() if ($actual -ne $expected) { throw "A soma SHA256 de $name não confere. Nada foi instalado." } Write-Host 'Soma SHA256 conferida' return $file } function Install-Cialai { $ErrorActionPreference = 'Stop' # A barra de progresso do Windows PowerShell deixa o download muitas vezes mais lento. $ProgressPreference = 'SilentlyContinue' Assert-CialaiWindows [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 $base = $env:CIALAI_BASE_URL if (-not $base) { $base = 'https://cialai.com.br/downloads' } $base = $base.TrimEnd('/') $dir = Join-Path ([IO.Path]::GetTempPath()) ('cialai-' + [guid]::NewGuid().ToString('N')) New-Item -ItemType Directory -Path $dir | Out-Null try { Write-Host 'Cialai, instalador para Windows' $installer = Save-CialaiInstaller -BaseUrl $base -Directory $dir Write-Host 'Abrindo o instalador' # Espera só o instalador. Com -Wait, o Windows PowerShell esperaria também o Cialai que ele abre no fim. $process = Start-Process -FilePath $installer -PassThru $null = $process.Handle $process.WaitForExit() if ($process.ExitCode -ne 0) { throw "O instalador foi fechado antes de concluir, com o código $($process.ExitCode)." } } finally { Remove-Item -LiteralPath $dir -Recurse -Force -ErrorAction SilentlyContinue } Write-Host '' Write-Host 'Cialai instalado. Abra pelo menu Iniciar.' } Install-Cialai