Skip to main content
Glama
README.md
# Fleet

Wszystkie Twoje komputery jako jedna flota. Zdalny dostęp z przeglądarki i MCP, przez które Claude steruje Twoimi maszynami: komendy, pliki, instalacje, ekran, mysz, klawiatura i zadania równoległe.

**Zero zależności.** Wystarczy Node.js ≥ 22.13 (wbudowany SQLite i WebSocket).

**Chmura:** https://fleet-cloud.onrender.com · **npm:** [`@xeniak/fleet`](https://www.npmjs.com/package/@xeniak/fleet)

```bash
npx @xeniak/fleet up        # na każdej maszynie; kod dołączenia wygenerujesz w panelu
```

### Hosting chmury

Chmura działa na Renderze (plan darmowy, Frankfurt). Dane (SQLite) są kopiowane do Supabase po każdej zmianie i odtwarzane przy starcie, więc nie potrzeba płatnego dysku. Zapis i odczyt idą przez funkcje RPC chronione sekretem serwera, a tabele są zamknięte przez RLS. Zmienne środowiskowe: `FLEET_SUPABASE_URL`, `FLEET_SUPABASE_KEY` (klucz publiczny), `FLEET_SNAPSHOT_SECRET`. Test: `node test/persist-check.js`.

## Części

| Część | Gdzie | Co robi |
|---|---|---|
| Agent (`fleet up`) | każda maszyna: Windows, macOS, Linux | łączy się z chmurą połączeniem wychodzącym, wykonuje operacje, lokalny dashboard `127.0.0.1:7071` z blokadami |
| Chmura (`fleet cloud`) | serwer | konta, panel www, zdalny terminal, pliki, ekran, podglądy portów, potwierdzenia, dziennik, serwer MCP `/mcp` |
| Claude Code (`fleet connect claude`) | Twój komputer | dodaje serwer MCP `fleet` i komendę `/fleet` |

## Szybki start (lokalnie)

```bash
node cli/fleet.js cloud --port 8080 --data ./data   # chmura: http://localhost:8080
node cli/fleet.js up                                # agent + lokalny dashboard
```

1. Załóż konto na `http://localhost:8080/signup`.
2. **Maszyny → Dodaj maszynę** daje kod. Wpisz go w lokalnym dashboardzie albo użyj `node cli/fleet.js join KOD`.
3. **AI i MCP → Utwórz token**, a potem `node cli/fleet.js connect claude --token flt_...`.
4. W Claude Code: `/fleet odpal testy 50/50 na pc i laptopie`.

## Funkcje panelu

- Maszyny na żywo: CPU, RAM, GPU/VRAM, dysk, wykresy
- Terminal, pliki (przeciągnij i upuść), ekran ze sterowaniem, procesy
- **Uruchom na wielu**: jedna komenda na wielu maszynach, wyniki obok siebie, `{i}`/`{n}` do dzielenia testów
- Paleta poleceń `Ctrl K`, skróty `g m`, `g r`, `g a`
- Publiczne podglądy portów, dziennik z eksportem CSV, aktywne sesje, lista startowa
- Autostart agenta: `fleet service install` albo przełącznik w lokalnym dashboardzie

## Bezpieczeństwo

- Przycisk **STOP AI** blokuje AI na wszystkich maszynach.
- Polityka dla każdej kategorii (odczyt, komendy, zapis, instalacja, ekran, sterowanie, niebezpieczne): automatycznie, pytaj albo blokuj. Ustawiana dla konta i osobno dla maszyny. Domyślnie AI bez pytania tylko czyta i robi zrzuty ekranu.
- **Blokady lokalne** na samej maszynie, których chmura nie obejdzie.
- **Logowanie dwuetapowe (TOTP)** z kodem QR, 10 kodami zapasowymi jednorazowego użytku i blokadą ponownego użycia kodu. Własny generator QR i TOTP, bez zależności, zgodny bit w bit z biblioteką `qrcode` i z RFC 6238.
- **Reset hasła e-mailem**: własny klient SMTP (TLS/STARTTLS, AUTH PLAIN/LOGIN) skonfigurowany przez `FLEET_SMTP_URL` i `FLEET_MAIL_FROM`. Link działa 30 minut, tylko raz i po użyciu wylogowuje wszystkie sesje. Odpowiedź nie zdradza, czy konto istnieje. Bez SMTP maile trafiają do `data/outbox`.
- **P2P w trzech poziomach**:
  1. TCP bezpośrednio: kandydaci LAN, VPN (Tailscale, ZeroTier), globalne IPv6 i publiczny adres, sprawdzani równolegle.
  2. UDP z przebiciem NAT: STUN w chmurze (ten sam port co HTTP, po UDP), równoczesne pakiety z obu stron, niezawodny transfer z oknem 256 pakietów, SACK i szybką retransmisją.
  3. Przekaźnik strumieniowy w chmurze (jak DERP w Tailscale albo TURN w WebRTC) dla symetrycznych NAT: surowe bajty, bez zapisu w chmurze, jednorazowy adres.
  4. Awaryjnie kawałki po 4 MB przez kanał poleceń (np. starszy agent).

  Wszystko z jednorazowym tokenem i weryfikacją rozmiaru.
- **PWA**: panel da się zainstalować jak aplikację (manifest, service worker, ekran offline, skróty).
- Awaryjny reset hasła przez administratora chmury: `fleet cloud reset-password <email> [--disable-2fa]`.
- Zgody czasowe („Zezwól na 15 min”) obejmują też oczekujące prośby, więc `run_parallel` nie pyta N razy. STOP AI cofa je wszystkie.
- Dziennik wszystkich akcji. Tokeny przechowywane jako SHA-256, hasła jako scrypt.
- CSP, `X-Frame-Options`, `nosniff`, HSTS na HTTPS, limity prób logowania i rejestracji, sprzątanie wygasłych sesji. Za reverse proxy ustaw `FLEET_TRUST_PROXY=1`, a `FLEET_LOG=1` włącza logi żądań.

## Test

```bash
npm test              # 13 grup testów sterowania (Windows, macOS, Linux) + 26 kroków end-to-end
npm run test:screen   # na żywo: zrzut, kursor 1 px w bok i z powrotem (potwierdzony przez system), Shift
npm run test:p2p-wsl  # dwa hosty (Windows + WSL2): TCP 12 MB i UDP przez zaporę 8 MB, zgodne SHA-256
npm run check:ops     # operacje agenta na bieżącym systemie
bash test/linux-screen.sh   # Linux z pulpitem, z xdotool i scrot rozpakowanymi do /tmp
```

| Platforma | End-to-end | Ekran na żywo | Komendy sterowania |
|---|---|---|---|
| Windows 11 (Node 24) | ✓ | ✓ | ✓ |
| Ubuntu w WSL2 / WSLg (Node 22) | ✓ | ✓ | ✓ |
| macOS | nie testowano na sprzęcie | nie testowano na sprzęcie | ✓ (testy jednostkowe cliclick/JXA) |

## Publikacja

```bash
npm pack     # sprawdzenie paczki (28 plików)
npm publish  # wymaga zalogowania do npm (npm login)
```

## Struktura

```
cli/fleet.js          CLI (up, join, status, leave, cloud, connect claude)
agent/                agent, operacje, sterowanie ekranem, lokalny dashboard
cloud/                serwer HTTP/WS, hub, MCP, baza, strony www
shared/               WebSocket, informacje o systemie, katalog operacji
claude/commands/      komenda /fleet dla Claude Code
```

## Co dalej

- Model AI rozłożony na maszyny floty (`/fleet gpu`, API zgodne z OpenAI i Anthropic)
- Potwierdzenia push na telefon, PWA
- Sterowanie ekranem na Wayland bez XWayland
- Instalatory .exe i .pkg