> Źródło: https://redai.pl/dev/projekty-i-czaty/ (dokumentacja modułów portalu redAi). Cała dokumentacja w jednym pliku: https://redai.pl/dev/moduly.md

## Projekty i czaty

Od 29.09.2026 portal daje modułom dwie klasy do pracy z projektami i czatami. Do tabel `projects` i `terminals` moduł nadal nie sięga wprost: czyta i zakłada przez te klasy, a one liczą dostęp tym samym kodem co portal. Na instancji bez tej wersji sprawdźcie najpierw `class_exists(\App\Narzedzia\Rozmowy::class)`.

**`App\Narzedzia\Projekty`: tylko odczyt.** Zwraca zwykłe tablice z polami wspólnymi dla wszystkich instancji. Instancje dokładają do projektów własne kolumny (faza, PM, backlog), ale na nich moduł nie może polegać.

| Metoda | Zwraca |
|---|---|
| `lista($dla)` | projekty widoczne dla osoby (`$dla` = User albo id): publiczne, własne, udostępnione wprost i przez grupę (administrator widzi wszystkie) |
| `projekt(int $id)` | `id`, `nazwa`, `slug`, `widocznosc`, `tworca_id`, `kontekst`, `adres` albo `null` |
| `czlonkowie(int $id)` | `publiczny`, `tworca_id`, `osoby` (`id`, `nazwa`, `email`), `grupy` (`id`, `nazwa`, `osoby` = id osób) |
| `maDostep(int $projektId, $osoba)` | `true`/`false` (`$osoba` = User albo id), jak przy wejściu na stronę projektu |
| `rozmowy(int $projektId)` | czaty projektu bez archiwum |
| `rozmowa(int $czatId)` | `id`, `nazwa`, `projekt_id`, `katalog`, `tworca_id`, `widok` (`prosty`/`terminal`), `zalozyl_modul`, `utworzono`, `adres` |
| `rozmowaPoKatalogu(string $katalog)` | to samo po katalogu roboczym czatu (pasuje też podkatalog) |

`rozmowaPoKatalogu(getcwd())` przydaje się w komendzie artisan modułu, którą woła czat: komenda wie wtedy, z którego czatu i projektu ją uruchomiono.

**`App\Narzedzia\Rozmowy::zaloz()`: nowy czat z pierwszą wiadomością.** Idzie tą samą drogą co przycisk „+ Nowy czat” i wysłanie wiadomości w Prostym czacie.

```php
use App\Narzedzia\Rozmowy;

$czat = Rozmowy::zaloz([
    'modul'  => 'pmo',                 // klucz Waszego modułu, obowiązkowy
    'osoba'  => $request->user(),      // właściciel czatu (User albo id)
    'projekt'=> $projekt['id'],        // albo null = czat poza projektem
    'nazwa'  => 'Kamień M3: ustalenia',
    'tresc'  => "Przygotuj plan kamienia M3 na podstawie...", // pierwsza wiadomość; pusta = sam czat
]);

return redirect($czat['adres']);       // ['id', 'adres', 'projekt_id', 'katalog', 'tura']
```

- Portal sprawdza, że moduł istnieje, osoba jest aktywna i ma dostęp do projektu. Brak dostępu = `RuntimeException`, zły moduł, osoba albo projekt = `InvalidArgumentException`. Nie zakładajcie czatu w projekcie, którego osoba nie widzi, „bo moduł może”.
- Czat powstaje zawsze w widoku Prosty czat. Pierwsza wiadomość idzie od razu w imieniu osoby, a odpowiedź pojawia się w czacie jak po zwykłym wysłaniu.
- Bez `nazwa` czat dostaje nazwę jak z przycisku, a tytuł dobiera się z pierwszej wiadomości.
- Czat ma znacznik `zalozyl_modul` (klucz modułu), widoczny w `Projekty::rozmowa()`. Po nim odróżnicie czaty założone przez moduł od założonych ręcznie.
- Każde wywołanie z treścią to prawdziwa tura Claude na koncie instancji. Nie zakładajcie czatów w pętli ani z harmonogramu bez wyraźnej potrzeby.

