# artemistest — instaleaza agentul subtire Artemis pe Windows. # # irm https://artemis2.katolab.ro/artemistest.ps1 | iex # # Merge la fel de pe http://10.11.90.169:8088/ sau http://vpn.katolab.ro:8088/. # # Fata de varianta de dinainte, pe calculatorul asta raman doar: fereastra, cele cinci # unelte care ating discul local si ecranul de aprobare. Bucla agentului, promptul, # definitiile uneltelor, conversatiile, knowledge base-ul, cautarea web si SSH-ul stau # pe serverul de AI. # # Legatura o deschide agentul catre server, deci NU trebuie deschis niciun port pe # calculatorul tau si nu trebuie umblat la firewall. Folosirea e la fel ca inainte. # # Poate citi fisiere text si Office, PDF-uri (inclusiv scanate), imagini si clipuri # video, din care scoate si transcrierea vorbirii. Prelucrarea se face pe server; # fisierul pleaca de aici printr-un POST, deci tot fara porturi deschise. # # Ruleaz-o din nou oricand ca sa actualizezi. function Install-ArtemisTest { $ProgressPreference = 'SilentlyContinue' try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 } catch {} # Trei drumuri spre acelasi server, incercate in ordine: reteaua (rapida, cand esti # pe VPN sau in birou), DDNS-ul redirectionat pe router, apoi intrarile prin proxy # manager: artemis2.katolab.ro pentru fisiere (:8088) si artemis1.katolab.ro pentru # aplicatie (:7788). Deci laptopul merge si dinauntru, si de afara, fara sa schimbi nimic. $fisiere = @('http://10.11.90.169:8088', 'http://vpn.katolab.ro:8088', 'https://artemis2.katolab.ro') $implicite = @('http://10.11.90.169:7788', 'http://vpn.katolab.ro:7788', 'https://artemis1.katolab.ro') function Prima-Care-Raspunde([string[]]$adrese, [string]$cale, [int]$sec = 5) { foreach ($a in $adrese) { try { Invoke-WebRequest -Uri "$a$cale" -TimeoutSec $sec -UseBasicParsing | Out-Null return $a } catch {} } return $null } # de unde se descarca binarul (portul 8088) $srv = if ($env:ARTEMIS_SRV) { $env:ARTEMIS_SRV } else { $g = Prima-Care-Raspunde $fisiere '/artemistest.ps1' if ($g) { $g } else { $fisiere[-1] } } # adresele aplicatiei (portul 7788). Clientul le primeste pe TOATE, separate prin # virgula, si le incearca la fiecare reconectare -- deci nu trebuie reinstalat cand # te muti de pe retea afara sau invers. # # ATENTIE la ordinea de aici: o instalare mai veche a lasat deja ARTEMIS_SERVER setat # pe o singura adresa, iar daca il luam de-a gata, actualizarea nu adauga NICIODATA # rezerva -- exact asa a ramas un laptop fara legatura in afara retelei. Deci pornim # de la ce exista (ca sa nu pierdem o adresa pusa de mana) si COMPLETAM cu ce lipseste. $lista = @() if ($env:ARTEMIS_SERVER) { foreach ($a in ($env:ARTEMIS_SERVER -split ',')) { $a = $a.Trim() if ($a -and $lista -notcontains $a) { $lista += $a } } } foreach ($a in $implicite) { if ($lista -notcontains $a) { $lista += $a } } $listaApp = $lista -join ',' $serverApp = $lista[0] # LOCALAPPDATA exista pe Windows; rezerva e pentru pwsh pe alt sistem $baza = if ($env:LOCALAPPDATA) { $env:LOCALAPPDATA } else { Join-Path $HOME '.local/share' } $temp = if ($env:TEMP) { $env:TEMP } else { '/tmp' } $dir = Join-Path $baza 'ArtemisTest' $bin = Join-Path $dir 'artemistest.exe' function ok($m) { Write-Host " [ok] $m" -ForegroundColor Green } function rau($m) { Write-Host " [nu] $m" -ForegroundColor Red } function info($m) { Write-Host " $m" -ForegroundColor DarkGray } Write-Host "== Artemis (agent subtire) ==" -ForegroundColor Cyan # ---- 1. raspunde serverul Artemis? ---- $active = @() foreach ($a in ($listaApp -split ',')) { $a = $a.Trim() if (-not $a) { continue } try { $s = Invoke-RestMethod -Uri "$a/sanatate" -TimeoutSec 8 ok "serverul Artemis raspunde la $a ($($s.clienti) agenti conectati)" $active += $a } catch { info "nu ajung la $a" } } if ($active.Count -eq 0) { rau "nu ajung la server pe niciuna dintre adrese" info "esti pe VPN, sau merge redirectionarea de pe router?" info "agentul se instaleaza oricum si se reconecteaza singur cand serverul revine." } else { # Cele care raspund ACUM trec in fata: daca instalezi de afara, aplicatia porneste # direct pe adresa publica, fara sa astepte intai o incercare in gol pe cea interna. # Ordinea se reaseaza oricum singura la fiecare reconectare. $rest = @() foreach ($a in $lista) { if ($active -notcontains $a) { $rest += $a } } $lista = @($active) + $rest $listaApp = $lista -join ',' $serverApp = $lista[0] if ($active.Count -eq 1) { info "merge doar $($active[0]); celelalte raman ca rezerva" } } info "descarc de la: $srv" # ---- 2. WebView2: motorul ferestrei ---- $w1 = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' $w2 = 'HKCU:\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' if (-not $IsWindows -and $null -ne $IsWindows) { info "nu sunt pe Windows: sar peste WebView2 (test)" } elseif ((Test-Path $w1) -or (Test-Path $w2)) { ok "WebView2 prezent" } else { info "instalez WebView2 (motorul ferestrei)..." try { $s = Join-Path $temp 'MicrosoftEdgeWebview2Setup.exe' Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/p/?LinkId=2124703' -OutFile $s -TimeoutSec 300 Start-Process -FilePath $s -ArgumentList '/silent','/install' -Wait Remove-Item $s -ErrorAction SilentlyContinue ok "WebView2 instalat" } catch { rau "nu am putut instala WebView2: $_" } } # ---- 3. agentul ---- New-Item -ItemType Directory -Force -Path $dir | Out-Null Get-Process artemistest -ErrorAction SilentlyContinue | ForEach-Object { $_.Kill(); info "am oprit instanta care rula" } Start-Sleep -Milliseconds 700 try { Invoke-WebRequest -Uri "$srv/artemistest.exe" -OutFile "$bin.nou" -TimeoutSec 600 Move-Item "$bin.nou" $bin -Force ok "instalat: $bin ($([math]::Round((Get-Item $bin).Length / 1MB, 1)) MB)" } catch { rau "nu am putut descarca agentul: $_"; return } # adresa serverului se retine pentru pornirile urmatoare [Environment]::SetEnvironmentVariable('ARTEMIS_SERVER', $listaApp, 'User') # ---- 4. scurtaturi ---- try { $ws = New-Object -ComObject WScript.Shell foreach ($loc in @( (Join-Path ([Environment]::GetFolderPath('Desktop')) 'Artemis.lnk'), (Join-Path ([Environment]::GetFolderPath('StartMenu')) 'Programs\Artemis.lnk') )) { New-Item -ItemType Directory -Force -Path (Split-Path $loc) | Out-Null $sc = $ws.CreateShortcut($loc) $sc.TargetPath = $bin $sc.WorkingDirectory = $dir $sc.Description = 'Agent Artemis — logica sta pe serverul de AI' $sc.Save() } ok "scurtaturi pe desktop si in meniul Start" } catch { info "nu am putut face scurtaturile: $_" } Write-Host "" ok "gata — pornesc Artemis" info "pe calculatorul asta: fereastra + 5 unelte locale + aprobarile" info "pe server: bucla, promptul, uneltele de retea, conversatiile, knowledge base" info "niciun port deschis aici: agentul suna el serverul" Write-Host "" info "la prima pornire iti faci cont: nume, utilizator, parola, cine esti," info "cu ce te ocupi si ce reguli vrei sa respecte. Le stie apoi in fiecare" info "conversatie noua. Stau pe server, deci o reinstalare nu le pierde." Write-Host "" info "serverul poate tine mai multe conturi. Conversatiile fiecaruia sunt" info "criptate cu parola lui, deci nimeni altcineva nu le poate citi -- dar" info "nici tu daca pierzi parola, fiindca nu exista recuperare." Write-Host "" info "poate citi PDF-uri (si scanate), imagini si clipuri video, din care" info "transcrie si ce se vorbeste." Write-Host "" $env:ARTEMIS_SERVER = $listaApp Start-Process -FilePath $bin -WorkingDirectory $dir } Install-ArtemisTest