Edytor Lua#

vCLU zawiera wbudowany edytor kodu dostępny przez przeglądarkę. Edytor pozwala przeglądać i modyfikować moduły Lua, zarządzać draftami stworzonymi przez agentów AI, promować je do produkcji i śledzić historię zmian.

Dostęp#

Edytor jest dostępny pod adresem:

http://<adres-vclu>:8080/editor

Wymaga zalogowania (hasło ustawione w kreatorze konfiguracji).

Interfejs#

┌─────────────────────────────────────────────────────────────────────┐
│  Lua Editor                                                         │
├──────────┬──────────────────────────────────────────────────────────┤
│          │  tabs: init.lua │ biuro_auto.lua │ History              │
│  FILES   ├──────────────────────────────────────────────────────────┤
│          │  modules > init.lua          [Save] [Save All] [Reload] │
│ ▼ modules├──────────────────────────────────────────────────────────┤
│   init   │                                                          │
│   biuro  │              Monaco Editor                               │
│   salon  │              (podświetlanie składni Lua)                 │
│ ▼ drafts │                                                          │
│   gate   │                                                          │
│ ▼ backups│                                                          │
│  ▶ init 3├──────────────────────────────────────────────────────────┤
│          │  ▼ Output │ Lua Logs                          [x] [🗑]  │
│ [+File]  │  > Reload triggered...                                   │
│ [+Folder]│  > [OK] Lua runtime reloaded                             │
│ [Search] │                                                          │
├──────────┴──────────────────────────────────────────────────────────┤
│  Ready                                                    Lua       │
└─────────────────────────────────────────────────────────────────────┘

Panel plików (lewa strona)#

  • Modules - pliki produkcyjne z katalogu modules/
  • Drafts - drafty z workspace (stworzone przez MCP lub ręcznie)
  • Backups - kopie zapasowe plików produkcyjnych, pogrupowane po plikach
  • Klik na plik otwiera go w edytorze
  • Ikona kosza przy draftach - usunięcie draftu
  • Ikona ołówka - zmiana nazwy pliku
  • Przycisk Search - wyszukiwanie w treści plików (Ctrl+Shift+F)

Edytor (prawa strona)#

  • Monaco Editor - ten sam silnik co VS Code, z podświetlaniem składni Lua
  • Tabs - otwarte pliki jako zakładki, z oznaczeniem niezapisanych zmian
  • Breadcrumbs - ścieżka do aktualnego pliku
  • Save (Ctrl+S) - zapis bieżącego pliku
  • Save All - zapis wszystkich zmodyfikowanych plików
  • Reload - przeładowanie runtime Lua (bez restartu serwera)

Panel wyjścia (dolna belka)#

Panel wyjścia działa jak terminal w IDE - zawsze widoczny jako cienki pasek na dole. Kliknięcie rozwija go, pokazując dwie zakładki:

  • Output - wyniki operacji (save, reload, promote)
  • Lua Logs - logi runtime w czasie rzeczywistym

Panel można rozciągać w pionie (drag) i zwijać do paska.

Zarządzanie draftami#

Gdy agent AI stworzy draft przez MCP (vclu_draft_write), pojawia się on w sekcji Drafts w panelu plików. Edytor pozwala:

Podgląd draftu#

Kliknij draft w drzewie plików. Jeśli istnieje wersja produkcyjna tego pliku, edytor automatycznie otwiera widok diff - porównanie draftu z produkcją.

Promote (wdrożenie)#

Przycisk Promote pojawia się w toolbarze gdy otwarty jest draft. Promowanie:

  1. Tworzy backup istniejącego pliku produkcyjnego
  2. Zastępuje plik produkcyjny draftem
  3. Usuwa draft z workspace
  4. Automatycznie przeładowuje runtime Lua

Jest to ta sama operacja co vclu_draft_promote w MCP, ale wykonywana przez człowieka z poziomu przeglądarki.

Delete Draft#

Przycisk Delete Draft usuwa draft bez wdrażania - przydatne gdy AI napisał coś niepotrzebnego lub błędnego.

Historia (History)#

Tab History pokazuje chronologiczną historię operacji na draftach - kto co napisał, kiedy przetestował, kiedy wdrożył.

Otwieranie#

Kliknij przycisk History w toolbarze edytora. Otworzy się dedykowana zakładka z pełną historią.

Tryb Timeline#

Domyślny widok - chronologiczna lista zdarzeń, zgrupowana po datach:

── 4 mar 2026 ────────────────────────────
14:40  ✓ Promoted    modules/init.lua       human
14:36  ▶ Test OK     modules/gate_lights.lua Claude
14:35  ✏ Draft       modules/gate_lights.lua Claude
14:30  ✏ Draft       modules/init.lua        Claude

── 3 mar 2026 ────────────────────────────
18:00  ✓ Promoted    modules/biuro_auto.lua  human
17:55  ▶ Test OK     modules/biuro_auto.lua  Codex

Każde zdarzenie pokazuje:

  • Czas wykonania operacji
  • Typ z ikoną (Draft, Test OK/fail, Valid/Invalid, Promoted, Deleted)
  • Plik którego dotyczy operacja
  • Aktor - nazwa bota AI lub “human” dla operacji z przeglądarki
  • [View diff] przy promowaniu - otwiera porównanie backupu z aktualną wersją

Tryb Files#

Alternatywny widok - pipeline per plik, pokazujący etapy od draftu do produkcji:

modules/gate_lights.lua
  ✏ Draft (Claude, 14:35) → ▶ Test OK (14:36) → ✓ Promoted (human, 14:40)

modules/biuro_auto.lua
  ✏ Draft (Codex, 17:50) → ▶ Test fail (17:52) → ✏ Draft (Codex, 17:55) → ▶ Test OK (17:56)

Pliki z aktywnymi draftami (jeszcze nie promowane) wyświetlane są na górze.

Filtry#

  • Filtr plików - pokaż zdarzenia tylko dla wybranego pliku
  • Filtr aktorów - pokaż zdarzenia tylko od wybranego bota/człowieka

Filtry działają po stronie klienta (bez dodatkowych zapytań do serwera).

View diff#

Przy zdarzeniach typu “Promoted” z backupem dostępny jest link [View diff]. Kliknięcie otwiera nową zakładkę diff w edytorze, pokazującą co dokładnie się zmieniło między backupem (poprzednia wersja) a aktualnym plikiem produkcyjnym.

Kopie zapasowe (Backups)#

Każda promocja draftu automatycznie tworzy kopię zapasową pliku produkcyjnego, który jest nadpisywany. Kopie zapasowe są widoczne i zarządzane bezpośrednio w edytorze.

Kiedy powstaje backup?#

Backup jest tworzony automatycznie w dwóch sytuacjach:

  1. Promocja przez MCP - agent AI wywołuje vclu_draft_promote
  2. Promocja z edytora - człowiek klika przycisk Promote

W obu przypadkach, zanim draft nadpisze plik produkcyjny, istniejąca wersja jest kopiowana do workspace/backups/.

Jeśli plik produkcyjny nie istnieje (pierwszy deployment), backup nie jest tworzony - nie ma czego kopiować.

Przeglądanie backupów#

W panelu plików (lewa strona edytora) na dole pojawia się sekcja Backups z liczbą dostępnych kopii. Backupy są pogrupowane po plikach:

▼ Backups (10)
  ▶ init.lua              3
  ▶ scenes/salon/movie.lua 1
  ▶ tasmota/biurko.lua     2

Rozwinięcie grupy pokazuje poszczególne kopie z datą i rozmiarem:

▼ init.lua              3
    04.03, 10:44:44    97 B
    03.03, 09:15:05    67 B
    02.03, 21:17:34    93 B

Porównanie z produkcją (diff)#

Kliknięcie backupu otwiera widok diff w edytorze:

  • Lewa strona (original) - treść backupu (poprzednia wersja)
  • Prawa strona (modified) - aktualna wersja produkcyjna

Dzięki temu widać dokładnie co się zmieniło od momentu utworzenia backupu.

Przywracanie backupu#

Gdy backup jest otwarty w widoku diff, w toolbarze pojawia się przycisk Restore. Przywracanie:

  1. Nadpisuje plik produkcyjny zawartością backupu
  2. Automatycznie przeładowuje runtime Lua
  3. Zamyka zakładkę backupu
  4. Odświeża drzewo plików

Przywracanie nie tworzy dodatkowego backupu aktualnej wersji. Jeśli chcesz zachować obecny stan przed przywróceniem, najpierw skopiuj jego treść.

Automatyczny rollback (Watchdog)#

Po każdej promocji przez MCP uruchamiany jest watchdog - monitor, który przez 15 sekund obserwuje logi Lua. Jeśli wykryje więcej niż 3 nowe błędy w tym czasie, automatycznie:

  1. Przywraca wszystkie promowane pliki z backupów
  2. Przeładowuje runtime Lua
  3. Rejestruje incydent w dashboardzie

Watchdog chroni przed sytuacją, gdy AI wdroży kod z błędem runtime, który przeszedł testy sandbox.

Przechowywanie#

Backupy są przechowywane w katalogu workspace/backups/ z nazwą w formacie:

RRRRMMDD_HHMMSS_ścieżka_z_podkreśleniami.lua

Przykłady:

  • 20260304_104444_modules_init.lua - backup modules/init.lua z 4 marca, 10:44
  • 20260302_193000_modules_tasmota_biurko.lua - backup modules/tasmota/biurko.lua

Backupy nie są automatycznie usuwane - gromadzą się z każdą promocją. Na Raspberry Pi z kartą SD warto od czasu do czasu usunąć stare kopie ręcznie (przez SSH lub system plików).

Persystencja historii#

Historia operacji jest zapisywana na dysku w formacie JSONL (JSON Lines):

workspace/audit.jsonl       ← aktywny plik (append-only)
workspace/audit.1.jsonl     ← poprzednia rotacja
workspace/audit.2.jsonl     ← najstarsza rotacja
  • Każdy plik zawiera do 1000 wpisów (~200 KB)
  • Łącznie do 3000 wpisów historii
  • Rotacja automatyczna - gdy aktywny plik przekroczy limit, starsze pliki przesuwają się
  • Historia przeżywa restart serwera

Starsze operacje sprzed włączenia persystencji mogą nie mieć pola “aktor”. Edytor traktuje je jako operacje bez przypisanego aktora.

Skróty klawiszowe#

SkrótAkcja
Ctrl+SZapisz bieżący plik
Ctrl+Shift+FSzukaj w plikach

Następny krok#

Zdalny system plików - alternatywna metoda edycji przez SSH/SFTP