Irányítópult

Platform globális áttekintés

Élő rendszer
Összes bérlő
—
Regisztrált tenant
Aktív előfizetés
—
Fizető vagy Trial
Felfüggesztett
—
Korlátozott bérlők
Csomag sablonok
4
FREE / STARTER / PRO / ENT
Legutóbb regisztrált bérlők
Az utolsó 5 regisztrált bérlő
Bérlő neve Státusz Regisztráció Műveletek
Betöltés...
Regisztrált bérlők listája
Keresés, szűrés és egyedi kezelés
Cég / bérlő Kapcsolattartó Csomag Előfizetés Használat Regisztráció Műveletek
Betöltés...
Rendszerszintű előfizetési csomagok
Verziózott árak, limitek és szolgáltatások kezelése
Csomag Verzió Limitek Funkciók Havi / éves ár Előfizetők Állapot Művelet
Betöltés...
Hirdetési kampányok és reklámok
Globális hirdetések vagy bérlő-specifikus promóciók kezelése a kijelzőkön
Kép/Videó Hirdetés Név Típus Célcsoport (Cég) Időtartam Státusz Műveletek
Betöltés...
Globális kijelző lista és állapot
Az összes bérlőhöz csatlakoztatott eszköz statisztikái és erőforrásai
Bérlő (Cég) Eszköz Név Kapcsolat Player / Deployment Kívánt → aktív kiadás Haladás Utolsó Életjel Művelet
Betöltés...
Globális rendszer audit napló
Megváltoztathatatlan biztonsági és műveleti naplók
Időpont Bérlő Felhasználó Művelet Típus Részletek
Betöltés...

1. Többnyelvű Tartalom és HTML5 Sablonok Kezelése

Ez az útmutató leírja, hogyan lehet dinamikus, többnyelvű HTML5 sablonokat, illetve nyelvenként eltérő kép-, videó- és HTML média-változatokat beállítani a KioskPilot V3 rendszerben.

Működési Elv

A KioskPilot V3 egyetlen verziózott tartalommodellt használ. A többnyelvűség ugyanabban a ContentVersion rekordban, nyelvenkénti ContentVersionAsset kapcsolatokkal működik. HTML5 tartalomnál ugyanaz a fájl hash alapú nyelvátadást is kezelhet; képhez, videóhoz és HTML-hez nyelvenként külön média is rendelhető.

  • A) Egyetlen HTML sablon: Egy adott kiállításhoz vagy szállodai információhoz elegendő egy darab HTML fájlt feltölteni. A képek, videók és a dizájn közösek, a szövegeket pedig maga a sablon vagy a sablonba ágyazott adat tartalmazza.
  • Hash alapú nyelvátadás: A TV Player a sablon iframe címe végére fűzi az aktív nyelvet hashként, például #lang=en. A sablon JavaScriptje figyeli a hashchange eseményt, így a szöveg villódzás nélkül vált.
  • B) Nyelvenkénti média-változat: Kép, videó és HTML tartalom esetén a tartalomblokkhoz nyelvenként külön médiafájl rendelhető. Példa: magyar képhez angol kép, magyar videóhoz angol videó, magyar HTML-hez angol HTML.
  • Típushelyes változatok: A szerkesztő képhez képet, videóhoz videót, HTML-hez HTML-t kínál nyelvi változatként. Ez azért fontos, mert a Player a bázis média típusához illeszkedő megjelenítő elemet használ.

A HTML5 Sablon Kód Felépítése

Minden többnyelvű sablonnak az alábbi JavaScript szerkezetet kell tartalmaznia a nyelvi váltás kezelésére:

<script>
    // 1. Fordítási adatszerkezet
    const translations = {
        hu: {
            title: "Üdvözöljük a Szállodánkban!",
            desc: "Kérjük, válasszon nyelvet a mobilján."
        },
        en: {
            title: "Welcome to Our Hotel!",
            desc: "Please select a language on your mobile."
        },
        de: {
            title: "Willkommen in unserem Hotel!",
            desc: "Bitte wählen Sie eine Sprache auf Ihrem Mobiltelefon."
        }
    };

    // 2. Nyelv beállítása a felületen
    function applyLanguage() {
        const hash = window.location.hash || '';
        const match = hash.match(/lang=([a-z]{2})/);
        const lang = (match && match[1]) ? match[1] : 'hu';

        const data = translations[lang] || translations['hu'];
        document.getElementById('title').textContent = data.title;
        document.getElementById('desc').textContent = data.desc;
    }

    // 3. Eseményfigyelők regisztrációja
    window.addEventListener('DOMContentLoaded', applyLanguage);
    window.addEventListener('hashchange', applyLanguage);
</script>

Verziózott Tartalom és Nyelvi Assetek

A 020_template_content_versions.sql migráció bevezette a változtathatatlan kp_template_versions és kp_content_versions rekordokat, valamint a normalizált kp_content_version_assets nyelvi médiakapcsolatot. A nyelvi kép, videó, hang vagy HTML ebben a modellben nem fájlútvonalként, hanem tenant-scope-os media_id, locale és szerep alapján tartozik a tartalomverzióhoz. A négy rendszer-sablon publikált v1 verziója elkészült.

A Tenant App és a Content API kizárólag ezt a verziózott modellt írja. A gyökér kp_contents rekord az identitást és a draft/published mutatókat tartja; a tényleges tartalomadat a kp_content_versions.data_json, a média pedig a kp_content_version_assets.media_id kapcsolatban van. Fájlútvonalat nem mentünk fordításként.

Kanonikus API Példa

{
  "name": "Múzeumi bemutató",
  "templateVersionId": "publikalt-template-verzio-id",
  "defaultLocale": "hu",
  "fallbackLocale": "hu",
  "channels": ["PLAYER"],
  "dataJson": {
    "fields": {},
    "presentation": { "orientation": "PORTRAIT" }
  },
  "assets": [
    { "locale": "hu", "role": "PRIMARY", "mediaId": "magyar-media-id", "sortOrder": 0 },
    { "locale": "en", "role": "PRIMARY", "mediaId": "angol-media-id", "sortOrder": 0 },
    { "locale": "he", "role": "PRIMARY", "mediaId": "heber-media-id", "sortOrder": 0 }
  ]
}

Ha egy HTML fájl maga tartalmazza az összes fordítást, elegendő egy alapnyelvi PRIMARY asset. A Player az aktív nyelvet #lang=xx hashként adja át. Ha nyelvenként külön HTML készült, minden nyelv saját mediaId assetet kap.

A szerkesztői HTML előnézetek sandboxolt iframe-ben futnak (allow-scripts, referrer nélkül), hogy az egyedi HTML5 tartalom tesztelhető maradjon, de ne kapjon teljes szerkesztői oldal-hozzáférést. Teljes CSP/template CMS policy külön hardening döntés marad.

Visitor Remote Nyelvváltás

A látogatói távirányító csak akkor mutat nyelvválasztót, ha a visitor profilban engedélyezett a SWITCH_LANGUAGE action, és a tenant vagy device profil több támogatott nyelvet ad vissza.

A kpGo nyelvválasztó zászlóként jeleníti meg a támogatott nyelveket, a zászló alatt rövid locale-kóddal. Az aktív nyelv lime kiemelést, a folyamatban lévő váltás pulzáló keretet kap. HU, EN, DE, UA/UK, FR, ES, IT, RU, PL, EL, HE, SK, RO és ZH saját zászlóval rendelkezik; ismeretlen locale-nál földgömb látható. A teljes nyelvnév tooltipben és aria-label attribútumban megmarad, az aktív állapotot pedig aria-pressed is jelzi.

Nyelvváltáskor a kpGo PWA SWITCH_LANGUAGE parancsot küld, az API ellenőrzi az engedélyezett nyelveket, a Player pedig vagy nyelvi média-változatra vált, vagy HTML iframe esetén továbbadja a #lang=xx hash értéket.

A nyelvváltás nem optimista: a mobil a választott nyelvgombot folyamatban állapotban mutatja, de az aktív nyelvet csak a Player APPLIED ACK-ja után módosítja. Az API az alkalmazott eseményt az eredeti SENT payloadhoz kapcsolja, ezért a kért locale adatbázisban is megmarad. A sikeres snapshot egyszerre frissíti a kijelző tartalmi nyelvét, a Remote aktív nyelvgombját, a profil rendszergombjait és a Remote HU/EN kezelőfelületét. Folyamatban lévő nyelvparancsnál rövid, 800 ms-os célzott poll működik legfeljebb 12 másodpercig; utána a normál 10 másodperces állapotpoll marad. Automatizált ellenőrzés: npm run test:visitor-language-ack és npm run verify:surface-contract.

A POST /visitor/join és GET /visitor/session válasz kompatibilis felső szintű mezők mellett snapshot objektumot is ad: version, sequence, serverTime, state, currentLanguage, lastAction, controllerLease, controllerQueue és profile. A kpGo PWA ezt használja oldalfrissítés vagy hálózati reconnect után a nyelv, vezérlési jog, várólista és utolsó parancs állapotának visszaállítására.

A publikus visitor API alap védelmet is kapott: a POST /visitor/join IP-alapon 5 perces ablakban legfeljebb 20 próbálkozást enged, a POST /visitor/actions pedig visitor controllerenként 250 ms cooldown-t és 60 másodperces ablakban 90 parancsot enged. Limit esetén 429 és Retry-After fejléc érkezik.

A parancsok replay-védettek: a kpGo PWA minden POST /visitor/actions kéréshez clientActionId-t küld. Ugyanaz a clientActionId ugyanazzal a payload-dal idempotens választ ad (replayed: true), más payload-dal pedig 409 CLIENT_ACTION_REPLAY_MISMATCH választ kap, így egy hálózati újraküldés nem indítja el kétszer ugyanazt a kijelző-parancsot.

A staff beavatkozások auditáltak: a /visitor/sessions/:sessionId/pause, /resume és /end műveletek VISITOR_SESSION_PAUSED, VISITOR_SESSION_RESUMED és VISITOR_SESSION_ENDED_BY_STAFF audit eseményt írnak. A payload tartalmazza a sessiont, kijelzőt, előző és új állapotot, valamint a művelet staff forrását.

A Visitor Remote módok MVP-ben explicit scope-oltak: jelenleg csak a SINGLE_CONTROLLER támogatott, rövid lease-szel és várólistás átadással. A későbbi FREE_FOR_ALL, SHARED_CONTROL, VOTING, TEAM és COMPANION módok nem menthetők; az API 422 MODE_NOT_SUPPORTED választ ad. A profilválaszok modeCapabilities mezőben jelzik az effektív módot és képességeket.

A Visitor Remote regressziós smoke futtatható: npm run smoke:visitor-remote. Ez lefedi a TST-019..023 automatizált API/state/security kapukat, a TST-024 alap PWA/statikus előfeltételeit, a TST-025 navigációt és a TST-026 két böngésző-session közötti lejárt-lease átadást. A script futásonként izolált smoke kliens IP-t használ, hogy a saját join rate limit védelmünk ne zavarja a regressziós futást. A valós iOS/Android böngésző, zoom, képernyőolvasó és billentyűzet ellenőrzés továbbra is manuális kapu, amíg nincs Playwright vagy más böngésző runner telepítve.

Vezérlői lease és háttérben maradt böngésző: a GET /visitor/session állapotlekérés önmagában nem hosszabbítja meg a vezérlést. Így egy háttérben futó, de már nem használható régi böngésző nem tarthatja korlátlanul fogva a kijelzőt. A lease-t tényleges Remote parancs újítja meg; lejáratkor a várólista első még élő sessionje tranzakciósan, sorrendhelyesen lép elő. A régi vezérlő pollja nem ugorhat a várakozó elé. Ha nincs várakozó, a következő tényleges parancs újra megszerezheti a vezérlést. A Player a lease lejárata után visszaállítja a QR-kódot.

Kapcsolódási átmenet: a Player 3.0.15 a HTML-tartalomnak külön jelzi az új vezérlő tényleges átvételét és az alkalmazott Remote-parancsot. A MikroCsodák Sales Showcase 1.4.0 „A kijelző most a te kezedben van” visszajelzése legfeljebb 3 másodpercig látható, az első APPLIED parancsra azonnal eltűnik, és egy aktív lease alatti iframe- vagy nyelvi újratöltés nem indítja újra. Ez vizuális átmenet; nem maga a vezérlői jogosultság és nem hosszabbít lease-t.

Vegyes nyelv elkerülése: három külön réteget kell lokalizálni. A Player tulajdona a QR-kártya címe és Showcase CTA-ja; ezek HU/EN rendszer-fallbackje Vezesd a kijelzőt / Control the display és OLVASD BE MOST / SCAN NOW. A publikált Remote Profile headline-, helper- és rendszergomb-címkéi locale-mapek, a hiányzó érték a profil deklarált fallback nyelvét követi. A HTML-tartalom saját látható szövegeit maga a sablon váltja: a Sales Showcase 1.4.0-ban a telefon-grafika, a TV öt miniatűr ikonja, a QR biztonsági díszfelirata és a dokumentumcím is HU/EN. A Player által rajzolt QR-t nem szabad a tartalom HTML-jébe másolni.

A Tenant App tartalomblokk előnézete a verzió assets listájából dolgozik: több PRIMARY locale esetén nyelvválasztót mutat, és kép/videó/HTML esetén az adott nyelvhez rendelt mediaId tartalmát jeleníti meg.

MikroCsodák álló látogatói pilot

Az Álló totem oszlop 1080×1920-as kijelző alapképernyője a kétnyelvű MikroCsodák – Álló látogatói pilot 1.0.0. A lapozásmentes HU/EN bemutató három rövid lépésben magyarázza el a használatot: QR beolvasása, élmény választása a telefonon, majd megjelenítés a nagy kijelzőn. A petrol–arany oldal három meglévő múzeumi műtárgyképet és a hivatalos logót használja újra; új képduplikáció nem készül. A Player saját, élő COMPACT_CARD QR-kártyája az álló nézet jobb alsó biztonsági zónájában jelenik meg.

A Múzeumi látogatói távirányító v5 a mobilon HU/EN zászlóválasztót és kéthasábos, nagy érintési célokat mutat. A négy tartalomgomb: Kezdőképernyő / Home, Múzeumi történetek / Museum stories, Online kiállítás / Online exhibition és Rajzverseny / Drawing contest. Mindegyik SWITCH_RELEASE parancs: a Home újraindítja a pilot első elemét, a másik három a kiválasztott, publikált élményt tölti be. A nyelvi action külön gombként nem ismétlődik meg, mert a zászlós választó kezeli.

A vezérlői foglalás 45 másodperc, várólistával. Csak tényleges parancs hosszabbítja meg; a háttérben maradt telefon nem tartja korlátlanul fogva a kijelzőt. A session lezárásakor vagy lejáratakor a Player visszaáll az eredetileg hozzárendelt álló pilotra, nullázza az első elemet és ismét megjeleníti a QR-kódot. Helyszíni UAT: HU→EN zászló és teljes Remote-felület; mind a négy gomb APPLIED; második telefon várólista; 45 másodperces elengedés; QR-visszatérés; valamint olvashatóság és QR-beolvasás 2–3 méterről. Automatizált kapu: npm run test:museum-portrait-pilot.

MikroCsodák Rajzverseny 2025 galéria

A MikroCsodák – Rajzverseny 2025 (teljes galéria) publikált műsorterv 203 magyar, görgetésmentes diából áll: egy bevezető, három korcsoportos szakmai nyertes-dia, egy közönségkedvenc-dia és 198 egyedi pályamű. Az aktuális 1.3.0 Premium Gallery a MikroCsodák sales showcase petrol–arany designnyelvét használja egységes tipográfiával, finom glow/shimmer/sparkle mozgással és reduced-motion támogatással. A rajzok teljes egészükben, világos múzeumi keretben maradnak a főszereplők; fekvőben kép–információ osztott nézet, állóban képközpontú vertikális kompozíció jelenik meg.

A négy eredménylapon az eredeti pályaművek háromképes dobogóként jelennek meg: fekvőben három oszlopban, állóban három sorban. A közönség sorrendje: Vörös Vince – 705, Kiss Kiara Zorka – 519, Szemán Hanna Sára – 455 szavazat. A Player és a Visitor Remote Előző/Következő paranccsal lapoz; a Remote közvetlen indítási listájában csak az öt összefoglaló fejezet jelenik meg, így 198 külön gomb nem terheli a mobilfelületet.

A forrás 198 nyilvános, jóváhagyott pályaműrekordja került át. Kapcsolattartói név, e-mail és telefonszám nem része a KioskPilot tartalomnak. Az eredeti 156 MiB képanyagból legfeljebb 1600×1600 pixeles, 80%-os WebP derivatívák készültek; az aktív 203 HTML + 198 kép 19,18 MiB. A közönségkedvenc-dia ugyanazokat az optimalizált képeket használja újra. Ez a régi LG TV-khez kialakított low-resource profil, miközben az egész alkotás object-fit: contain megjelenítéssel látható marad.

Az aktuális publikált release: MikroCsodák – Rajzverseny 2025 v1.3.0, 203 itemmel és 401 checksum-ellenőrzött egyedi assettel. A 198 optimalizált rajzot újrahasználja, így képduplikáció 0; csak 203 új HTML-verzió készült. A v1.2.0, v1.1.0 és v1.0.0 rollbackhez megmaradt. A kiadás nincs automatikusan kijelzőhöz rendelve; 9:16/16:9 előnézet után a Tenant App Tartalomváltás felületén küldhető ki. Regresszió: npm run test:museum-premium-gallery és npm run verify:drawing-contest.

MikroCsodák Online kiállítás – Premium Gallery

Az aktuális MikroCsodák – Online kiállítás 2.1.3 17 műtárgyat és mind a kilenc támogatott nyelv teljes tartalmát őrzi. Fekvő kijelzőn elegáns, egyképernyős műtárgy-adatlap jelenik meg: balra arany optikai keretben a mű, alatta cím, év és bevezető; jobbra legfeljebb öt tematikus blokk homogén mikroszkóp–vonalzó–kéz–könyv–fény ikonokkal. A 6-nál több tartalmi egységű műtárgyak további blokkjai ugyanennek az adattáblának automatikus következő oldalán jelennek meg, így nincs levágás vagy olvashatatlan szövegzsugorítás.

Álló kijelzőn a fekvő adatlap vizuális rendje folytatódik: felül balra cím, év és bevezető, felül jobbra arany optikai körben az alkotás, alatta a petrol–arany elválasztású öt teljes tematikus blokk. A műtárgykép csak finom, elmosott ambient háttérként van jelen, ezért a szöveg olvasható marad. A QR a Player tulajdona, és mindkét tájolásban a sablon jobb alsó, erre fenntartott RIGHT_BOTTOM területére kerül. Player 3.0.12 / LG 3.0.12-lg.1 kezeli ezt az elhelyezést.

A 2.1.3 release 34/34 assetje méret- és checksum-ellenőrzött: 17 új HTML és 17 meglévő műtárgykép, 0 képduplikáció. A 2.1.2, 2.1.1, 2.1.0, 2.0.9 és 2.0.8 kiadások rollbackként megmaradtak. A kiadás kijelzőhöz rendelése tenant-művelet, ezért a dokumentáció nem írhatja felül a később kiválasztott tartalmat. A 2026-08-24 03:51-i állapot szerint a Projektor Fully online, BROWSER 3.0.15 Playerrel és a lokalizált Sales Showcase 1.4.0 kiadással ACTIVE, 5/5 asset, 100%, hibakód nélkül. Az LG TV korábbi 1.2.0 kiadása és a többi kijelző tartalma nem változott. Az Online kiállítás vagy további Remote UAT próbája csak külön UAT-hozzárendeléssel indítandó.

Fejlesztési állapot: a szerkesztés, validálás, publikálás, műsortervverzió és média-védelem kanonikus. Release csak publikált műsortervverzióból készülhet. A változtathatatlan release snapshot minden nyelvi kép-, videó-, hang- és HTML assetet, a render payloadot, sorrendet, méretet és checksumot rögzíti; a régi alapnyelvi manifest út már nem létezik.

A release készítése a tényleges médiafájl létezését, méretét és SHA-256 checksumját is ellenőrzi. Eltérés esetén a kiadás blokkolt. A Player az összes snapshot assetet letölti, a nyelvváltás pedig a snapshot localized_assets adataiból történik. A kétfázisú cache/verify/activate/rollback folyamat elkészült: a Player csak teljes letöltés és checksum-ellenőrzés után aktivál, hiba esetén pedig megtartja vagy visszaállítja a last-known-good kiadást.

Médiatár fájlkezelő, tárhely és duplikáció

A Tenant App Médiatár nézetében a Projekt Mappák valódi szűrőként működnek: a megnyitott mappában csak az oda tartozó médiák látszanak. Minden mappagomb fájldarabot és összméretet mutat, a felső tárhelypanel pedig külön jelzi a tényleges szerverhasználatot, az egyedi checksumú tartalmat, a régi fizikai duplikációt és a csomag tárhelykeretét. A fájlkártyán látható a fájlméret és az azonos tartalom/megosztott fizikai fájl jelzése.

Új kép-, videó- és HTML-feltöltésnél az API SHA-256 checksumot számol. Ha ugyanaz a bájtsorozat ennél a bérlőnél már megvan, új médiarekord létrejöhet más névvel vagy mappában, de új fizikai fájl nem készül és a tárhelyhasználat 0 bájttal nő. Ugyanez érvényes a HTML Tartalom Varázslóra és a Canvas Studióra. A kvóta a különálló fizikai fájlutakat számolja, nem a release-ek logikai asset-hivatkozásait.

A média törlése csak referencia nélkül engedélyezett. ContentVersionAsset vagy ReleaseAsset használatnál 409 MEDIA_IN_USE érkezik a használati darabszámokkal. Megosztott fizikai fájlnál egy médiarekord törlése nem törli a még használt fájlt; az utolsó referencia törlésekor a lemezfájl is eltűnik, és a Tenant App megmutatja a felszabadított bájtokat. A régi, adatbázison kívüli orphan fájlokhoz továbbra is a dry-run alapú npm run audit:media-retention használható.

Közös mappás MediaPicker a Varázslóban és Canvas Studioban

A Tenant App Sablon Varázslója, Canvas Studioja és a Tartalomvezérő asset-szerkesztője ugyanazt a MediaPicker 1.2 komponenst használja. A párbeszédablakban külön választható az összes média, a mappa nélküli állományok vagy bármely projektmappa; a keresés fájlnévre, mappanévre, MIME-típusra, locale-ra és asset-szerepre működik. A választó az adott mezőhöz csak kompatibilis fájlt kínál.

A kártyán látható az előnézet, fájlnév, projektmappa, MIME-típus, fizikai méret, képméret vagy videóhossz, feldolgozási állapot és a megosztott/azonos fájl jelzése. Csak READY média választható; PENDING, PROCESSING és FAILED fájl látható marad a diagnosztikához, de nem helyezhető a sablonba. A kiválasztás meglévő médiarekordot hivatkozik, nem készít fizikai másolatot.

A ↑ Feltöltés ide egyszerre több fájlt is fogad. Konkrét projektmappában az új média abba a mappába kerül; az Összes média vagy Mappa nélkül nézetből indítva mappa nélküli lesz. Feltöltés után automatikusan kijelölhető, és ha a szerveren ugyanaz a bájtsorozat már megvan, a felület jelzi, hogy az SHA-256 deduplikáció miatt új fizikai másolat nem készült. A + Új mappa saját név/leírás/szín űrlapot nyit, majd létrehozás után az új mappába vált.

A komponens támogat opcionális többes kijelölést és darabkorlátot; ilyenkor a kijelölés mappaváltáskor is megmarad, a lábléc pedig darabszámot és összméretet mutat. A Varázsló és Canvas jelenlegi mezői tudatosan egyszeres módban maradnak. A Varázsló meglévő legördülő listái kompatibilitási tartalékként megmaradtak; a mellettük lévő 📁 Tallózás nyitja a vizuális MediaPickert. A Canvas Studio Kép a Mappákból művelete ugyanezt a komponenst nyitja. Automatizált ellenőrzés: npm run verify:shared-media-picker és npm run test:tenant-file-manager.

A Tartalomvezérő alapmédia és idegen nyelvű média-változat sorai locale/fallback módban nyitják a pickert. Az Asset nyelve és Fallback a hivatkozás tulajdonsága, nem a fájlé; mentéskor a kanonikus ContentVersionAsset rekordba kerül. Fordítási média esetén csak az alapfájllal azonos típusú és kompatibilis tájolású állomány választható. A kártyák HU/EN stb. locale-jelzést, asset-szerepet és korlátozott hivatkozási részleteket is mutatnak.

A 🔒 Védett jelzés ugyanazt a szabályt követi, mint a DELETE API: bármely ContentVersionAsset vagy immutable ReleaseAsset hivatkozás blokkolja a törlést. Külön badge mutatja a draft, publikált, release és RECALLED archív használatot. PENDING, PROCESSING és FAILED fájl továbbra sem választható. Automatizált ellenőrzés: npm run verify:shared-media-picker, npm run test:media-usage-contract és npm run test:tenant-file-manager.

Műsortervlista, verzióelőzmény és Azonnali tesztküldés

A Tenant App Műsortervek & Tartalom listája gyökérműsortervenként egy sort mutat. Az aktív verzió mellett külön látható a teljes verziószám, az elemszám és a létrehozott kiadások száma. Név vagy projekt szerint kereshető, illetve típus és publikálási állapot alapján szűrhető. A Verziók gomb külön előzményben mutatja a piszkozat, publikált és korábbi immutable verziókat; ezek nem külön műsortervek.

Az eddigi „gyors küldés” neve Azonnali tesztküldés. Ez egy médiából automatikusan készít tartalomblokkot, egyetlen elemes műsortervet és publikált kiadást, majd hozzárendeli a kiválasztott kijelzőhöz. Nem normál tartalomépítési út, hanem rövid kijelzőpróba, ezért az ilyen műsortervek külön, alapból összecsukott szakaszban jelennek meg.

Minden tesztküldés QUICK_SEND eredetjelölést és kijelző-eredetkulcsot kap. Sikeres új küldés után a rendszer csak azokat a régi tesztküldéseket archiválja, amelyek egyik kiadását sem használja kijelző aktív/előző/letöltési állapota, ütemezés vagy Remote SWITCH_RELEASE gomb. Az archiválás visszaállítható listaművelet: a kiadási snapshot, verziótörténet és audit megmarad, a közös médiafájl nem törlődik és nem duplikálódik. Automatizált ellenőrzés: npm run verify:playlist-library.

Teljesítmény baseline 2026-08-24: a MikroCsodák tenant 793 médiarekordja usage metaadatokkal 1,56 MB-os JSON és helyben 431 ms. A következő kapu a szerveroldali lapozás/keresés, lusta thumbnail-betöltés és valós böngészős E2E; ezt nagyobb ügyfélállomány előtt le kell zárni.

Kiadás törlése és archiválása

A DRAFT kiadás törölhető. A publikált release változtathatatlan, ezért nem hard-delete-elhető: kijelzők, Proof of Play, offline cache és rollback hivatkozhat rá. A Tenant App kiadástáblája megmutatja a logikai csomagméretet, a kijelző- és ütemezéshasználatot. Használaton kívüli PUBLISHED kiadás az Archiválás gombbal RECALLED állapotba tehető; új hozzárendelésben nem választható, de a snapshot és audit bizonyíték megmarad. Bármely assigned/desired/downloading/verified/active/previous kijelzőhivatkozás vagy schedule esetén az API 409 RELEASE_IN_USE választ ad.

A release „csomagméret” logikai letöltési méret, nem újabb szervermásolat. Több release ugyanazokat a kp_media fájlokat használja; például a Rajzverseny 1.0.0/1.1.0/1.2.0 nem háromszor tárolja a 198 képet. Tényleges tárhely csak médiafájl eltávolításával szabadul fel, ami kizárólag minden verzió- és release-referencia megszüntetése után biztonságos.

Élményindító 16:9 közös sablon

A Tenant App Médiatár → HTML Tartalom Varázsló felületén elérhető az Élményindító 16:9 első közös sablon. Múzeum, látogatóközpont, bemutatóterem vagy más interaktív helyszín fekvő kijelzőjére készült. Szerkeszthető a főcím és annak kiemelt szava, alcím, márkanév, fő kép, QR-panel címe, három csatlakozási lépés, öt szolgáltatáskártya, alsó magyarázat, publikus webcím, valamint az arany és türkiz akcentusszín.

A fő kép a közös MediaPickerrel bármely Projekt Mappából vagy a mappa nélküli médiák közül kiválasztható, kereséssel és fájlmetaadatokkal. Mentéskor a sablon önálló HTML5 médiafájllá fordul, ezért a jelenlegi release- és Player-láncban azonnal használható. A generált HTML nem használ külső fontot vagy JavaScript-könyvtárat, a szövegek hosszkorlátosak és HTML-escape-eltek, a layout pedig 1920×1080, modern böngésző és Chromium 53/LG flexbox fallback esetén is görgetésmentes.

A jobb oldali QR-terület nem statikus QR-kép. A sablon RIGHT_CENTER safe area és allowlistelt FEATURED változatot deklarál; a Player saját session URL-jéből rajzol nagy élő QR-kódot. Tartalomváltáskor automatikusan visszaáll a normál COMPACT mód. A gyors V1 Varázsló-kimenet önálló HTML média; teljes offline múzeumi csomaghoz a képeket BACKGROUND assetként kell a ContentVersionhöz kapcsolni. A V2 referencia-kiadás ezt már kanonikusan megteszi, base64-duplikáció nélkül.

Automatizált ellenőrzés: npm run test:experience-launcher-template, npm run verify:player-low-memory, npm run build:lg-player && npm run verify:lg-player.

QR Elhelyezés a Playeren

A Visitor QR helyét a publikált tartalom render_payload.content.data.presentation.qrPlacement mezője szabályozhatja. A Player 3.0.12 zárt allowlistje orientációnként RIGHT_CENTER, LEFT_BOTTOM és RIGHT_BOTTOM értéket fogad el. Ha nincs explicit beállítás, sablontípus- és orientációfüggő biztonságos alapértéket használ. A Premium Online Gallery álló és fekvő nézetben is kompakt jobb-alsó QR-t kap, pontosan a sablon dekoratív QR-helyén; ehhez a kijelzőnek a friss Player-verziót kell betöltenie.

Verziózott Remote Profile és műsorterv-felülbírálás

A konfiguráció precedenciája: rendszer alapérték → tenant publikált Remote Profile → publikált műsortervverzió → opcionális kijelzőfelülbírálás. A hiányzó vagy null mező öröklést jelent; a false, 0 és üres lista explicit érték. A 026-os additív séma profilverziót, rendezett/típusos és többnyelvű gombokat, QR/session/language override-ot, valamint release-be fagyasztott remote snapshotot tárol. A publikált profil immutable; módosításhoz új draft verzió készül.

A Tenant App Beállítások → Remote Profile & QR Studio felületén újrafelhasználható profil hozható létre. A draftban állítható a QR láthatósága, sablonja, álló/fekvő pozíciója, érvényessége, magyar címsora és útmutatója, továbbá a mobil rendszer-gombok sorrendje, nyelvenkénti felirata, ikonja, színe és engedélyezése. A Nyelvek mező módosításakor a gombsor azonnal létrehozza az egyes locale-mezőket; sok nyelvnél a feliratcsoport vízszintesen görgethető. Az Ellenőrzés szerveroldali allowlistet és tenant-scope-ot használ, az Előnézet biztonságos normalizált konfigurációból készül.

A Tenant App Műsortervek & Tartalom → Mobil távirányító és QR paneljén a kiválasztott műsorterv külön publikált Remote Profile-t használhat. Felülírható a QR láthatósága, sablonja, álló/fekvő helye, magyar címsora és útmutatója, valamint a támogatott nyelvek. A profil gombjai örökölhetők, és mellettük saját, rendezhető, engedélyezhető rendszerparancs-gombok adhatók hozzá. A saját gombok feliratmezői az effektív vagy felülbírált nyelvlistát követik. A kpGo felirat-fallbackje: aktuális nyelv → profil fallback locale → magyar → angol → rendszerfelirat. Az Öröklés visszaállítása törli a draft egyedi override-ját.

Tartalmat betöltő saját gomb: kattints a + Saját gomb lehetőségre, a parancsnál válaszd a SELECT_ITEM értéket, majd a mellette megjelenő Céltartalom listából jelöld ki a betöltendő műsorterv-elemet. Adj magyar feliratot, állítsd be a színt, majd mentsd a beállítást. A cél csak az adott műsorterv egyik eleme lehet; hiányzó vagy idegen célt az API elutasít. Publikálás és kiadás készítésekor a rendszer a célt a kiadás saját, változtathatatlan elemére fordítja, ezért a mobil gomb mindig az ugyanabba a kiadásba fagyasztott tartalmat indítja. A módosítás csak az új kiadás kijelzőhöz rendelése és ACTIVE állapota után jelenik meg a telefonon.

Másik műsorterv/kiadás indítása: a saját gomb parancsa legyen SWITCH_RELEASE, majd a Célkiadás listából válassz egy publikált kiadást. Ez a teljes kijelzőt átváltja a kiválasztott élményre; nem csupán az aktuális műsorterv következő elemére ugrik. A szerkesztő kizárólag a bérlő publikált kiadásait kínálja, az API pedig mentéskor ismét ellenőrzi a tenant-határt és a publikált állapotot. A telefonon a gombnyomás után a Player elindítja a kiadásváltási és letöltési folyamatot; nagy csomagnál a kijelzőn letöltési állapot jelenhet meg. Remote-gomb által célzott kiadás addig nem archiválható, amíg a hivatkozást el nem távolítják; a Kiadások táblázat külön mutatja a Remote-gomb hivatkozások számát.

Publikált műsorterv közvetlenül nem változik: a panel mentése automatikusan új szerkeszthető műsortervverziót készít. Publikáláskor a Remote beállítás is immutable lesz. Kiadás létrehozásakor a rendszer a teljes effektív konfigurációt a remote_snapshot_json mezőbe fagyasztja és külön SHA-256 checksumot tárol; release validáláskor és publikáláskor ezt újraszámolja.

A Draft mentése optimista verziózárat használ: párhuzamos módosításnál újratöltést kér, nem ír felül csendben más szerkesztést. A Publikálás után a verzió változtathatatlan; további munkához a publikált verzióból új draft készíthető. Csak publikált, aktív profil lehet tenant-alapértelmezett, és az alapértelmezett profil nem archiválható. Új verzió publikálásakor az alapértelmezett hivatkozás atomikusan az új verzióra emelkedik. Minden lifecycle művelet auditált.

Látogatói nyelv és tartalomindítás – 2026-09-10

A telefonos távirányító tíz nyelvű kezelőfelülete a QR-belépő útvonalról is betöltődik. A nyelv a kijelző sikeres visszaigazolása után vált; a gombfeliratokat a Remote Profile nyelvenkénti mezőiben kell megadni. Profilváltozás után új kiadás szükséges. A pillanatnyi állapot lekérdezése megőrzi a gombokat és a fókuszt.

A tartalom első megnyitásakor a letöltés hosszabb ideig tarthat. A telefon a végrehajtás visszaigazolásáig betöltési jelzést mutat, és megelőzi az ismételt indítást. A Player 3.0.19 az azonos tartalomra érkező párhuzamos kéréseket egyesíti, az eltérő kiadások előkészítését sorban végzi. Sikertelen indításnál hibaüzenet jelenik meg; nyelvet váltani a tartalom elindításához nem szükséges.

Az Online kiállítás 2.1.6 egyetlen oldalon mutatja a műtárgy képét, bevezetőjét és összes tartalmi blokkját, automatikus részoldalváltás nélkül. A héber elrendezés jobbról balra halad; az eredeti szövegek és képek megmaradnak. A Player 3.0.21 először csak az első műtárgy ellenőrzött fájljaira vár; a további műtárgyakat a háttérben tölti le.

A Heritage képes nyitóképernyő a működő Múzeumi történetek, Online kiállítás és Rajzverseny élményeket mutatja petrolzöld–arany kártyákon, eredeti múzeumi képekkel. A kijelző továbbra is telefonról vezérelhető. Player 3.0.20-tól kizárólag ennél a nyitóképernyőnél nagyobb élő QR-kód illeszkedik az alsó kapcsolódási panelbe; más tartalom QR-elhelyezése változatlan.

Kiadásba fagyasztott Remote Snapshot – runtime működés

A runtime cutover aktív a Player 3.0.12 és LG 3.0.12-lg.1 verziótól; az aktuális Player 3.0.15 / LG 3.0.15-lg.1. A kijelző mindig a teljesen letöltött és ACTIVE állapotú kiadás remote_snapshot_json konfigurációját használja; a még csak desired/downloading/verified kiadás nem változtatja meg a QR-t vagy a távirányítót. Így a tartalom, QR-sablon, gombkészlet, nyelvek és session policy egyszerre, atomi módon váltanak.

A Player a snapshot alapján alkalmazza a QR láthatóságát, lokalizált címsorát és útmutatóját, a join-kód láthatóságát, lejáratát, álló/fekvő helyét és a COMPACT_CARD, BOTTOM_BANNER, RIGHT_SIDEBAR, ALTERNATING_ANIMATED vagy HERO_CARD sablont. A COMPACT_CARD kis helyigényű petrol–arany múzeumi kártya: álló és fekvő kijelzőn a konfigurált safe area-ban marad, a QR pixeltérképet nem animálja, és a hosszabb adatlapból minimális területet vesz el. A Player a kódot biztonsági tartalékkal a lejárat előtt megújítja; a join kód legfeljebb az aktuális visitor session végéig érvényes. Aktív snapshotnál ez a műsorterv-szintű beállítás megelőzi a régi HTML-tartalom QR-metaadatát; snapshot nélküli legacy kiadásnál a tartalmi safe area továbbra is működik. A kpGo mobilfelület az engedélyezett, sorrendezett és lokalizált rendszer-gombokat rajzolja ki; a némítás/hangosítás és szünet/lejátszás párok egyetlen váltógombként jelennek meg. A Player a VOLUME_UP/VOLUME_DOWN parancsokat 10%-os lépésekben alkalmazza. Az API minden parancsnál ugyanebből az aktív snapshotból ellenőrzi az allowlistet és a nyelveket. A controllerLeaseSeconds és queueEnabled beállítás szintén futásidőben érvényesül.

Élő MikroCsodák referencia: a MikroCsodák – Online kiállítás – Remote UAT 2.0.29 kiadás 17 elemmel és 34 változatlan assettel ACTIVE az 01 kijelzőn. Remote checksum: bb307a7d2734e292b5dd0ff0bf7fc67d0acc5f000135e5665d5942794ecf79c6. A snapshot COMPACT_CARD, jobb alsó álló/fekvő hely, HU/EN/HE nyelv, 25 másodperces lease, várólista, valamint Előző/Szünet/Következő/Nyelv gombokat tartalmaz. Az élő Next, Prev, Pause, Resume, EN, HE és HU parancs mind APPLIED; bontás után az új QR-session automatikusan létrejött. A korábbi Online kiállítás 2.1.3 a kijelző previous_release_id rollbackje.

A checksum minden használatkor ellenőrzött. Hiányzó, régi vagy hibás snapshot esetén a rendszer nem áll le, hanem a kijelző régi kp_visitor_remote_profiles profiljára vált vissza. A válasz runtimeSource, releaseId, snapshotChecksum és fallbackReason mezői support-diagnosztikára használhatók; tipikus okok: REMOTE_SNAPSHOT_MISSING, REMOTE_SNAPSHOT_CHECKSUM_MISMATCH és REMOTE_SNAPSHOT_INVALID. A legacy fallback megtartja a régi mobil gombelrendezést.

A device release API az Android/HDMI-stick kliens számára remoteSnapshot és remoteSnapshotChecksum mezőt is ad. Az Android kliens letöltheti és ellenőrizheti, de csak a kiadás ACTIVE állapota után használhatja. Ellenőrzések: npm run test:remote-runtime, npm run test:playlist-remote-overrides, npm run smoke:visitor-remote, npm run verify:player-low-memory és npm run verify:lg-player. A szerkesztő továbbra sem fogad szabad URL-t, JavaScriptet vagy nyers HTML/modal payloadot. A teljes contract: REMOTE_PROFILE_PROGRAM_OVERRIDE_CONTRACT_V1.md.

Adatbázis-ellenőrzés: npm run verify:content-version-db és npm run verify:program-release-db. A teljes kanonikus lánc csak olvasó auditja: npm run audit:content-pipeline. A backfill alapból read-only: npm run backfill:content-versions. Az apply csak sikeres preflight után használható, és többértelmű médiaútvonal, hibás locale vagy cross-tenant hivatkozás esetén blokkol.

MikroCsodák Visitor Experience V2

Az új múzeumi látogatói rendszer külön projektben és külön kiadásokban készül, ezért nem keveredik a jelenlegi Legacy műsortervekkel. Futó, visszaállítási vagy Remote-hivatkozással védett kiadást csak az új V2 helyszíni aktiválása után szabad archiválni. A használaton kívüli korábbi kiadások RECALLED állapotban maradnak, snapshotjuk és a más tartalom által is használt médiafájlok megőrzésével.

Aktuális P0 runtime hiba

A 2026-09-10-i helyszíni audit két külön jelenséget talált. A Felfedező 2.0.5 43 assetes csomagja teljes, de több párhuzamos sync/reload/reconnect hívás ugyanazt a candidate cache-t törölte és újrakezdte. Ezt a Player 3.0.16 / LG 3.0.16-lg.1 single-flight mutexe javítja: az új kérés a már futó letöltéshez csatlakozik. A közben aktív, régi egy-HTML-es Digitális élményloop 2.0.27 nem csomagolta a HTML-ben használt backstage képet, ezért külön PLY_ERR_MEDIA_PRELOAD érkezett. Ez nem tárhelyhiba. A Player a last-known-good kiadást megtartja; valóban hibás csomagokra még véges retry/backoff és teljes HTML-forrás validáció szükséges.

Az elkülönített új munkaterület neve MikroCsodák – Visitor Experience V2. Új Online, Rajzverseny és Szelfi tartalom, valamint az ArenaLive Quiz integráció konfigurációja kizárólag ebbe a projektbe kerüljön; Legacy tartalmat nem mozgatunk bele.

Jóváhagyott Heritage Gold vizuális irány

A Visitor Experience V2 hivatalos iránya a mély petrolzöld vagy éjkék alap, elefántcsont tipográfia, visszafogott arany hierarchia, elegáns serif címbetű, egységes arany vonalikonok, vékony keretek és nyugodt CSS/SVG mikroanimációk. A mobilfelület nagy érintési célokat, rövid szöveget és képdomináns élménykártyákat használ.

Kötelező médiaeredet-szabály: műtárgyat, alkotót, látogatót, múzeumi teret vagy programot csak ellenőrzött, eredeti MikroCsodák-kép ábrázolhat. Generált vagy stock kép nem publikálható valódi múzeumi tartalomként; az AI-látványtervek kizárólag kompozíciós referenciák. Ugyanazt az eredeti assetet nyelvenként és műsortervenként újra kell használni, nem lemásolni.

Tervezett látogatói belépő és főmenü

A Remote belépőjén a múzeum neve, az aktív kapcsolat, a zászlós nyelvválasztó és egyetlen Élmények megnyitása CTA látható. A Mit szeretnél felfedezni? főmenü nyolc kártyája: Alkotások közelről, Minden alkotás, Hogyan készült?, A művész, Híres látogatók, Rajzverseny 2025, Randi a múzeumban és Küldj szelfit. A Kezdőlap a bemutató/reklám állandó navigációs célja, a nyelvválasztó pedig vezérlő, nem külön tartalomkártya.

Az Előző, Következő és Szünet csak az adott élményen belül jelenik meg. Minden parancs betöltési, alkalmazott vagy sikertelen visszajelzést ad; a Kezdőlap mindig elérhető. A közös műtárgy-részletnézet eredeti képet, nagyítást, betűméretet, felolvasást és biztos visszalépést kínál.

Nyelvek és későbbi bővítés

A célzott közös nyelvkészlet: HU, EN, DE, FR, IT, ES, PL, UA és HE. A szlovák nyelv csak valódi fordítással publikálható, mert a korábbi forrás magyar másolatot adott. Egy új nyelvet ugyanahhoz a logikai tartalomhoz kell hozzáadni; a közös képet vagy videót nem szabad nyelvenként lemásolni. A tervezett admin lefedettségi mátrixa élményenként TELJES, RÉSZLEGES vagy HIÁNYZIK állapotot mutat. Fallback: kért nyelv → angol → magyar; új nyelv publikálása mindig új immutable release.

Online kiállítás és Rajzverseny

Az Online kiállítás mind a 17 műtárgyat és a 9 ellenőrzött fordítást megtartja, de portrait-first, görgetésmentes TV-nézetet és telefonos műtárgykatalógust kap. A Rajzverseny 198 pályaműve nem 198 főgombként jelenik meg: korcsoport, nyertesek, közönségkedvencek, összes mű és véletlen felfedezés alapján lehet választani, majd a TV egyetlen képközpontú alkotást mutat.

Szelfi állapota

Az Álló totem oszlop kamerája jelenleg READY, az eszközszintű DEVICE_CAMERA mód engedélyezett és az aktív Totem Szelfi élmény létezik. A V2-ben még szükséges a CAMERA_START Remote-gomb, a többnyelvű és verziózott hozzájárulás, a múzeumi keretek, valamint a capture/retake/accept/download fizikai E2E. A kép megőrzése 24 óra, a letöltési link 60 perc. Kamera-hiba nem állíthatja meg a többi tartalmat.

Quiz állapota

A korábbi „Kvíz bemutatása” csak diás bemutató volt, nem működő játék. A végleges termékdöntés szerint a Quiz tartalmát, pontozását és játékmenetét az ArenaLive szolgáltatja. A KioskPilot feladata a tenant/site/zone mapping, a rövid életű display- és participant-token, az aktuális locale átadása, a Player és telefonos handoff, valamint a kilépés vagy hiba utáni biztos visszatérés a Kezdőlapra.

Aktív Quiz Remote-gomb csak teljes, egészséges ArenaLive capability és sikeres end-to-end UAT után jelenhet meg. Addig alapértelmezetten rejtett; külön marketingbeállítással inaktív Hamarosan kártya mutatható, amely nem indít hibás vagy félkész élményt.

Átállási sorrend

  1. Külön V2 projekt, archív nézet és új Remote információs architektúra.
  2. Dinamikus nyelvkatalógus és lefedettségi mátrix.
  3. Online kiállítás V2, majd a már előkészített eszközkamerás Szelfi.
  4. Rajzverseny V2, majd stabil contract esetén ArenaLive Quiz integráció.
  5. Helyszíni Browser/HDMI-stick UAT, aktiválás, Legacy recall és 14 napos stabilitás.

A részletes végrehajtási terv fájlja: MIKROCSODAK_VISITOR_EXPERIENCE_V2_PLAN_2026-09-10.md.

Múzeumi Sales Showcase és Élményloop 16:9

Két külön célú megoldás létezik. A Múzeumi élményloop 16:9 V2 a későbbi, szerkeszthető közös sablon. A MikroCsodák Sales Showcase 16:9 szándékosan nem szerkeszthető, márka-specifikus értékesítési referencia: a feltöltött mintához igazodó fix kompozíciót, egységes vonalas ikonrendszert, valódi múzeumi képeket, finom fényeket, csillogást és lassú animációkat használ.

UX-alapelv: a nagy kijelző adja az élményt, a telefon csak vezérli azt.

Hol található és hogyan használható?

  1. A Tenant App Médiatár oldalán nyisd meg a HTML Tartalom Varázslót; a képeket később a közös MediaPickerben bármely projektmappából kiválaszthatod.
  2. Válaszd a HTML Tartalom Varázsló → Múzeumi élményloop 16:9 V2 sablont.
  3. Válassz külön WOW nyitóképet, kiemelt műtárgyképet és Tudtad?-részletképet. Mindhárom mező mappás tallózást, keresést, előnézetet és fájlmetaadatokat kínál.
  4. Szerkeszd a főcímet, WOW-mondatokat, két rövid tényt, műtárgycímet/hordozót, visszavezető CTA-t, három csatlakozási lépést és az akcentusszíneket.
  5. Mentsd a HTML-t, készíts belőle verziózott tartalmat és publikált műsortervet. Offline lejátszáshoz minden hivatkozott kép és logó legyen BACKGROUND asset.

Jelenetek és mozgás

Az alap loop 78 másodperc és hét jelenet: makró WOW-nyitás, Tudtad?, QR-csatlakozás, három lépés, szolgáltatások, kiemelt műtárgy, majd túra/játék CTA. A mozgás csak GPU-barát transform és opacity animációkat használ; nincs agresszív flash, külső font vagy külső JavaScript. A prefers-reduced-motion beállítás kikapcsolja a folyamatos animációt.

A QR jobb-középső safe area végig szabad marad. A QR pixeltérkép nem mozog és nem torzul; csak a Player kártyájának környezete kap finom glow-t. A jelenetek és kompozíció változása burn-in ellen is segít.

Élő QR és kapcsolódott állapot

A HTML nem generál saját QR-kódot. A Player 3.0.9 / LG 3.0.9-lg.1 a kijelző aktuális visitor sessionjéből rajzolja az élő QR-t. A fix referencia külön SHOWCASE QR-módot kér: a jobb oldali, hangsúlyos üvegkártyába nagy, mozdulatlan és jól olvasható QR kerül. Közvetlen beolvasáskor nincs PIN; a kpgo.pro kézi megnyitásakor a TV-n látható kódot kell megadni.

Kapcsolódáskor a Player KIOSKPILOT_VISITOR_STATE üzenetet küld kizárólag az aktív HTML iframe-nek. A V2 loop ilyenkor megáll, elrejti a QR-t és „A kijelző most a te kezedben van” állapotot mutat. Bontáskor automatikusan visszaáll az idle loop és az élő QR.

MikroCsodák értékesítési referenciapéldány

A MikroCsodák – Értékesítési referenciaélmény 1.2.0 PUBLISHED / VALID kiadás az aktuális bemutatópéldány. Egyetlen, 24 órás fix képernyő: felül nagy „Keltsd életre a kijelzőt!” cím; balra telefon és TV valódi műtárgyképekkel; középen három kapcsolódási lépés; jobbra élő QR; alul öt szolgáltatáskártya és márkázott footer. A HU/EN nyelvváltás és a kapcsolódott állapot működik. Nincs automatikusan kijelzőhöz rendelve.

A csomag a meglévő Karaván, Virágzó ág, aranybolha és hivatalos wordmark fájlokat használja újra, ezért a kiadás egyetlen új fizikai fájlja a 20 850 byte-os HTML; képduplikáció: 0. Az 1.1.0 hétjelenetes V2 és az 1.0.0 első változat immutable rollbackként megmaradt. Regresszió: npm run test:museum-sales-showcase, npm run verify:player-low-memory, npm run verify:lg-player.

HDMI stick és LG

Értékesítési és éles telepítéshez a javasolt út a KioskPilot által kezelt HDMI stick modern Chromium/WebView runtime-mal: stabilabb animáció, több memória és kiszámíthatóbb offline tárhely. Az LG lgplayer.html továbbra is használható otthoni kompatibilitási tesztre; Chromium 53 célra fordított bundle-t kap, és a sablon régebbi motoron is olvasható fade/statikus fallbacket biztosít.

Ellenőrzések: npm run test:museum-experience-loop-template, npm run test:museum-sales-showcase, npm run verify:player-low-memory, npm run build:lg-player, npm run verify:lg-player. Az 1.2.0 publikáló alapból dry-run; apply csak explicit UPGRADE_MIKROCSODAK_SALES_REFERENCE_SHOWCASE megerősítéssel indítható.

2. Android TV & Kioszk Integráció

Ez a dokumentum a TV-alkalmazás (Android TV app) és a mobilalkalmazás számára írja le a központi API és WebSocket csatlakozási és kommunikációs protokollját.

Csatlakozás és Hitelesítés

A csatlakozás a szerverhez biztonságos WebSocket (wss://) protokollon keresztül történik:

  • Kapcsolódási végpont: wss://api.kioskpilot.cloud/ws/device/{deviceToken}
  • Hitelesítés: A hitelesítés a URL-ben megadott deviceToken alapján automatikusan megtörténik.

Sikeres hitelesítés után a szerver a kijelző státuszát automatikusan ONLINE állapotba állítja az adatbázisban, és a következő választ küldi vissza:

{
	  "event": "auth_success",
	  "deviceId": "UUID_AZONOSÍTÓ",
	  "message": "Eszköz hitelesítve!"
	}

Kijelző párosítása és hibaellenőrzése

Browser Player megjegyzés: a kezelőfelületi „Tartalom újraszinkronizálása” / reload alias a Browser Playerben device.reload-ra normalizálódik, és az immutable release manifestet szinkronizálja; nem tölti újra a Player HTML alkalmazást. Új Player-verzió érvényesítéséhez device.restart szükséges. A siker a következő heartbeat appVersion mezőjében ellenőrizendő. A device.clear_cache csak sérült helyi release-cache hibakeresésére való, normál verziófrissítéshez nem szükséges.

  1. A Player POST /v1/devices/pairing-code kéréssel 10 percig érvényes KP-XXXXXX kódot és ideiglenes device UUID-t kér.
  2. A Tenant App jogosult adminja a POST /v1/devices/pair végponton elküldi a kódot, nevet, helyet és display profilt.
  3. Az API egy tranzakcióban létrehozza a kijelzőt, a kanonikus kp_device_release_states sort, credentialt és device tokent.
  4. A Player pollinggal egyszer veszi át a secretet, tokent és display profilt; az API ezután törli a pairing kódot.

Sikertelen admin-próbánál a Tenant App fókuszált, képernyőolvasóval is érzékelhető panelen mutatja a felhasználói üzenetet, a stabil hibakódot és a rövid hivatkozási azonosítót. Ugyanezt a pairing rekordból a Player pollingja is megkapja, és piros státuszsávban megjeleníti a kijelzőn. A technikai stack nem kerül klienshez; csak a szervernaplóban kereshető vissza a hivatkozási ID alapján. A kód lejártáig újra lehet próbálni, siker esetén a korábbi hiba törlődik.

A teljes regresszió: npm run test:device-pairing-api. A teszt saját kódot generál, végigviszi a tenant-párosítást és az egyszeri Player credential-átvételt, ellenőrzi az IDLE release-state sort, majd kontrollált duplikált eszközhibával igazolja a közös DEVICE_PAIRING_FAILED Tenant/Player feedback contractot. Végül eltávolít minden ideiglenes eszköz-, pairing- és auditadatot. A 2026-08-12-én javított ensureDeviceReleaseState is not defined backendhiba hiányzó route-import volt; a párosítás tranzakciója helyesen rollbackelt, ezért félkész kijelző nem maradt.

LG webOS böngészős Player

LG TV beépített böngészőjében a https://kpgo.pro/lgplayer.html útvonalat kell használni. Ez külön, Babellel Chromium 53 szintre fordított Player bundle; a modern player.html változatlan marad. A legacy oldal ES5 bootstrap hibapanelt és flexbox layout fallbacket is tartalmaz, ezért bundle-betöltési vagy indulási hiba esetén a kijelzőn konkrét LG_PLAYER_BOOT_FAILED vagy LG_PLAYER_BOOT_TIMEOUT kód jelenik meg.

Támogatási cél: webOS TV 4.x vagy újabb. Az LG hivatalos motorlistája szerint ez Chromium 53-tól indul; webOS 5 Chromium 68, webOS 6 Chromium 79. A webOS 3 és régebbi motorokra nincs production garancia. A kanonikus forrás továbbra is a player.html; minden Player-módosítás után kötelező npm run build:lg-player, majd npm run verify:lg-player. A teljes npm run build:all automatikusan újragenerálja az LG változatot.

Az LG Player API- és WebSocket-forgalma azonos eredetű átjárón közlekedik: https://kpgo.pro/v1/* és wss://kpgo.pro/ws továbbít a belső API-nak. Így a régi webOS motor nem kapcsolódik közvetlenül az api.kioskpilot.cloud domainhez, és nem akad el cross-origin TLS/CORS korlátozáson. Ha a böngészőben nincs natív fetch, az LG bootstrap XMLHttpRequest-alapú tartalékot biztosít. A PAIRING_CODE_NETWORK_ERROR azt jelzi, hogy a Player a párosítási kód kérésekor egyáltalán nem kapott HTTP-választ; ilyenkor frissítsd teljesen az LG oldalt, ellenőrizd, hogy a Player verzió legalább 3.0.7-lg.1, majd nézd meg a kpgo és API PM2-folyamatot. Az átjáró szerverhibája külön KPGO_API_PROXY_FAILED kódot és HTTP 502 választ ad.

A webOS beépített böngésző Cache Storage API-ja egyes TV-ken hiányzik vagy 0%-nál válasz nélkül marad. Az LG Player ezért a release fájljait saját IndexedDB-alapú cache-rétegben tárolja; támogatja a Player által használt open, put, match, keys és delete műveleteket. A 3.0.5-lg.3 verziótól a letöltés nem használ natív window.caches hívást. Ha a szinkronizáció mégis sikertelen, a Player előbb FAILED / PLY_ERR_SYNC_FAILED állapotot és konkrét hibaüzenetet küld a szervernek, csak utána próbálja törölni a félkész cache-t; így a diagnosztika nem marad néma PENDING 0% állapotban.

A 3.0.5-lg.4 verzió a release média URL-jeit is same-origin címre írja át: az api.kioskpilot.cloud/uploads/... forrásból kpgo.pro/uploads/... lesz. A kpgo /uploads útvonala a kanonikus apps/api/uploads médiatárat szolgálja ki. Ez megszünteti azt a régi webOS cross-origin hibát, amely az első fájlnál Failed to fetch üzenettel állította le a letöltést. A MikroCsodák LG-re kijelölt release-ének publikus ellenőrzése 34/34 fájlnál HTTP 200, pontos méret és helyes SHA-256 checksum eredményt adott.

A 3.0.5-lg.5 verzió a crypto.subtle.digest nélküli régi webOS motorokhoz tiszta JavaScript SHA-256 fallbacket ad. A Cannot read property 'digest' of undefined hiba Web Crypto kompatibilitási probléma, nem tárhelyhiány. A Player a gyors Web Crypto ágat használja, ha elérhető, különben automatikusan fallbackre vált. A MikroCsodák kijelölt release-ének mind a 34 fájlja sikeresen átment a publikus HTTP/méret ellenőrzésen és a fallback SHA-256 validáción is.

A 3.0.7-lg.1 memória-kímélő, két rétegű lejátszást használ: egyszerre csak a most látható és a következőként előkészülő média van a DOM-ban. A jelenlegi kép vagy HTML addig látható marad, amíg a következő elem load, videónál canplay eseményt nem ad; ezután rövid áttűnés következik, a régi réteg pedig felszabadul. Az első elemig márkázott előkészítő képernyő látszik fekete oldal helyett. A 20 másodpercen belül be nem tölthető elem PLY_ERR_MEDIA_PRELOAD eseményt jelent; ha van működő aktuális elem, az képernyőn marad, a hibás elemet a Player átugorja.

Platform Admin kijelző-hibadiagnosztika

Az Eszközök & Diagnosztika nézet bérlőnként és kijelzőnként mutatja a kapcsolatot, a kívánt és aktív release-t, a százalékos/fájlszintű előrehaladást és a Player hibakódját. A felső kártyák összesítik az online, telepítés alatt álló és beavatkozást igénylő kijelzőket. A rendszer a FAILED/ROLLED_BACK állapot mellett azt is hibának jelöli, ha egy eltérő kívánt release PENDING, DOWNLOADING, VERIFYING, READY vagy ACTIVATING állapotban több mint 10 perce nem frissült.

A Diagnosztika gomb megmutatja a TV-n látható normalizált hibakódot – például PLY_ERR_SYNC_FAILED –, a nyers backendkódot, hibaüzenetet, release-állapotot, fájlszámot, időpontokat, heartbeatet, Player/runtime verziót, IP/latency és erőforrásadatokat, valamint célzott teendőjavaslatot. Az elmúlt 30 perc Proof of Play FAILED eseményei – köztük a PLY_ERR_MEDIA_PRELOAD – friss lejátszási hibaként akkor is láthatók, ha a release maga aktív maradt. Az Összefoglaló másolása gomb telefonos vagy ticketes ügyfélszolgálati átadáshoz készít egységes szöveget. A régi RELEASE_SYNC_FAILED rekordokat a felület visszafelé kompatibilisen PLY_ERR_SYNC_FAILED TV-kódként jeleníti meg; az új Player már közvetlenül ezt a kódot jelenti.

Érvénytelen párosítás kezelése

Ha a Player bármely device-auth végponton 401 választ kap - például heartbeat, release manifest lekérés vagy aktív release visszajelzés közben -, akkor a kijelzőt törölt vagy érvénytelenített párosításként kezeli. Ilyenkor törli a helyi párosítási adatokat (deviceId, secret, deviceToken, display profil, aktív release azonosító), leállítja a futó időzítőket/WebSocketet, majd visszatölti a párosítási képernyőt.

Release ütemezés és telephelyi idő

Az ütemezés kizárólag publikált, változtathatatlan release-re mutat. A korábbi műsorterv-gyökér alapú schedule út megszűnt, ezért egy műsorterv későbbi publikálása nem módosítja észrevétlenül a már időzített tartalmat.

A Player és a Visitor Remote ugyanazt a szerveroldali resolvert használja. A helyi napot és időt a kijelző telephelyének IANA időzónája határozza meg. A resolver kezeli a dátumtartományt, heti napokat, egész napos és éjfélen átnyúló idősávot, valamint a device > zone > site specificitást és az 1-10 prioritást.

A Tenant App csak publikált kiadást kínál az Ütemezés nézetben, megmutatja az effektív időzónát, és mentés előtt jelzi az azonos célponton átfedő szabályokat. Ellenőrzés: npm run verify:schedule-db és npm run test:schedule-timezone.

Meglévő kijelző telephelye és zónája utólag a Tenant App Kijelzők → Hely & zóna gombjával módosítható. A zónalistában csak a kiválasztott telephely zónái jelennek meg. Az API tenant-scope-ban ellenőrzi mindkettőt, DEVICE_LOCATION_UPDATE auditot ír, újraszámolja a közvetlen kijelző → zóna → telephely ütemezési precedenciát, majd online Playernek device.sync_release jelzést küld.

Szervertől érkező parancsok fogadása

A TV alkalmazásnak végre kell hajtania a WebSocket csatornán érkező következő parancsokat:

A kanonikus üzenetboríték mind a type, mind a command mezőt tartalmazza azonos parancsnévvel, továbbá kötelező commandId-t és beágyazott payload objektumot ad. Az Android kliens a type mezőt használja elsődlegesen, a Browser Player mindkettővel kompatibilis.

{
  "type": "device.set_language",
  "command": "device.set_language",
  "commandId": "UUID",
  "payload": { "lang": "en", "timeoutSeconds": 3600 }
}
  1. URL betöltése / módosítása (device.open_url): A kijelző kezdőoldalának beállítása vagy távoli módosítása.
    { "command": "device.open_url", "url": "https://kioskpilot.cloud/..." }
  2. Tartalom újraszinkronizálása (device.reload): A Browser Player újraolvassa és szükség szerint szinkronizálja a desired/active release manifestet. Natív kliens implementációja újratöltheti a WebView-t, de erre a szerver nem támaszkodik.
    { "command": "device.reload" }
  3. Gyorsítótár törlése (device.clear_cache): Törölje a WebView gyorsítótárát, majd töltse újra az oldalt.
    { "command": "device.clear_cache" }
  4. Képernyőkép kérése (device.screenshot): Készítsen képernyőképet a futó WebView-ról, majd küldje be base64 JPEG-ként az API-nak.
    { "command": "device.screenshot" }
  5. Release szinkron (device.sync_release): Kérje le és aktiválja a kijelző effektív desired release-ét.
  6. Nyelvváltás (device.set_language): Ideiglenes nyelvi felülírás lang és timeoutSeconds payload-dal.
  7. Hangerő és fényerő: device.set_volume, illetve device.set_brightness 0-100 közötti value mezővel.
  8. Player újraindítása (device.restart): A Player/WebView újratöltése terminális ACK után; Browser Player-verzióváltáshoz ezt kell használni.
  9. Vészleállítás (device.emergency_stop): Az aktuális lejátszás megszakítása és biztonságos fallback megjelenítése.

Release Állapotjelentés

A Player a PENDING → DOWNLOADING → VERIFYING → READY → ACTIVATING → ACTIVE fázisokat jelenti. A desired és active release külön mező; az ACTIVE csak sikeres helyi atomikus aktiválás után küldhető. Hiba esetén FAILED vagy ROLLED_BACK érkezik hibakóddal, miközben a korábbi aktív kiadás megmarad. A párhuzamos heartbeat/release-state írásokat a szerver rendezett zárolással és legfeljebb három deadlock/lock-timeout tranzakciós próbával kezeli. A hibás manifest checksum elvárt 409 MANIFEST_CHECKSUM_MISMATCH kliensválasz, nem szerverhiba; az 5xx hibák továbbra is a PM2 error logba kerülnek.

Player pilot preflight és fizikai UAT

A MikroCsodák pilot szerveroldali kapuja a npm run audit:player-pilot -- --device=01 --output=audit/player-pilot-preflight.json paranccsal ellenőrizhető. Az audit read-only: desired/active/previous release, deployment, minden release-fájl létezése, mérete és checksumja, Proof of Play lefedettség, függő parancs, Player-verzió, natív Android forrás és headless böngésző jelenléte kerül a riportba.

Az automatizált preflight nem helyettesíti a fizikai tesztet. A kijelzőnek ONLINE állapotban kell lennie, majd online hidegindítás, hálózat nélküli cache-elt hidegindítás, reconnect, parancs-ACK, kétirányú release-váltás és dedikált hibás teszt-release rollback szükséges. Valós aktív release assetet tilos a rollback-teszthez megrongálni. A részletes jegyzőkönyv: PLAYER_PILOT_UAT_2026-08-12.md.

Auth pool tranzakciós biztonság

Az érvénytelen refresh token 401-es ága minden megkezdett tranzakciót rollbackel, mielőtt a kapcsolat visszakerül a poolba. Enélkül a kapcsolat REPEATABLE READ snapshotja későbbi API-kérésekben elrejthette a frissen párosított eszközt vagy credentialt. Regresszió: npm run test:auth-refresh-transaction; 12 párhuzamos invalid refresh után a friss eszköz- és device-auth rekordnak azonnal láthatónak kell lennie.

3. Ubuntu 24.04 + HestiaCP Szerver-beállítások

Ez az útmutató segít beállítani és optimalizálni a HestiaCP alapú Ubuntu 24.04-es szervert a modern fejlesztési és éles munkafolyamatokhoz.

SSH Hozzáférés és Biztonság

A biztonságos SSH eléréshez szerkeszd a szerveren a /etc/ssh/sshd_config fájlt:

PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no

FONTOS: Az SSH démon újraindítása előtt (sudo systemctl restart ssh) mindig nyiss meg egy másik terminált és teszteld az új beállításokkal való belépést, nehogy kizárd magad!

Telepítések a Szerverre

Lépj be SSH-n keresztül, és telepítsd a következő alapvető fejlesztési függőségeket:

  • NVM (Node Version Manager):
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    source ~/.bashrc
    nvm install --lts
  • Composer (PHP csomagkezelő):
    sudo apt update && sudo apt install composer -y

Teljesítmény finomhangolása (OPcache & Redis)

A villámgyors válaszidőkért engedélyezd a PHP OPcache-t és telepítsd a Redis szervert:

sudo apt install redis-server php-redis -y
sudo systemctl enable redis-server

4. Camera Experience

A Camera Experience a látogatói fotózási folyamatot kezeli a Visitor Remote sessionhöz kötve. A séma telepítve van: kp_camera_experiences, kp_camera_sessions, kp_camera_captures, kp_camera_download_tokens, kp_camera_events.

Elérhetőség és Jogosultság

A kamera nem automatikusan elérhető minden bérlőnél és minden kijelzőn. Az effektív kameraelérhetőség három egymásra épülő kapu eredménye:

  1. Előfizetés: a bérlő előfizetése aktív, és a csomagverzió vagy tenant override engedélyezi a feature_camera_exp funkciót.
  2. Telepítés: az adott tenant, telephely, zóna vagy eszköz konfigurációja engedélyezi a kamerát és a használható módot (VISITOR_CAMERA, DEVICE_CAMERA vagy mindkettő).
  3. Futásidejű képesség: kijelzőkamera esetén az eszköz ténylegesen rendelkezik kamerával, és a kameraengedély használható.

A funkció csak akkor indítható, ha mindhárom szükséges kapu engedélyezett. A kliens géppel kezelhető állapotot kap, például SUBSCRIPTION_DISABLED, INSTALLATION_DISABLED, CAPTURE_MODE_DISABLED, NO_CAMERA, PERMISSION_DENIED, DISCONNECTED, TIMEOUT vagy READY.

A telepítési konfigurációt a kp_camera_installation_settings tárolja. A feloldási sorrend DEVICE > ZONE > SITE > TENANT; a legkonkrétabb létező beállítás nyer, új telepítés pedig alapból tiltott. A Player által jelentett futásidejű állapot a kp_device_camera_capabilities táblába kerül. Kapcsolódó végpontok: GET /camera/access, GET/PUT /camera/installations, GET /camera/devices/config és POST /camera/devices/capability.

Telepítés: database/migrations/019_camera_installation_settings.sql. A migráció az aktív kameraélménnyel már rendelkező tenantok működését tenant-szintű engedéllyel őrzi meg; minden új konfiguráció kifejezett engedélyezést igényel.

Capture Módok

  • VISITOR_CAMERA: a látogató telefonja készíti és tölti fel a képet a kpGo PWA-ból.
  • DEVICE_CAMERA: a látogató hozzájárulása után a kijelző vagy kioszk készíti és tölti fel a képet device authentikációval.

A Visitor Remote profilban a CAMERA_START egyetlen, felhasználóbarát kameraengedély. Szerveroldalon umbrella-jogként engedélyezi a teljes kamera-életciklust: CAMERA_CAPTURE, CAMERA_RETAKE, CAMERA_ACCEPT és CAMERA_CANCEL. Ezeket nem kell külön admin checkboxként kezelni.

Hozzájárulás és Letöltés

A látogató a kpGo felületen fogadja el az élményhez tartozó consent_title és consent_text szöveget. A capture után az API letöltési tokent hoz létre a kp_camera_download_tokens.token_hash mezőben, a publikus fotó URL pedig a kpgo.pro/photo/{token} útvonalon nyílik.

DEVICE_CAMERA módban a letöltési token a capture azonosítóból szerveroldali HMAC-kel újraépíthető, ezért a látogatói GET /camera/visitor/sessions/:id válasz API restart után is vissza tudja adni a download URL-t. Régi, memóriában tartott session download map továbbra is kompatibilis, de nem szükséges az új device-camera flow-hoz.

Regressziós Ellenőrzés

A DB séma ellenőrzése: npm run verify:camera-db. A device-camera letöltési lánc restart-határral együtt tesztelhető: CAMERA_SMOKE_RESTART=1 npm run smoke:camera-device. A smoke ideiglenes entitlement override-ot, eszközszintű telepítési engedélyt, kamera-képességet, kameraélményt és teszt capture-t hoz létre, majd visszaállítja az eredeti állapotot.

Valós Browser Player hardverpróba 2026-07-24: az InkognitóAblakTeszt kijelző kamera API támogatást, jelen lévő kamerát, GRANTED engedélyt és effektív READY állapotot jelentett. A tartós teszt fixture ismételhető parancsa: npm run setup:camera-test.

5. Előfizetési és Szerepkör Jogosultságok

Egy funkció akkor használható, ha a felhasználó szerepköre és a tenant effektív előfizetési jogosultsága is engedélyezi. Az effektív entitlement a csomagverzióból és az opcionális tenant override-ból áll elő; inaktív előfizetésnél a feature tiltott.

Feature Kulcsok

  • feature_visitor_remote: Visitor QR session, profil és látogatói vezérlés.
  • feature_staff_remote: Staff Remote eszközlista, kijelzőparancsok és visitor session beavatkozások.
  • feature_camera_exp: Camera Experience, a külön telepítési és hardverkapukkal együtt.
  • feature_analytics: Proof of Play riport, statisztika és export.
  • feature_api_access: API-kulcsok és inbound integrációs parancsok.
  • feature_webhooks: webhook végpontok és kézbesítési naplók.
  • feature_white_label: tenant arculat módosítása.
  • feature_sso: fenntartott entitlement; az SSO runtime még nincs implementálva.

Szerepkörök és API Kapuk

A Staff Remote felületet STAFF, STAFF_MANAGER és TENANT_ADMIN használhatja, de csak aktív feature_staff_remote mellett. A visitor profilokat kizárólag tenant adminisztrátor kezelheti. A VIEWER nem küldhet kijelzőparancsot és nem avatkozhat visitor sessionbe.

A feature-rel védett végpont tiltáskor 403 FEATURE_NOT_AVAILABLE választ ad a feature kulccsal. A Platform Admin override-listája ugyanazt a nyolc feature kulcsot használja, mint a Tenant App előfizetési nézete és az API entitlement feloldója.

Platform Technikai Tenant

A PLATFORM_SUPER_ADMIN tagság adatbázis-integritás miatt egy külön KioskPilot Platform technikai tenanthoz tartozik. Ez nem előfizető, nincs előfizetése vagy ügyféltartalma, és az API kizárja az előfizetői listából. A csomagváltási végpont is tiltja: 403 TECHNICAL_TENANT_FORBIDDEN. Új ügyfelet mindig a Platform Admin előfizető-létrehozási folyamatával kell felvenni.

Visitor Remote Tartalomvezérlés

A Tenant App kijelzőnkénti Távirányító beállításában külön engedélyezhető az Előző (PREV), Következő (NEXT) és Diaválasztás (SELECT_ITEM). A kpGo csak az engedélyezett vezérlőket jeleníti meg, az API pedig minden műveletnél újra ellenőrzi a profil allowlistjét.

Az aktív kiadás tartalmaihoz ugyanebben az ablakban saját látogatói gombfelirat, ikon és láthatóság állítható. A gomb kizárólag az adott kijelző aktív manifestjében szereplő médiát indíthatja. A többnyelvű médiafájlok egy logikai tartalomgombként jelennek meg; a kiválasztott látogatói nyelvet a Player alkalmazza. Tetszőleges külső URL látogatói gombként nem engedélyezett.

A metadata a kp_media.visitor_remote_visible, visitor_remote_title és visitor_remote_icon mezőkben él. A profilválasz items listája csak az aktív kiadás biztonságosan indítható tartalmaiból épül fel. Regresszió: TST-025 ellenőrzi a PREV, NEXT és SELECT_ITEM Player ACK láncot.

Csomagverziók, Limitek és Árak

A Csomagok & Limitek nézetben új csomag hozható létre, illetve módosítható a csomag neve, leírása, aktív állapota, hat limitje, nyolc szolgáltatása, valamint havi és éves HUF ára. A csomag slugja létrehozás után nem változtatható.

Minden mentett módosítás új, megváltoztathatatlan kp_plan_versions verziót készít. Az új előfizetés és a későbbi kézi csomagváltás mindig a legfrissebb verziót kapja; a meglévő előfizetők nem kerülnek automatikusan új árra vagy limitekre. Ez megakadályozza a csendes szerződésmódosítást. A verzióelőzmény a szerkesztőablakban látható.

Inaktivált csomag új előfizetéshez nem választható, de a már azon lévő előfizetők és korábbi verzióik megmaradnak. A létrehozás PLAN_CREATED, a módosítás PLAN_VERSION_CREATED audit eseményt ír. Kapcsolódó végpontok: GET/POST /platform/plans, PUT /platform/plans/:planId és GET /platform/plans/:planId/versions.

Fejlesztési Frissítési Szabály

Új vagy módosított feature esetén együtt kell frissíteni az API entitlement contractot, a Platform Admin csomag- és override nézetét, a Tenant App elérhetőségi állapotát, az érintett kpGo/Player/Staff felületet, az automatizált contract ellenőrzést, ezt a súgót és a user_task_list.md élő teendőlistát.

6. PM2 Futáskörnyezet & Háttérfolyamatok

A KioskPilot V3 monorepó szolgáltatásai a háttérben PM2 folyamatkezelő alatt futnak.

Aktív PM2 Folyamatok

Szolgáltatás Neve Alkalmazás Útvonala Port Státusz
kioskpilot-apiapps/api/index.js3214online
kioskpilot-tenant-appapps/tenant-app/index.js3211online
kioskpilot-kpgoapps/kpgo/index.js3215online
kioskpilot-platform-adminapps/platform-admin/index.js3212online
kioskpilot-marketingapps/marketing/index.js3210online
kioskpilot-staff-remoteapps/staff-remote/index.js3213online
kioskpilot-workerapps/worker/index.jsháttérfolyamatonline

Háttérmunkás (Worker) indítása

A médiafeldolgozást, a Camera Experience retention takarítását és a webhook kézbesítést a háttérben futó worker kezeli. A Proof of Play eseményeket az API fogadja és tárolja; azok nem worker-jobként érkeznek. A worker indítása a projekt gyökérkönyvtárából:

pm2 start ecosystem.worker.config.js
pm2 status kioskpilot-worker

Adatbázis Migrációk

Éles környezetben az API nem futtat automatikus DDL műveleteket. A verziózott database/migrations/*.sql fájlokat root vagy külön DBA/migration felhasználó telepíti, az alkalmazás kpilot_app felhasználója pedig szándékosan csak SELECT, INSERT, UPDATE és DELETE jogot kap. A dedikált kpilot_migrate kizárólag a kpilot_core sémán kap DDL-jogot. A npm run migrate automatikusan betölti a ~/.config/kioskpilot/migration.env 600-as jogosultságú hitelesítését; egyedi hely a KIOSKPILOT_MIGRATION_ENV változóval adható meg. Runtime route nem hozhat létre és nem módosíthat táblát.

A migration history és az élő séma egyezése a projekt gyökeréből a npm run verify:manual-migrations paranccsal ellenőrizhető. Az ellenőrzés alapból read-only. A --apply kapcsoló kizárólag teljes oszlop-, index-, idegenkulcs- és backfill-fingerprint egyezésnél írhat hiányzó history sort; DDL-t nem futtat és üzleti adatot nem módosít. A 2026-07-24-i DB-REC-01 rendezés után a kézzel telepített 016_visitor_action_events.sql, 017_visitor_controller_state.sql, 018_media_visitor_settings.sql és 019_camera_installation_settings.sql history-bejegyzése konzisztens.

A projektmappa-séma 024_projects_and_folders.sql migrációja naplózott. A korai 025_seed_totem02_flow.sql hibás, verziózás előtti teszt seed volt; most dokumentált történeti no-op, ezért migráció soha nem hoz létre tenant üzleti tartalmat. A valós múzeumi fixture csak az explicit reset:museum-content, import:backstage-museum és import:online-exhibition munkafolyamatokkal kezelhető.

A runtime séma-szerződés ellenőrzése: npm run verify:runtime-schema-contract. Ez igazolja, hogy aktív API route nem futtat projekt-DDL-t, nem hivatkozik a megszűntetett kp_playlist_items táblára, és a médiahasználat a kanonikus ContentVersion/PlaylistVersion/Release/Schedule láncon oldódik fel.

Runtime titkok és JWT rotáció

Productionben a JWT_SECRET kötelező, erős, egyedi környezeti titok. Az API 2026-08-12 óta fail-closed: hiányzó vagy 64 karakternél rövidebb kulccsal nem indul el, és nincs forráskódbeli fallback. A rotáció a projekt gyökeréből az npm run security:rotate-jwt -- --confirm=ROTATE_KIOSKPILOT_JWT_SECRET paranccsal végezhető. A segéd 0600-as rollback másolatot készít, kriptográfiai kulcsot generál annak kiírása nélkül, atomikusan frissíti a .env-et és törli a kp_sessions refresh sessionöket.

A rotáció minden aktív Admin/Tenant munkamenetet megszakít, ezért utána pm2 reload all --update-env, teljes újrabejelentkezés és auth-smoke szükséges. A 2026-08-12-i első éles rotáció 58 refresh sessiont vont vissza; a régi fallback token 403, az új teszttoken 200, a visszavont refresh token 401 eredményt kapott. A titok értéke naplóba, dokumentumba vagy verziókezelt fájlba nem kerülhet.

Kódfrissítés és Ellenőrzés

Kódmódosítás után a szerveren minden PM2 folyamatot újra kell tölteni, majd ellenőrizni kell az API health végpontot és a hét folyamat állapotát:

ssh root@80.211.223.119 "su - kpilot -c 'cd /home/kpilot/web && pm2 reload all'"
curl -fsS https://api.kioskpilot.cloud/health
pm2 status

Ha a távoli root SSH kulcshitelesítés hibás, a reload nem tekinthető igazoltnak. A szerveren helyben, kpilot felhasználóként kell futtatni a cd /home/kpilot/web && pm2 reload all parancsot, majd külön health check és 7/7 online ellenőrzés szükséges.

7. Perzisztens Parancsok és Offline Működés

A kijelzőparancs nem egyszerű WebSocket-üzenet: minden kérés tartós kp_commands ledgerrekordot és kp_command_history állapottörténetet kap. Így az offline kijelzőre küldött, illetve hálózatváltás közben megszakadt művelet követhető és korlátozottan újraküldhető.

Állapotgép

Új parancs mindig PENDING. Csak sikeres WebSocket-küldési kísérletkor lesz SENT. A kijelző ACKNOWLEDGED, majd EXECUTING, végül COMPLETED vagy FAILED állapotot küldhet. Lejárt vagy a kézbesítési keretet kimerítő parancs EXPIRED. Terminális állapotból nincs visszalépés.

PENDING → SENT → ACKNOWLEDGED → EXECUTING → COMPLETED
                                      └──────────────→ FAILED
PENDING / SENT / EXECUTING ──────────→ EXPIRED

Offline Sor és Újrakézbesítés

  • Alapértelmezett parancs-érvényesség: 5 perc.
  • Legfeljebb 3 kézbesítési kísérlet; a próbák a SENT history bejegyzésekből számolódnak.
  • Újracsatlakozáskor a gateway rövid ACK-várakozás után csak a nem terminális, még érvényes parancsot küldi újra.
  • A commandId idempotencia-azonosító: ugyanazt a műveletet a Player nem hajthatja végre kétszer.

Player ACK Outbox és Deduplikáció

A Browser Player a terminális eredményt előbb helyi, tartós outboxba menti, és csak utána küldi WebSocketen. Reload vagy kapcsolatvesztés után az outboxot újraküldi, amíg a szerver command_status_ack választ nem ad. Az utolsó 100 terminális commandId receipttel deduplikál: ismételt kézbesítésnél a korábbi eredményt küldi vissza, a parancsot nem futtatja újra.

{
  "event": "command_status",
  "commandId": "UUID",
  "status": "COMPLETED",
  "payload": { "result": "ok" }
}

A szerver csak ahhoz az eszközhöz tartozó parancs státuszát fogadja el, amelyik a WebSocketen hitelesítette magát. Ismeretlen azonosító, érvénytelen státusz, terminális állapot felülírása vagy állapot-visszalépés elutasított.

Regressziós Ellenőrzés

npm run test:command-delivery valós adatbázison és WebSocket gateway-en ellenőrzi az online kézbesítést, offline queue-t, megszakított EXECUTING állapot utáni újraküldést, terminális ACK-ot és azt, hogy a következő reconnectkor nincs újrajátszás. A release-state konkurenciateszt: npm run test:device-release-state-api; ez 12 egyidejű ACTIVE jelentést is küld.