Pri otevrenem portalu zacalo vedle nej sekat prehravani videa, po zavreni bylo hned dobre. Neslo o smycku v kodu: zivy prenos udalosti je SSE, jedno spojeni na celou aplikaci, a setTimeout je v nem jen na odstup pri znovupripojeni. Byly to tri veci. Rozmazavani plne barvy. `.glass`, podklad skoro kazdeho panelu, mel backdrop-filter blur(14px). Jenze pod kartami je plna barva (bg-ink-950 na dashboardu), takze se rozmazavala jednolita plocha: zadny rozdil videt nebyl a kazda karta si za to drzela vlastni rozmazanou vrstvu ve skladaci. V kodu je glass na 58 mistech, na jedne obrazovce jich je snadno dvacet. Rozmazani zustava na peti mistech, kde pod nim neco opravdu projizdi: lepici hlavicky, podklad modalu, prekryv menu na mobilu. Nekonecne animace nad velkymi rozmazanymi plochami. Prihlaseni a verejny web mely zare o velikosti 26 az 34 rem s blur(120px), kterym se donekonecna animovala pruhlednost - to znamena prepocitavat obrovskou vrstvu sedesatkrat za sekundu, i kdyz se na strance nic nedeje. Zare zustaly, animace zmizela. Pribylo prefers-reduced-motion. Kazda udalost prekreslila cely dashboard. EventStreamProvider mel v tomtez kontextu stav spojeni, odber i seznam poslednich udalosti. Seznam se meni pri kazde udalosti, takze se menila cela hodnota kontextu a prekreslil se kazdy, kdo si jen zaridil odber - tedy vsechny dotazy s refetchOn na strance, i kdyz o ten typ udalosti nestaly. Pri behu automatizace se cely dashboard prekresloval nekolikrat za sekundu, a s nim dvacet rozmazanych vrstev. Kontext je proto rozdeleny: useEventStream da stav a odber, useEventLog seznam udalosti. Filtr sekci nefiltroval. Seznam ticketu sklada adresu dotazu v useMemo, ale v zavislostech chybely groupId, typeId, tag a stage - adresa se po prepnuti sekce neprepocitala a data se nenacetla znovu. Driv to nevadilo, byly to filtry nastavitelne jen odkazem, ktere se po nacteni nemenily. Se zalozkou "Vsechny tickety" a jejim vyberem sekce je to chyba, ktera je videt. Overeno: groupId=grp_servicedesk vrati jeden ticket, groupId=none zbyle dva. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
csbot-prototype
Web a klientsky portal firmy zamerene na automatizace, voiceboty, integrace, dashboardy, tickety a incident management.
Jedna aplikace v jednom containeru: Express obsluhuje API i zbuildovanou
React aplikaci. Bezi v AppFactory za reverse proxy na /apps/<app-id>.
Rychly start
npm install
npm run build
npm start
Aplikace nasloucha na 0.0.0.0:3000.
Lokalni vyvoj s hot reloadem (API na 3000, web na 5173):
npm run dev
Povinne endpointy
| Cesta | Ucel |
|---|---|
/health |
Health check pro AppFactory, vraci 200 |
/docs |
Swagger UI |
/openapi.json |
OpenAPI definice |
Verejne pres proxy jako /apps/<app-id>/health a /apps/<app-id>/docs.
Demo prihlaseni
| Heslo | Role | |
|---|---|---|
admin@automia.cz |
demo1234 |
interni spravce |
klient@firma.cz |
demo1234 |
klient |
Environment variables
| Promenna | Povinna | Vychozi | Popis |
|---|---|---|---|
PORT |
ne | 3000 | Port containeru, urcuje AppFactory sablona |
ROOT_PATH |
ne | prazdne | Prefix proxy, napr. /apps/csbot-prototype |
JWT_SECRET |
ano v produkci | - | Podpis tokenu, bez nej aplikace nenastartuje |
JWT_EXPIRES_IN |
ne | 8h | Platnost tokenu |
PUBLIC_ORIGIN |
ne | prazdne | Verejna domena pro absolutni adresy webhooku |
CORS_ORIGIN |
ne | localhost | Povolene originy, jen pro lokalni vyvoj |
BRAND_NAME |
ne | WorkNuke | Nazev produktu v titulku Swaggeru a OpenAPI |
Klient je staticky soubor, takze runtime promenne containeru do prohlizece
nedosahnou. Nazev znacky si bere z VITE_BRAND_NAME pri buildu, jinak
z vychozi hodnoty v web/src/config/brand.ts.
Secrets se nikdy nelogují ani neukladaji do kodu.
Skripty
| Prikaz | Co dela |
|---|---|
npm run build |
Zbuilduje server i web do dist/ |
npm start |
Spusti zbuildovanou aplikaci |
npm run dev |
Vyvoj s hot reloadem |
npm run typecheck |
Kontrola typu bez generovani vystupu |
Dokumentace
Podrobnosti jsou ve slozce documentation/. Pred upravou projektu staci precist ji, neni nutne prochazet cely kod.
Pravidla pro AI asistenty a nastroje jsou v AGENTS.md.