API na pierwszym miejscu
Każda operacja panelu jest dostępna w API, bo panel korzysta z tego samego API co agenci. Nic nie jest zarezerwowane tylko dla ludzi przy ekranie.
Firmowa wiki od devstyle
WikiStyle to firmowa wiki, którą zbudowaliśmy w devstyle dla naszych firm. Agenci AI czytają ją i piszą do niej przez API tak samo łatwo, jak ludzie przez panel. Strony w Markdown, karty z polami, historia każdej zmiany i uprawnienia pilnowane na serwerze.
# agent AI czyta stronę
GET /v1/pages/by-path/produkty/cennik
Authorization: Bearer wsk_...
# długa strona? tylko jedna sekcja
GET /v1/pages/{id}?sections=rabaty
# co się zmieniło od ostatniego razu
GET /v1/events?after=1842
200 OK
{
"path": "produkty/cennik",
"title": "Cennik",
"version": 7,
"approx_tokens": 812,
"toc": [
{ "id": "rabaty",
"heading": "Rabaty",
"approx_tokens": 120 }
],
"content": {
"trust": "untrusted",
"markdown": "# Cennik\n..."
}
}
Dlaczego własny system
Nasi agenci AI pracują na wiedzy firmy codziennie. Potrzebowaliśmy miejsca, z którego czytają i do którego piszą bez sztuczek, a ludzie mają przy tym pełną kontrolę: kto co widzi, kto co zmienił i jak to cofnąć.
Każda operacja panelu jest dostępna w API, bo panel korzysta z tego samego API co agenci. Nic nie jest zarezerwowane tylko dla ludzi przy ekranie.
Wiedza firmy w jednym miejscu, dostępna dla całego zespołu i dla agentów działających gdziekolwiek: na laptopie, na serwerze, w chmurze.
Uprawnienia sprawdza serwer przy każdym odczycie i zapisie, tak samo dla człowieka i agenta. Wyszukiwarka też je respektuje.
Funkcje
Od pierwszej strony w Markdown, przez historię zmian i propozycje, po karty z polami, o które można pytać jak o tabelę.
Strona to zwykły Markdown: człowiek w panelu widzi to samo, co agent w API. Linki piszesz jako [[Tytuł]], a system pamięta, dokąd prowadzą, nawet po zmianie tytułu.
<!-- produkty / Developer Jutra -->
# Developer Jutra
Program dla programistów, którzy chcą
iść dalej. Ceny: [[Cennik]].
Prowadzący: [[Mentorzy|zobacz listę]].
## Dla firm
Szczegóły:
[[sprzedaz/Oferta dla firm]].

Każdy zapis to nowa wersja z autorem: osobą albo konkretnym agentem. Gdy dwie osoby (albo osoba i agent) zmieniają tę samą stronę, drugi zapis nie nadpisze pierwszego.
PATCH /v1/pages/{id}
{
"base_version": 7,
"ops": [
{ "op": "find_replace",
"find": "10%", "replace": "15%" }
],
"message": "Nowy rabat dla partnerów"
}
# ktoś zdążył zmienić stronę wcześniej
409 { "code": "VERSION_CONFLICT",
"data": { "current_version": 8, "diff": ... } }
Każda przestrzeń ma przełącznik „zmiany wymagają akceptacji”. Wtedy zapis agenta albo czytelnika nie zmienia strony, tylko tworzy propozycję, którą przegląda człowiek.
# przestrzeń "finanse" wymaga akceptacji
PATCH /v1/pages/{id}
{ "base_version": 4, "ops": [ ... ] }
202 Accepted
{
"proposal": {
"status": "open",
...
}
}
# strona bez zmian, propozycja czeka
# na decyzję człowieka
Wyszukiwanie pełnotekstowe w Postgresie i semantyczne na pgvector, połączone w jeden ranking. Część semantyczna znajduje strony o podobnym znaczeniu, także gdy nie ma w nich szukanych słów.
GET /v1/search?q=rabat dla partnerów
{
"items": [{
"path": "produkty/cennik",
"title": "Cennik",
"section": { "id": "rabaty",
"heading": "Rabaty" },
"snippet": {
"trust": "untrusted",
"markdown": "Partnerzy dostają **rabat**..."
}
}],
"total": 3
}
Karta to strona z typem i polami: kurs, osoba, produkt. Ma treść, historię i linki jak każda strona, a do tego dane, które da się filtrować i sortować.
# kursy droższe niż 2000 zł, od najdroższego
POST /v1/cards/query
{
"type": "kurs",
"where": [{
"field": "cena", "op": "gt",
"value": { "amount": "2000",
"currency": "PLN" }
}],
"sort": [{ "field": "cena", "dir": "desc" }]
}
A do tego
Każdy widzi w panelu, co czeka na niego: propozycje do decyzji, strony po terminie przeglądu, wyłączone klucze i webhooki.
Kto (osoba albo klucz agenta), kiedy i którą stronę czytał. Wpisy znikają po 90 dniach. Odczyty przestrzeni zastrzeżonej widzą tylko jej członkowie.
Strony jako pliki Markdown z [[linkami]] i nagłówkiem metadanych, razem z polami kart. Eksport obejmuje tylko to, co eksportujący może czytać.
Spis treści podaje rozmiar każdej sekcji w tokenach. Strona do 20 tys. tokenów przychodzi w całości, dłuższa jako spis treści do pobrania po sekcjach.
Usuniętą stronę (z podstronami) można przywrócić przez 30 dni. Potem znika na dobre, razem z historią, załącznikami i fragmentami w wyszukiwarce.
devstyle i slowbiz to osobne organizacje z twardo oddzielonymi danymi. Jedno konto osoby, przełącznik organizacji w panelu.
Agenci AI
Agent AI (na przykład Claude Code) dostaje adres opisu OpenAPI i własny klucz. Resztę wyczyta z opisu: wyszuka, przeczyta potrzebną sekcję, poprawi stronę albo zaproponuje zmianę. Ty decydujesz, ile mu wolno.
Ok. 60 operacji: strony, wersje, propozycje, karty, wyszukiwarka, załączniki, zdarzenia, webhooki, klucze. Każda z opisem i przykładem w OpenAPI, który można pobrać po obszarach.
Osobny klucz dla każdego agenta: właściciel, odczyt albo zapis, wybrane przestrzenie. Klucz nieużywany przez 90 dni wyłącza się sam, a w historii widać, który agent co zmienił.
Spis treści z rozmiarem sekcji, pobieranie wybranych sekcji, wyniki wyszukiwania z krótkim fragmentem. Strona jako JSON albo sam Markdown, do wyboru.
Podmiana sekcji, znajdź i zamień, dopisanie na końcu albo cała treść. Zawsze z numerem wersji, więc agent nie nadpisze cudzej zmiany. Do 50 zmian stron w jednym wywołaniu.
Agent pyta o zmiany od ostatniego kursora albo dostaje webhook podpisany HMAC, z pięcioma ponowieniami (ostatnie po 6 godzinach). W zdarzeniu są tylko identyfikatory; treść pobiera przez API.
API oddaje tekst strony w polu oznaczonym jako niezaufane, a opis API mówi agentowi wprost, że nie wykonuje się go jako instrukcji.
Uprawnienia
Agenci i ludzie dostają dokładnie tyle, ile im nadano. Reguły sprawdza API przy każdym zapytaniu, a baza danych pilnuje ich drugi raz.
Przestrzeń zarządu widzą tylko osoby dopisane imiennie. Admin organizacji też nie, jeśli go tam nie ma.
Klucz agenta ma mniejsze z dwóch: swój zakres albo bieżące prawa właściciela. Gdy człowiek traci dostęp, jego agent traci go razem z nim.
Wyszukiwarka, feed zmian, linki zwrotne i liczby wyników nie zdradzają, że niewidoczna strona istnieje.
Link do strony, której czytelnik nie widzi, pokazuje „strona niedostępna”, bez tytułu i przestrzeni celu.
Admin, edytor i czytelnik. Klucz agenta nigdy niczym nie zarządza: przestrzenie, ludzie, klucze i typy kart zostają w rękach ludzi.
Każdy wiersz należy do jednej organizacji, a izolację wymusza Postgres (row-level security). Testy sprawdzają, że nic nie przechodzi między organizacjami.
Prywatność i bezpieczeństwo
W wiki trafiają finanse, umowy i sprawy zespołu. Dlatego bezpieczeństwo jest w fundamentach systemu, a nie doklejone na końcu.
Nasze konto AWS, baza Postgres w Supabase i embeddingi w AWS Bedrock: wszystko w regionie eu-central-1.
Konta firmowe Google, sesja 30 dni. Raz na dobę system sprawdza, czy konto nadal działa, więc usunięte konto traci dostęp najpóźniej po dobie.
Zapis z kluczem API, tokenem albo hasłem jest odrzucany. Komunikat wskazuje linię i rodzaj sekretu, ale nigdy nie powtarza jego wartości.
W logach i w dzienniku zdarzeń są tylko identyfikatory: bez tytułów, treści stron, imion i adresów e-mail.
Markdown przed wyświetleniem przechodzi przez filtr: bez skryptów i osadzonych ramek. Załączniki pobierasz z osobnej domeny, przez linki ważne 5 minut.
Raz na dobę zrzut bazy trafia na nasze konto AWS i leży tam 30 dni. Nieudana kopia wysyła alarm mailem.
Panel
Ludzie pracują w panelu, który korzysta z tego samego API co agenci. Na telefonie wygodnie się w nim czyta i robi drobne poprawki, bez instalowania aplikacji.
Skróty klawiszowe w panelu. Na Macu Cmd zamiast Ctrl.
Gdzie jesteśmy
WikiStyle jest zbudowany i sprawdzony testami. Trwa wdrożenie na nasze konto AWS; panel będzie działał pod adresem app.wikistyle.pl. Pierwsi użytkownicy to zespoły i agenci AI naszych firm.
Mniej znaczy pewniej
Każda funkcja to kolejne miejsce, w którym coś może pójść nie tak. Agenci sami wyszukują i czytają, więc wiki nie musi myśleć za nich. Zamiast komentarza jest propozycja zmiany, a zamiast wbudowanych integracji jedno API dla wszystkich: naszych systemów i agentów.