Pipe

Workery, cele, rutyny, czuwanie, diagramy i historia serwera

Pipe v0.50.5

Ten dokument opisuje funkcje, które odróżniają Pipe od agentów ogólnego przeznaczenia: agent, który sam pilnuje serwera, widzi jego architekturę i zarządza wieloma maszynami naraz.


Pipe pisze pierwszy

Nie musisz pytać, co się dzieje. Pipe pisze sam – na Telegram, w pipe web i w CLI – gdy coś wymaga uwagi, i od razu daje przycisk, który sprawę załatwia. Wszystko, co wyśle, trafia też do skrzynki (backend/data/feed.json), więc nic nie ginie, gdy nikt nie był podłączony.

WiadomośćKiedyPrzyciski
Alertproblem już jest: dysk, pamięć, kontener, strona, certyfikat, podatnościZwolnij miejsce, Załataj, Zbadaj
Ustaleniakrytyczny problem: Pipe sam sprawdza przyczynę (worker, tylko odczyty) i pisze, co ustaliłNapraw: rutynowe poprawki od razu, ważne czekają na Twoje TAK
Podpowiedźproblem dopiero będzie albo coś można poprawić (tabela niżej)akcja, Później, Mniej takich
Raport porannyo DIGEST_TIME--
Rozwiązaneproblem minął--

Podpowiedzi liczą się bez modelu językowego, z danych, które Pipe i tak zbiera (co INSIGHTS_INTERVAL, 1 h):

PodpowiedźSkąd
Dysk / zapełni się za ok. 4 dnitempo przyrostu z historii pomiarów (regresja z ostatnich 48 h)
Mogę zwolnić ok. 6 GBobrazy Dockera bez tagu, cache budowania, pobrane paczki apt
Kontener X zrestartował się 4 razy w ciągu dobylicznik restartów (pętle restartów łapie alert)
Serwer od 5 dni czeka na restart/run/reboot-required
Pamięć RAM stale rosniezajętość RAM rosnąca przez dobę (możliwy wyciek)

Samodzielne badanie. Gdy pojawia się krytyczny problem (kontener przestał działać, strona nie odpowiada, dysk pełny), Pipe nie czeka na Zbadaj: worker sprawdza logi, zasoby i zmiany z ostatniej doby (tylko odczyty), a ustalenia przychodzą zaraz po alercie, z przyciskiem Napraw. AUTO_INVESTIGATE=critical (domyślnie), all albo off; najwyżej AUTO_INVESTIGATE_DAILY (4) badań dziennie, ten sam problem najwyżej raz na 6 h.

Kiedy powiadamiać. Poziom (NOTIFY_LEVEL): all – wszystko; important (domyślnie) – problemy, ostrzeżenia, raport i ważne podpowiedzi, informacyjne czekają w skrzynce; critical – tylko to, co nie może czekać. Cisza nocna (QUIET_HOURS=22:00-07:00): w nocy przychodzą tylko sprawy krytyczne, reszta rano razem z raportem. Najwyżej INSIGHTS_PER_DAY (3) podpowiedzi dziennie z powiadomieniem. Mniej takich wycisza dany rodzaj podpowiedzi (zostaje w skrzynce bez powiadomienia), Później odkłada ją o dobę. Te same ustawienia zmienisz w trakcie pracy: /powiadomienia (Telegram – przyciskami, CLI – /powiadomienia wazne cisza 22-7 dziennie 3, pipe web – dzwonek na pulpicie).


Warsztat: projekty, które Pipe stawia sam

Napisz *"postaw mi tę aplikację: https://github.com/acme/notatnik"* albo "napisz skrypt, który policzy zamówienia z logów", a Pipe poprowadzi to do końca sam. Projekty leżą w jednym katalogu hosta – warsztacie (WORKSPACE_DIR, domyślnie /root/pipe-workspace), każdy w swoim podkatalogu i w backend/data/projects.json.

KrokCo robi PipePyta?
clonegit clone --depth 1 z adresu https albo git@ (klucz SSH serwera); bez hooków, submodułów, LFS; za duże repozytorium (PROJECT_MAX_MB) usuwanie
inspectco to jest i jak to uruchomić – bez modelu: compose, Dockerfile, Node, Python (Django, FastAPI, Flask, Streamlit), Go, PHP, strona statyczna; porty, potrzebne zmienne, README i AGENTS.mdnie
zapis plikówwrite_file w katalogu warsztatu (np. Dockerfile, skrypt)nie
execkomenda w jednorazowym kontenerze: tylko katalog projektu jako /work, bez docker.sock i uprawnień (--cap-drop ALL, no-new-privileges), limit pamięci, procesów i czasunie*
runusługa na stałe: kontener pipe-<nazwa> (albo projekt compose pipe-<nazwa>), port tylko na 127.0.0.1nie – plan i postęp widać w rozmowie
logs, stop, start, pulllogi, zatrzymanie, wznowienie, git pull --ff-onlynie
removekatalog, kontenery i zbudowany obraztak

\* Po przeczytaniu treści z zewnątrz (README sklonowanego repozytorium, strona z internetu) Pipe pyta o zgodę na exec do Twojej następnej wiadomości – jak YOLO: tekst z cudzego repozytorium nie może sam uruchomić kodu.


Oszczędność tokenów

Czuwanie, podpowiedzi, raporty, /status, /zmiany, /audyt, /sprzataj i pulpit działają bez modelu językowego – zero tokenów. Gdy rozmowa już idzie do modelu, Pipe wysyła mniej:


Diagramy

Agent rysuje diagramy w składni Mermaid i wysyła je jako obraz:

Dwa tryby narzędzia diagram:

TrybKiedySkąd dane
infra"pokaż architekturę", "co tu jest postawione", /mapaautomatyczne odkrycie (poniżej)
mermaidprzepływy, procedury, zależności, "narysuj jak działa deploy"kod napisany przez agenta

Mapa infrastruktury (/mapa działa bez LLM – szybko i za darmo) składa:

Kontener wyłączony albo unhealthy jest czerwony. Etykiety są escapowane – nazwa kontenera czy domena nie złamie składni diagramu.

Renderowanie: mermaidx – prawdziwa biblioteka Mermaid w osadzonym QuickJS + resvg. Bez przeglądarki, bez Node.js i bez wysyłania kodu diagramu do zewnętrznej usługi (w przeciwieństwie do mermaid.ink/kroki). Błąd składni wraca do modelu, który poprawia kod.


DIRECTORY – mapa katalogów

Uzupełnienie SERVER.md: zamiast prozy – lista konkretnych miejsc z jednozdaniowym opisem.

- /srv/shop [repo] sklep (Next.js), deploy przez compose (remote https://github.com/acme/shop.git, galaz main)
- /srv/shop/docker-compose.yml [compose] projekt docker compose 'shop'
- /var/backups/pg [backup] nocne dumpy Postgresa, rotacja 7 dni

VIBE – styl rozmowy

Agent z czasem dopasowuje się do tego, jak piszesz i czego oczekujesz.


Zdalne cele

Eksperymentalne: działa i ma testy, ale ma za sobą mniej użycia na prawdziwych serwerach niż reszta Pipe. Jeśli coś nie gra, zgłoś to w issue.

Cel to miejsce, na którym Pipe wykonuje komendy bez instalowania czegokolwiek po drugiej stronie:

RodzajJak Pipe wykonuje komendęPola
sshssh -o BatchMode=yes ... host -- 'komenda'host, user, port, identity_file
dockerdocker exec kontener sh -c 'komenda'container
kubernetes (klaster)kubectl --context C --namespace N ...context, namespace
kubernetes (pod)kubectl exec pod -- sh -c 'komenda'pod, pod_container
localten host (zawsze dostępny)--

Przykład: "dodaj serwer 10.0.0.5 jako db-backup, ssh, użytkownik root" → TAK → "sprawdź łączność".


Workery

Eksperymentalne: działa i ma testy, ale ma za sobą mniej użycia na prawdziwych serwerach niż reszta Pipe. Jeśli coś nie gra, zgłoś to w issue.

Worker to pod-agent, z którym rozmawia agent, a nie Ty. Narzędzie delegate wysyła kilka naraz:

Ty:     sprawdz, czemu na obu serwerach www rosnie load
Agent:  delegate [web-1: "load, top procesy, logi nginx z ostatniej godziny"],
                 [web-2: to samo]
          › web-1: start (web-1)
          › web-1 $ uptime
          › web-2 $ ps aux --sort=-%cpu | head
          › web-1: gotowe (4 komend)
Agent:  Na web-1 load robi cron z backupem o 14:00, web-2 -- php-fpm; proponuje ...

Rutyny

Zadania, które agent wykonuje sam według harmonogramu i raportuje:

"codziennie o 7 sprawdź backupy w /var/backups i ważność certyfikatów, pisz tylko jak coś jest nie tak"


Przypomnienia

Rutyna jest cykliczna; przypomnienie odpala się raz, o podanym czasie, i znika:

"napisz do mnie za 10 sekund" · "przypomnij jutro o 9 o odnowieniu domeny" · "za godzinę sprawdź, czy backup się skończył"

Agent nie potrafi czekać w trakcie odpowiedzi. Bez tego narzędzia obietnica "odezwę się później" byłaby pusta – prompt zabrania jej, jeśli nic nie zostało zaplanowane.


Czuwanie

Deterministyczne sprawdzenia co WATCH_INTERVAL (120 s), bez LLM i bez kosztów:

SprawdzenieProgPoziom
Zajętość każdego dysku hostaWATCH_DISK_PCT (90%), >= 97% krytycznyostrzeżenie / krytyczny
RAMWATCH_MEM_PCT (92%)ostrzeżenie
Load average 5 minrdzenie x WATCH_LOAD_FACTOR (2)ostrzeżenie
Kontener restartuje się w pętli--krytyczny
Kontener unhealthy--ostrzeżenie
Kontener, który działał, przestał działać--krytyczny (jednorazowo)
Nowy publiczny port na hościewzględem poprzedniego sprawdzeniaostrzeżenie (jednorazowo)

Co się zmieniło – wehikuł czasu serwera

Najczęstsze pytanie przy awarii: "co się zmieniło, że przestało działać?". Pipe zna odpowiedź, bo co SNAPSHOT_INTERVAL (1 h) robi migawkę hosta – same odczyty plików i docker inspect, bez LLM:

SekcjaCo widać
Systemjądro, restart serwera (nowy rozruch)
Pakietyinstalacje, aktualizacje, usunięcia (dpkg, apk)
Kontenerynowe i usunięte, zmiana obrazu albo nowej wersji obrazu pod tym samym tagiem, zatrzymanie
Portynowe i zamknięte porty TCP hosta
Usługiwlaczone/wylaczone usługi systemd, zmienione pliki jednostek
Crondodane i usunięte linie (sekrety zredagowane)
Kontanowe konta z powłoką albo uid 0
Klucze SSHnowe klucze w authorized_keys (odcisk + komentarz; sam klucz nie jest zapisywany)
Konfiguracjasshd, sudoers, nginx, Caddy, HAProxy, fstab, hosts, daemon.json, pliki compose projektów

Wykresy

Czuwanie przy każdym sprawdzeniu (co 2 min) zapisuje próbkę: load, RAM, swap, zajętość dysków. Historia (METRICS_KEEP_DAYS, 8 dni) daje wykresy bez Prometheusa:

Wykres to Mermaid xychart-beta renderowany tym samym silnikiem co diagramy (offline).


Monitoring bez konfiguracji

Pipe wie, co jest na serwerze, więc sam wie, co sprawdzać – co CHECKS_INTERVAL (1 h):

SprawdzenieSkąd Pipe wie, co sprawdzićAlert
Ważność certyfikatu TLSdomeny z nginx, Caddy, etykiet Traefika / VIRTUAL_HOSTWATCH_CERT_DAYS (14) dni przed wygaśnięciem; krytyczny 3 dni przed albo gdy certyfikat jest nieprawidłowy
Odpowiedź HTTPSte same domeny5xx albo brak odpowiedzi dwa razy z rzędu (chwilowe 502 przy deployu nie alarmuje)
DNSte same domenydomena się nie rozwiązuje; w /zdrowie – czy wskazuje na ten serwer
Świeżość backupówwpisy [backup] w DIRECTORYnajnowszy plik starszy niż WATCH_BACKUP_HOURS (26 h), pusty albo brakujący katalog

Poranny raport

Codziennie o DIGEST_TIME (7:00, czas serwera; off wyłącza) na Telegram przychodzi raport – bez LLM:

Do raportu dołączony jest wykres obciążenia z ostatniej doby. /raport – raport na żądanie.


Koszty LLM

Każde zapytanie do providera (rozmowa, workery, rutyny, VIBE) jest liczone w backend/data/usage.json.


Zmiany z bezpiecznikiem i /cofnij

Rutynowe zmiany Pipe robi sam: restart i przeładowanie usług, docker compose up -d, edycje konfiguracji, pakiety z repozytorium systemu, git pull. Przechodzą przez ten sam plan co zmiana po TAK, a w rozmowie widać je z dopiskiem bez pytania. O usuwanie danych, dostęp do serwera (SSH, użytkownicy, zapora), autostart (cron, systemd), kod i komendy, których nie rozpoznaje, pyta zawsze – pełna lista: docs/security.md (Samodzielność). AUTONOMY=0 przywraca pytanie o każdą zmianę.

Każda zmiana dostaje plan – przy ważnych widoczny w potwierdzeniu, zanim naciśniesz TAK:

Potrzebuje Twojej zgody
$ sed -i 's/8080/8081/' /etc/nginx/sites-enabled/shop && systemctl reload nginx
Bezpiecznik:
- kopia przed zmiana: /etc/nginx/sites-enabled/shop
- sprawdzenie przed (niepowodzenie = nie wykonam): nginx -t
- weryfikacja po: nginx -t; usluga nginx aktywna; strony, ktore dzialaja teraz, maja dzialac po zmianie
- jesli weryfikacja nie przejdzie: przywroce pliki z kopii automatycznie i przeladuje ponownie
- cofniecie pozniej: /cofnij
KrokCo Pipe robi
Kopiapliki zmieniane przez sed -i, tee, >/>>, cp, mv, rm, chmod/chown, write_file; HEAD repozytorium przy git pull/checkout/reset/commit; crontab; pliki pamięci Pipe przy zmianie celów, rutyn, skilli i SERVER.md
Przedwalidacją konfiguracji przed (prze)ładowaniem: nginx -t, sshd -t (chroni przed odcięciem SSH), caddy validate, apachectl configtest, haproxy -c, postfix check, docker compose config -q; w kontenerze – docker exec <nginx> nginx -t. Nieudane sprawdzenie = operacja nie jest wykonywana
Pousługa active, kontener running i nie unhealthy, wszystkie kontenery projektu compose wstały, zmieniony plik przechodzi walidację (nginx, sshd, sudoers visudo -c, fstab, compose, JSON), strony, które odpowiadały przed zmianą, odpowiadają po niej
Przywrócenienieudana weryfikacja zmiany plików konfiguracji → kopia wraca automatycznie (SAFE_AUTO_ROLLBACK=1), a usługa jest przeładowana ponownie. Inne operacje – wynik trafia do agenta, a Ty możesz /cofnij

Plan powstaje z analizy komendy w kodzie (bez LLM); wykonywany jest dokładnie plan, który widziałeś. Program, którego nie ma w miejscu działania Pipe (np. sshd w kontenerze), jest pomijany i zgłaszany jako nie sprawdzono – wtedy plan mówi to wprost.

Dziennik i cofanie. /dziennik pokazuje ostatnie zmiany (backend/data/journal/, 50 wpisów, 14 dni). /cofnij (albo "cofnij ostatnią zmianę") pokazuje różnice plików i komendy odwrotne – docker stop → docker start, systemctl disable → enable, git pull → git reset --keep <poprzedni HEAD>, docker compose down → up -d – i czeka na TAK. /cofnij działa bez LLM, więc pomaga też wtedy, gdy provider nie odpowiada albo skończył się dzienny limit. Cofnięcie też trafia do dziennika – można je cofnąć.

Czego Pipe nie cofa automatycznie (i mówi to w planie): instalacji pakietów, zmian w klastrze Kubernetes, usuniętych kontenerów i wolumenów, git clean, katalogów usuwanych rm -r, poprzednich wersji obrazów.


Audyt bezpieczeństwa i strażnik

/audyt (albo "jak bezpieczny jest ten serwer?") – ocena 0-100 bez LLM, każdy punkt z poprawką:

ObszarCo sprawdza
SSHlogowanie hasłem (z uwzględnieniem sshd_config.d i zasady "pierwsza wartość wygrywa"), root z hasłem, klucze
Zaporaufw, firewalld, nftables, iptables (zapora w panelu dostawcy – Pipe tego nie widzi i mówi to)
Portybazy danych, Redis, Elasticsearch, API Dockera/Kubernetesa na publicznym adresie; port publikowany przez kontener dostaje poprawkę w compose, bo Docker omija ufw
Konteneryprivileged, zamontowany docker.sock, sieć hosta
Kontauid 0 poza rootem, konta bez hasła (z /etc/shadow odczytywane są tylko nazwy kont)
Aktualizacjeunattended-upgrades, oczekujące poprawki bezpieczeństwa, wymagany restart
Podatnościznane podatności z poprawką w pakietach systemu, obrazach kontenerów, zdalnych serwerach i aplikacjach (OSV.dev, CISA KEV) – poniżej
Ochronafail2ban / CrowdSec (ważniejsze, gdy SSH przyjmuje hasła)
Sekretypliki .env czytelne dla wszystkich w katalogach aplikacji z DIRECTORY
Higienasynchronizacja czasu, swap na małej maszynie, certyfikaty

"napraw 1" – agent wykonuje poprawkę zwykłym narzędziem, więc dostajesz ją do zatwierdzenia z planem bezpiecznika (kopia, sshd -t przed przeładowaniem, /cofnij). Poprawka SSH trafia do własnego pliku sshd_config.d/00-pipe-*.conf, żeby wygrać z ustawieniami cloud-init. Bez klucza w authorized_keys Pipe nie proponuje wyłączenia haseł – najpierw klucz (skill utwardz-ssh). W trybie docker komendy są oznaczone w powłoce hosta (system plików hosta jest tylko do odczytu).

Strażnik (co WATCH_INTERVAL, bez LLM) porównuje konta, klucze SSH, programy SUID/SGID i konfiguracje uwierzytelniania (sudoers, sshd, PAM, /etc/passwd, ld.so.preload). Nowe konto z uid 0, nowy klucz, nowy SUID albo ld.so.preload – alert krytyczny. Zmiany zrobione przez Pipe (są w dzienniku) nie alarmują. Aktualizacje pakietów też nie: program SUID albo konfiguracja, których treść zgadza się z sumą z bazy pakietów (dpkg md5sums i Conffiles, apk), to łatka, a nie podmiana. Binarka podmieniona po instalacji dalej daje alert.

Log SSH (/var/log/auth.log albo /var/log/secure, czytany przyrostowo): seria nieudanych logowań, udane logowanie hasłem z adresu, który wcześniej zgadywał hasła, logowanie z nowego adresu.

Podatności w pakietach (Debian, Ubuntu, Alpine). Pipe czyta listę pakietów z bazy dpkg/apk (niczego nie uruchamia) i pyta OSV.dev o znane podatności dla dokładnych wersji. Liczy się tylko to, co ma poprawkę – podatności bez poprawki Pipe pomija, bo zwykły Debian ma ich setki i nic się z nimi nie da zrobić. Raport zaczyna się od "Co z tym zrobić": jedna linia na serwer, obrazy i aplikacje z konkretnym krokiem. Do OSV trafiają wyłącznie nazwy i wersje pakietów; VULN_INTERVAL=0 wyłącza skan.


Pierwsze 5 minut

Po instalacji, gdy bot Telegram połączy się pierwszy raz, Pipe sam pisze: mapa serwera jako obraz, ocena bezpieczeństwa z trzema najważniejszymi poprawkami i lista tego, czego od teraz pilnuje. CLI pokazuje to samo przy pierwszym połączeniu z danym serwerem. Bez LLM.


Wbudowane skille

SkillCo robi
nginx-vhostnowa domena w nginx jako reverse proxy + certyfikat Let's Encrypt
swapplik swap z wpisem w fstab (też btrfs)
fail2ban-sshfail2ban z jailem SSH, bez blokowania własnego adresu
backup-postgresnocny pg_dump z rotacja, wpis [backup] w DIRECTORY (czuwanie pilnuje świeżości)
aktualizuj-kontenerpull + up usługi compose z planem powrotu do poprzedniego obrazu
utwardz-sshwyłączenie haseł w SSH w kolejności, która nie odetnie dostępu
wolne-miejsceco zajmuje dysk i bezpieczne sprzątanie, krok po kroku

Instalowane przy starcie do backend/data/skills/ jak zwykłe skille – masz je w /skille i jako komendy (/nginx_vhost). Możesz je edytować i usuwać: nowa wersja z aktualizacji Pipe zastąpi tylko skill, którego nie zmieniałeś, a usuniętego nie przywróci.

Skille i pluginy z innych ekosystemów. /pobierz skill <wlasciciel/repo|URL> [filtr] i /pobierz plugin <...> (/download) biorą gotowe zestawy z repozytorium git – ten sam format SKILL.md co Claude Code, a pluginy w układzie pluginów Claude Code (skills/, .mcp.json, marketplace). Najpierw podgląd: które skille trafia do pamięci (sam tekst, skrypty są pomijane), które serwery MCP dojdą (w izolowanym kontenerze, sekrety do dopisania w backend/.env jako MCP_...) i co zostanie pominięte – z powodem (za długi skill, serwer, który potrzebuje plików pluginu, haki, agenty). Instalacja dopiero po Zainstaluj. Ta sama nazwa w kilku pluginach dostaje przedrostek pluginu (telegram-access). W rozmowie: "pobierz skille z anthropics/skills".

Przy PIPE_LANG=en instalowane są angielskie wersje: update-container, harden-ssh, free-disk-space (pozostałe cztery mają tę samą nazwę w obu językach).


Pamięć incydentów

Każdy rozwiązany alert zostaje w backend/data/incidents.json: co się stało, kiedy i jak długo, co ustalił agent po Zbadaj (albo worker przy alercie z webhooka) i co pomogło – zmiany z dziennika wykonane w czasie trwania problemu. Bez dodatkowych zapytań do LLM.

Gdy ten sam problem wraca, alert na Telegramie ma linię Poprzednio: 2026-09-12 (40 min) — ustalenia: logi nginx bez rotacji... — pomogło: journalctl --vacuum-size=200M, a polecenie Zbadaj dostaje tę historię: agent najpierw sprawdza, czy to ta sama przyczyna, i proponuje sprawdzoną naprawę (dalej do zatwierdzenia). /incydenty pokazuje historię; agent sięga po nią sam ("czy to już się zdarzało?").


Alerty z zewnątrz (webhooki)

Pipe dołącza do monitoringu, który już masz, zamiast go zastępować:

# backend/.env
WEBHOOK_PORT=7380
WEBHOOK_TOKEN=$(openssl rand -hex 24)
ŹródłoAdresKonfiguracja po stronie nadawcy
Prometheus Alertmanager/hook/alertmanagerwebhook_configs: - url: http://127.0.0.1:7380/hook/alertmanager + http_config.authorization.credentials: <token>
Grafana/hook/grafanacontact point typu Webhook, nagłówek Authorization: Bearer <token>
Uptime Kuma/hook/uptime-kuma?token=<token>powiadomienie typu Webhook (application/json)
GitHub/hook/githubwebhook repozytorium, Secret = token; zdarzenia Workflow runs, Deployment statuses
Wszystko inne/hook/generic{"title", "message", "severity", "status": "firing|resolved", "name"}

Alert trafia do czuwania (znika po resolved) i na Telegram z przyciskiem Zbadaj. Z WEBHOOK_INVESTIGATE=1 nowy alert od razu bada worker (tylko odczyty: usługi, kontenery, logi, zasoby, zmiany z ostatniej doby), tak samo jak problemy wykryte przez Pipe: ustalenia przychodzą chwilę po alercie z przyciskiem Napraw – ten sam alert najwyżej raz na 6 h, 10 badań z webhooków dziennie (osobno od AUTO_INVESTIGATE_DAILY).

W Dockerze port jest publikowany tylko na 127.0.0.1:7380; nadawcy spoza serwera – przez odwrotne proxy z TLS.


Załączniki: pliki, zrzuty ekranu, logi

Agentowi można wysłać plik razem z pytaniem: zrzut ekranu z błędem, log, konfigurację nginx. Na Telegramie zdjęcie albo dokument (podpis to pytanie, album kilku zdjęć idzie jako jedna wiadomość), w pipe web spinacz, przeciągnięcie pliku na okno albo wklejenie zrzutu ze schowka (miniatury przed wysłaniem), w CLI /plik <sciezka> [pytanie] albo @ścieżka w zwykłej wiadomości (Tab podpowiada ścieżki).

Backend (core/attachments.py) rozpoznaje plik po zawartości, nie po nazwie:

Limity: 10 MB na plik, 20 MB i 10 plików na wiadomość. Treść załącznika to dane, nie polecenia: tryb YOLO jest wstrzymany do następnej wiadomości, tak jak po przeczytaniu strony z internetu.

Wiadomości głosowe

Eksperymentalne: działa i ma testy, ale ma za sobą mniej użycia na prawdziwych serwerach niż reszta Pipe. Jeśli coś nie gra, zgłoś to w issue.

Na Telegramie wystarczy nagrać wiadomość: "sprawdź, czemu sklep nie działa". Bot odpisze Usłyszałem: ... i przekaże tekst agentowi. W pipe web jest przycisk mikrofonu: nagranie (do 5 minut) przeglądarka zamienia na WAV 16 kHz i wysyła do transkrypcji, a tekst idzie do agenta. Transkrypcja: przy LLM_PROVIDER=gemini robi ją sam model Gemini (wejście audio), przy openai albo groq endpoint Whisper tego providera – w obu przypadkach bez konfiguracji. Przy innych providerach ustaw STT_BASE_URL, STT_API_KEY, STT_MODEL (np. darmowy Groq whisper-large-v3-turbo albo lokalny faster-whisper); STT_* ma zawsze pierwszeństwo.


Role i wielu użytkowników

RolaMożeNie może
adminwszystko--
viewerrozmowa, diagnoza, odczyty, wykresy, raporty, audyt, alertyzatwierdzać zmian, /cofnij, zapisywać pamięci Pipe (SERVER.md, skille, cele, rutyny)

Interfejs webowy i schemat na żywo

pipe web otwiera w przeglądarce interfejs z rozmową i panelem bocznym. Działa na Twoim komputerze, przez ten sam tunel co CLI.

Pulpit (pierwsza zakładka panelu) odpowiada na pytanie "czy wszystko działa?" bez modelu: nagłówek zwykłymi słowami ("Wszystko działa" albo "Wymaga uwagi: ..."), pierścienie procesora, pamięci i dysku z przebiegiem ostatniej doby, skrzynka Od Pipe (wiadomości z przyciskami akcji, nowe oznaczone kropka; dzwonek w górnym pasku pokazuje, ile ich jest), karty projektów z warsztatu (logi, zatrzymanie, Z GitHuba) i zużycie modelu dziś (tokeny, koszt, cache, ile Pipe zaoszczędził). Dzwonek przy skrzynce otwiera ustawienia powiadomień. Zasoby, skrzynkę i projekty zwijasz klikiem w nagłówek sekcji (zwinięte zasoby zostają jako procenty w jednej linii), a pojedyncza wiadomość – klikiem w jej tytuł. Przeglądarka to pamięta; dzwonek w górnym pasku i /nowosci rozwijają skrzynkę. Pusty ekran rozmowy podsuwa zadania zwykłymi słowami (Czy wszystko działa?, Zwolnij miejsce na dysku, Uruchom aplikację z GitHuba, Napisz mi skrypt); te oznaczone bez AI działają natychmiast i nic nie kosztują.

Schemat powstaje sam z tego, co Pipe wie o infrastrukturze – nic się nie rysuje ani nie konfiguruje:

PoziomCo widać
Serweryten serwer i zdalne cele (SSH, kontenery, klastry)
Wnętrze serwerainternet, reverse proxy, projekty compose, pojedyncze kontenery, usługi i porty
Projektkontenery projektu, ich porty i zależności (aplikacja → baza), katalog projektu

Przypisanie działania do elementu wynika z treści komendy: nazwa kontenera, jednostka systemd, ścieżka pliku, katalog projektu. Gdy się nie da (np. dowolny skrypt), działanie jest pokazywane na całym serwerze. Wyszukiwanie i czytanie stron (web_search, web_fetch, software_info) świeci na elemencie Internet.

Na telefonie rozmowa i pulpit przełączają się przyciskami w górnym pasku, a widok, język i motyw są w menu .... Schemat na wąskim ekranie układa się z góry na dół (czytelny bez przybliżania): jeden palec przesuwa, dwa przybliżają, podwójne stuknięcie w puste miejsce przybliża, przycisk z ramka wraca do całości. Szczegóły elementu wysuwają się od dołu. Pole pisania zostaje nad klawiaturą.

Panel boczny zajmuje domyślnie pół ekranu. Jego krawędź można przeciągnąć – wężej albo szerzej, najwyżej do połowy ekranu; dwuklik na krawędzi przywraca domyślna szerokość, a przeciągnięcie do prawej krawędzi okna chowa panel. Panel chowa też przycisk w jego pasku zakładek; przycisk w górnym pasku chowa go i rozwija z powrotem. Ze schowanym panelem rozmowa zajmuje całe okno (treść w czytelnej kolumnie pośrodku), a komenda albo powiadomienie, które otwiera zakładkę (np. /alerty), rozwija panel sam. Szerokość i stan panelu zostają w przeglądarce. Z klawiatury: fokus na krawędzi, strzałki zmieniają szerokość, Enter chowa.

Kroki agenta w rozmowie. Pod odpowiedzią widać, co agent zrobił: każda komenda (albo opis, np. czyta /etc/nginx/nginx.conf) i kilka linii jej wyniku – przy błędzie linie z błędem, przy sukcesie koniec. Cały wynik rozwija do 60 linii. W trakcie pracy blok jest otwarty, po odpowiedzi zwija się do Kroki: N (chyba że coś się nie udało albo czeka karta zgody). Zmiana wykonana bez pytania ma dopisek bez pytania. To ten sam wynik, który dostał model, z ukrytymi sekretami. W widoku prostym bloków nie ma. CLI pokazuje to samo jako szare linie pod komendą, Telegram w wiadomości postępu.

Zmiany. Przed zatwierdzeniem zapisu pliku widać różnice w karcie potwierdzenia. Po wykonaniu różnica "przed → po" pojawia się w rozmowie i w zakładce Zmiany – także gdy plik zmieniła komenda (np. sed), bo bezpiecznik robi kopię. Sekrety w różnicach są redagowane. Każdy wpis ma przycisk cofnięcia. Różnic nie ma dla katalogów i danych w bazach.

Komendy i skille. Wpisanie / w polu rozmowy rozwija listę komend (/status, /nowosci, /raport, /audyt...) i skilli z opisami – wybór strzałkami albo kliknięciem, Tab uzupełnia komendę, żeby dopisać argumenty. /skille pokazuje zapisane procedury w rozmowie, z podglądem treści i przyciskiem uruchomienia. Panel ma trzy zakładki: Pulpit, Schemat (kropka przy nazwie, gdy agent właśnie pracuje) i Zmiany; ostatnio wybrana zostaje w przeglądarce.

Provider LLM. Przy pierwszym wejściu strona pyta, z którym providerem ma pracować Pipe: wybierasz go z listy, wklejasz klucz API (jest sprawdzany u providera, zanim zostanie zapisany) i wybierasz model z jego aktualnej listy. Ekran można pominąć – zostaje provider z instalacji. Nad polem rozmowy jest przełącznik pokazujący, kto odpowiada; rozwija listę providerów, do których jest klucz, i przełącza bez restartu, w trakcie rozmowy. /provider otwiera ekran ponownie (kolejny klucz, inny model, usunięcie klucza). Klucze leżą na serwerze w DATA_DIR/llm_keys.json (0600) i nie wracają do przeglądarki. Wybór dotyczy całego agenta: po przełączeniu z nowego providera korzystają też Telegram, CLI, rutyny i workery; WORKER_MODEL i ceny z .env dotyczą tylko providera bazowego. Kilka kluczy można też podać od razu w backend/.env (OPENAI_API_KEY, GROQ_API_KEY, ANTHROPIC_API_KEY...).

Pipe w przeglądarce z telefonu i komputera (/web)

pipe web działa na Twoim komputerze przez tunel SSH. Żeby wejść do Pipe z telefonu albo z dowolnego komputera bez tunelu, napisz w Telegramie, CLI albo pipe web jedną komendę:

/web wlacz

Pipe stawia przed sobą serwer HTTPS (Caddy w kontenerze pipe-web) i odpisuje adresem, np. https://203-0-113-9.sslip.io – to darmowa nazwa, która wskazuje na IP Twojego serwera, więc certyfikat Let's Encrypt powstaje sam, bez kupowania domeny. Z własną domeną: /web wlacz pipe.mojafirma.pl (rekord DNS musi już wskazywać na serwer). Port to 443, a gdy jest zajęty (np. przez nginx) – 8443; własny: /web wlacz 9443.

Na mikr.us Pipe rozpoznaje serwer (plik /klucz_api) i korzysta z subdomen mikr.us: strona nasłuchuje na IPv6, a mikr.us sam daje adres https://<serwer>-7443.mikrus.cloud z certyfikatem. Nic nie trzeba otwierać ani zakładać, adres się nie zmienia, ruch nie idzie przez nikogo poza mikr.us. Wymuszenie: /web wlacz mikrus.

Gdy dostawca nie wpuszcza ruchu na 80/443 (inne serwery na współdzielonym adresie, serwer w domu za routerem, panel chmury z zablokowanymi portami), certyfikatu nie da się wystawić. Pipe sprawdza to sam: jeśli publiczny adres nie jest adresem serwera albo certyfikat nie powstaje, przechodzi na tunel Cloudflare i odpisuje adresem w rodzaju https://quiet-river-1a2b.trycloudflare.com. Tunel to kontener cloudflared, który sam łączy się z Cloudflare – nie trzeba otwierać żadnego portu ani zakładać konta. Cena: ruch przechodzi przez Cloudflare (to on szyfruje połączenie z przeglądarką), szybki tunel nie ma gwarancji działania, powiadomienia na stronie przychodzą co kilka sekund zamiast od razu, a adres zmienia się po restarcie serwera – Pipe zauważa nowy i przysyla go w wiadomości (urządzenia wpuszcza się wtedy jeszcze raz). Wymuszenie: /web wlacz tunel albo /web wlacz bezposrednio.

Zanim Pipe poda link, sam go otwiera z internetu i sprawdza, czy odpowiada strona prośby o dostęp. Gdy nie, mówi dlaczego i pokazuje ostatnie linie z logów Caddy albo cloudflared.

Jak się wchodzi. Strona nie ma hasła ani tajnego linku. Otwierasz adres, naciskasz Poproś o dostęp i widzisz kod, np. K7P-4QX. W tym samym momencie Pipe pisze do Ciebie (Telegram, pipe web na innym urządzeniu, CLI): "Ktoś chce wejść do Pipe przez przeglądarkę – iPhone, Safari, IP ..., kod K7P-4QX" z przyciskami Wpuść, Tylko podgląd i Odrzuć (albo piszesz /web wpusc K7P-4QX). Sprawdzasz, czy kod się zgadza, i naciskasz Wpuść – strona sama się otwiera. Każde urządzenie wpuszczasz raz: telefon osobno, komputer osobno. Potem pamięta logowanie przez 30 dni od ostatniego użycia.

Urządzenie wpuszczone przyciskiem Tylko podgląd ma role viewer: rozmawia, czyta raporty i schemat, ale niczego nie zmienia. Wpuszczać może tylko administrator. Strona na telefonie to ten sam interfejs co pipe web – rozmowa i pulpit przełącza się przyciskami w górnym pasku. Dodana do ekranu głównego (Safari: Udostępnij → Do ekranu początkowego, Chrome: Dodaj do ekranu głównego) ma ikonę Pipe.

Gdy na serwerze działa ufw, Pipe otwiera w nim port strony (i 80, gdy strona nie jest na 443 – tam Let's Encrypt sprawdza serwer przy wystawianiu certyfikatu). Zapory u dostawcy (panel chmury) Pipe nie widzi: jeśli strona nie odpowiada, Pipe mówi, który port otworzyć. Działa w trybie docker i native (potrzebny Docker – Caddy jest kontenerem), nie w trybie obserwacji ani w Kubernetes (tam Ingress). Szczegóły zabezpieczeń: docs/security.md (Pipe w internecie).


Widoki: prosty i techniczny

Pipe ma dwa widoki, jak jedna aplikacja do dwóch rzeczy. Prosty jest dla osób nietechnicznych: rozmowa zwykłymi słowami, przypomnienia, pliki, skille i dodatki do aplikacji zewnętrznych (serwery MCP: GitHub, kalendarz, poczta). Agent sam wybiera sposób wykonania zadania, nie każe wpisywać komend, a o ważne sprawy pyta prostym pytaniem tak/nie. Techniczny ma to samo i do tego serwer: schemat na żywo, dziennik zmian z cofaniem, podatności i łatanie, kontenery, zdalne serwery.

Przy pierwszym uruchomieniu Pipe pyta, co chcesz robić. Można odpowiedzieć kilkoma słowami ("przypomnienia i maile", "pilnować serwera ze sklepem") albo wybrać widok. Widok jest wspólny dla całego agenta, tak jak język: /widok prosty, /widok techniczny (/view) w CLI, w pipe web (także przycisk w nagłówku) i na Telegramie (przyciski). Zmiana w jednym kanale przełącza pozostałe. Zapis w DATA_DIR/view.json, zmienia tylko administrator. Dopóki nikt nie wybrał, obowiązuje widok techniczny, czyli to, co Pipe pokazywał dotąd.

GdzieWidok prostyWidok techniczny
pipe webzakładki Pulpit (bez wykresów i projektów) i Dodatki, podpowiedzi na co dzieńPulpit, Schemat, Zmiany, Dodatki
CLI/pomoc i podpowiedzi / bez komend serwerawszystkie komendy
Telegrammenu /, /pomoc i klawiatura: stan, nowości, skille, pomocmenu i klawiatura jak dotąd
Agentblok WIDOK PROSTY w prompcie: zwykłe słowa, bez zargonubez zmian

Komendy serwera (/zalataj, /mapa, /audyt i inne) działają w obu widokach po wpisaniu, widok prosty tylko ich nie podsuwa. Zakładka Dodatki w pipe web zbiera skille (uruchomienie, podgląd), podłączone serwery MCP i dodawanie nowych z GitHuba (/pobierz, /mcp dodaj).

Pierwsze uruchomienie bez serwera. pipe web bez --host i bez zapisanego połączenia otwiera kreator: najpierw widok, potem miejsce. Na tym komputerze uruchamia backend w Dockerze z tego repozytorium (na Linuksie Pipe zarządza tym komputerem, na Windows i macOS pracuje we własnym kontenerze Docker Desktop, backend/docker-compose.desktop.yml). Na moim serwerze łączy się przez SSH z adresem i hasłem albo kluczem, klonuje repozytorium do /opt/pipe i uruchamia install-server.sh bez pytań (bez modelu; klucz API dodajesz potem na stronie). Hasło zostaje w procesie pipe web: nie trafia na dysk, do backendu ani do modelu. Po haśle Pipe dopisuje na serwerze własny klucz (~/.pipe/keys) i kolejne połączenia idą już nim. Połączenie zapisuje się w ~/.pipe/app.json, więc następne pipe web i zwykłe pipe łącza się same. Kreator wraca z pipe web --setup albo po kliknięciu adresu serwera w nagłówku.


Język: angielski albo polski

PIPE_LANG=en (domyślnie) albo PIPE_LANG=pl przełącza cały produkt, nie tylko język odpowiedzi modelu. Język można też zmienić w trakcie pracy, bez restartu: /jezyk pl / /jezyk en (/language) w CLI, w pipe web (komenda albo przycisk z flagą w nagłówku) i na Telegramie. Wybór jest wspólny dla całego agenta – pozostałe kanały przełączają się same – zapisuje się w DATA_DIR/language.json i obowiązuje do ręcznej zmiany PIPE_LANG w .env. Zmienia tylko administrator.

WarstwaCo się zmienia
Agentsystem prompt, opisy 24 narzędzi, prompty workerów, rutyn, skanu serwera i VIBE
Komunikatypytania o potwierdzenie, plan bezpiecznika, wyniki narzędzi, błędy walidacji
Czuwanietytuły alertów, poranny raport, /zmiany, /zdrowie, /audyt z poprawkami, powitanie
MCPtytuły i opisy narzędzi serwera MCP, instrukcje dla zewnętrznego agenta
KlienciCLI (--lang pl; bez niego CLI i pipe web mówią językiem serwera), bot Telegrama (menu /, przyciski, etykiety), kreator i instalator
Skillewbudowane skille w wybranym języku

Znaczniki protokołu – [POTWIERDZ], [BLAD], [ODMOWA], [PAMIEC], [ZREDAGOWANO: ...] – są takie same w obu językach: serwer rozpoznaje po nich status ramki, a klienci zamieniają je na etykiety w swoim języku. Komendy mają angielskie aliasy (/report, /changes, /undo, ...), które działają obok polskich.

Dane zapisane wcześniej (SERVER.md, VIBE, własne skille, wpisy dziennika) zostają w języku, w którym powstały.


MCP – Pipe jako brama dla innych agentów i klient cudzych serwerów

Pipe jako serwer MCP

Claude Code, Cursor albo własny agent dostaje narzędzia Pipe zamiast gołej powłoki na produkcji:

NarzędzieCo robi
run_commandkomenda przez klasyfikator Pipe: odczyt od razu; zmiana → zgoda administratora, potem bezpiecznik i dziennik; zakazana → odmowa
get_approvalstan zgody i wynik (tylko dla agenta, który o nią prosił)
read_fileplik hosta; pliki z sekretami nie są wydawane, sekrety w treści – redagowane
server_status, server_changes, infra_map, health_checks, security_audit, journalwiedza Pipe o serwerze
ask_pipepytanie do agenta Pipe (zna SERVER.md, DIRECTORY, historie) – w roli tylko do odczytu

Zgoda przychodzi na Telegram z komendą i planem bezpiecznika (kopia, nginx -t, weryfikacja) oraz przyciskami Zatwierdź / Odrzuć; w CLI – /zgody. Agent dowiaduje się o wyniku przez get_approval.

Połączenie z laptopa – most stdio w CLI, przez ten sam tunel SSH i tokeny. Gotowa konfiguracja dla Claude Code, Claude Desktop, Cursora, Codexa, Hermes Agent i OpenClaw: pipe connect <aplikacja> --host root@serwer (docs/cli.md). Ręcznie:

{"mcpServers": {"pipe": {"command": "pipe", "args": ["--mcp", "--host", "root@serwer"],
                         "env": {"AGENT_TOKEN": "<token>"}}}}

Osobny token dla agenta: python3 -m backend.tokens add claude-code --role admin (albo --role viewer: agent tylko czyta, nie może prosić o zgody). Na serwerze – endpoint Streamable HTTP: MCP_PORT=7381, http://127.0.0.1:7381/mcp, token w Authorization: Bearer.

Pipe jako klient MCP

Pipe korzysta też z cudzych serwerów MCP – np. poczty, kalendarza, GitHuba albo Grafany – jak z własnych narzędzi.

Okno /mcp. /mcp bez argumentów otwiera okno (jak /mcp w Claude Code): w CLI ramka wybierana strzałkami, w pipe web osobny panel, na Telegramie lista z przyciskami. Widać w nim podłączone serwery ze stanem, a po wybraniu – co dokładnie działa, jakie ma narzędzia (które pytają o zgodę) i przyciski Połącz ponownie, Wyłącz, Usuń.

Gotowe dodatki (backend/addons/, nic nie jest włączone z góry):

DodatekCo dajeCzego potrzebuje
outlookpoczta, kalendarz i kontakty konta Microsoft (outlook.com, hotmail)nic – po dodaniu napisz "zaloguj mnie do Outlooka": link microsoft.com/devicelogin i kod, logowanie zostaje po restarcie
microsoft365Outlook i Teams konta firmowego albo szkolnegoto samo logowanie kodem; niektóre firmy wymagają zgody administratora
googleGmail (czytanie, szkice), Kalendarz (odczyt), Dysk, Dokumenty, Arkuszewłasny klient OAuth w Google Cloud i refresh token – okno prowadzi krok po kroku
githubrepozytoria, issues, pull requesty, Actionstoken GitHuba (fine-grained)

Klucze wpisuje się w oknie /mcp w pipe web albo w CLI (ukryte pole). Leżą w backend/data/mcp_secrets.json (0600) i nie trafiają do modelu ani do przeglądarki; Telegram kluczy nie przyjmuje. W rozmowie też działa: "podłącz mi Outlooka" – agent zna katalog (mcp_manage catalog) i dodaje dodatek po jednym TAK. Dodatki z logowaniem (state: true) dostają własny wolumen Dockera na tokeny; usunięcie dodatku usuwa go razem z zapisanym logowaniem. Nowy dodatek to jeden plik JSON – opis w backend/addons/README.md.

Własny serwer, spoza katalogu:

/mcp dodaj github npx -y @modelcontextprotocol/server-github GITHUB_PERSONAL_ACCESS_TOKEN=${MCP_GITHUB_TOKEN}
/mcp dodaj fetch uvx mcp-server-fetch
/mcp dodaj docs https://mcp.example.com/mcp TOKEN=${MCP_DOCS}
/mcp                      # lista i stan;  /mcp usun github;  /mcp odswiez

Albo w rozmowie: "podłącz serwer MCP GitHuba" – wtedy jedno TAK z podglądem tego, co Pipe uruchomi.

Gdzie działanpx, uvx i obraz Dockera (także docker run ... z .mcp.json innych aplikacji) – zawsze w osobnym kontenerze: bez plików serwera, bez docker.sock, bez uprawnień (--cap-drop ALL, użytkownik nobody), z limitem pamięci i procesów. Serwer widzi tylko sieć. Serwery HTTP – pod podanym adresem
Sekretytylko jako ${MCP_NAZWA} – wpisane w oknie /mcp albo w backend/.env (np. MCP_GITHUB_TOKEN=...); nie wpisuj tokenu w czat; trafia do kontenera jako zmienna, nigdy w argumentach
Zgodynarzędzie oznaczone przez serwer jako odczyt – bez pytania; każde inne – TAK z widocznymi argumentami
Tokeny modelunarzędzia serwera to grupa mcp:<nazwa> ładowana na żądanie: zwykła rozmowa ich nie wysyła, wiadomość z nazwą serwera ("na githubie...") je włącza
Wyniktreść z zewnątrz: w tej turze YOLO jest wyłączone; argument z sekretem nie wychodzi do serwera
Tryb obserwacji, viewertylko narzędzia-odczyty; nowego serwera nie da się dodać

Konfiguracja: backend/data/mcp_servers.json (0600). Start serwera stdio trwa od kilkunastu sekund do minuty (npx / uvx instalują pakiet w kontenerze); Pipe łączy się w tle po restarcie.

Obsługiwane wersje protokołu (w obie strony): 2026-07-28 (server/discover, wersja w _meta, nagłówki Mcp-Method/Mcp-Name) i starsze z initialize (2025-11-25, 2025-06-18, 2025-03-26).


Internet bez kluczy API

Agent sam sięga do sieci, gdy odpowiedź zależy od wiedzy spoza serwera – nie trzeba go o to prosić ani podawać żadnego klucza:

Przykłady: "nginx sypie upstream prematurely closed – co to?", "czy nasz PostgreSQL jest jeszcze wspierany?", "czy nginx na tym serwerze ma znane dziury?". Agent podaje źródła. Zabezpieczenia (sekrety, adresy spoza wyników, sieć prywatna, wstrzymanie YOLO) opisuje docs/security.md. WEB_SEARCH=off wyłącza internet.

Aktualizacja samego Pipe

Wpisz /aktualizuj (po angielsku /update) albo napisz agentowi "zaktualizuj się"; /aktualizuj sprawdz tylko pokazuje wersje i to, czy jest nowsza. Agent sprawdza zdalne repozytorium i uruchamia osobny kontener pomocniczy, który w katalogu instalacji wykonuje git pull --ff-only i podmienia usługi Pipe na podpisany obraz wydania z GHCR (a gdy go nie ma, buduje je: docker compose up -d --build). Osobny kontener jest potrzebny, bo agent nie może wymienić kontenera, w którym sam działa – proces zginąłby w połowie.

Popraw tę stronę na GitHubie