Přeskočit na obsah

Vzdálené ovládání a mobil

Control Center je aplikace pro počítač, ale práce, kterou sleduje, neskončí, když odejdeš od stolu. Vzdálené ovládání spáruje telefon s cc_server přes Remote, doprovodnou aplikaci na remote.usectrl.dev, takže odtamtud sleduješ flotilu: čteš zprávy a tickety, odpovíš agentovi, vytřídíš kanál novinek, a zvuk, přepis, zdrojový kód ani přihlašovací údaje, které žijí na serveru, ho nikdy neopustí.

Ber ho jako společníka stolu, který skoro jen čte. Plného klienta na počítači nahradit nemá.

Telefon dosáhne na cc_server přes WebSocket: buď přímým spojením (loopback, LAN, tailnet nebo wss://), nebo místností za pozvánkou na signalizačním zprostředkovateli, který přepojuje zapečetěné rámce. Datový kanál peer-to-peer tu není.

Spárovaný telefon dosáhne na malý, záměrný výřez plochy serveru:

  • Čtení ticketů, agentů, prostorů a jejich zpráv a tvého kanálu novinek
  • Odpověď: pošleš zprávu v prostoru, aktualizuješ nebo přidělíš ticket, označíš článek jako přečtený nebo uložený
  • Spuštění playbooku: založíš instanci uložené šablony plánu s jejími parametry. Jen navrhne plán; nic se nespustí a nic se neutratí, dokud ho operátor neschválí v Plan Studio na plném klientovi
  • Přepnutí pracovního prostoru z vlastního výběru na telefonu

Víc toho skoro není. Telefon je principál s nižšími oprávněními než plný klient. Nesmí spouštět procesy, utrácet rozpočet LLM, poslat push na GitHub ani zakládat pracovní prostory. Jak se to vynucuje, a ne jen zamýšlí, popisuje model přístupu.

Spojení jede po zprostředkovaném relé: server vstoupí do jedné místnosti za pozvánkou na zprostředkovateli wss:// jako její vlastník a každý spárovaný klient — desktop, web, telefon — vstoupí do stejné místnosti s časově omezeným vstupním tokenem. Sejdou se tři díly:

Díl Úloha
Remote (telefonní aplikace) Doprovodná webová aplikace, ve výchozím stavu hostovaná na remote.usectrl.dev, nebo u tebe. Načte se v prohlížeči a záznam párování drží v IndexedDB.
Zprostředkovatel relé Bezstavové relé wss:// (cc_signaling_server), které hostuje místnosti pro N stran. Vozí jen neprůhledné rámce: každý payload je zapečetěný od konce ke konci mezi telefonem a serverem, takže zprostředkovatel nikdy neuvidí data aplikace ani tajemství párování a nikdy nevykládá, co přeposílá.
cc_server Vlastník místnosti. Na volání telefonu odpovídá stejným dispečerem, kterého používá každý jiný klient.

Nabídka párování nese deskriptor spojení, který vypisuje každou cestu k serveru (LAN, tailnet, veřejné wss://, relé) a otisk identity. Resolver telefonu vybere nejlepší dosažitelnou cestu a při prvním spojení připne otisk (TOFU); relé zaručí spojení i tam, kde přímá cesta není, a provoz nikdy nepřečte.

Co je párovací payload

Sekce “Co je párovací payload”

Párování se vydává z aplikace a doručí se jako přímý odkaz; postup je na stránce Spárujte zařízení. Tady záleží na tom, z čeho se skládá.

https://<pwa-host>/#<payload>

Payload jede ve fragmentu URL, v části za #, kterou prohlížeč nikdy nepošle serveru, takže HTTPS hostitel PWA ho neuvidí. Veze všechno, co telefon potřebuje, aby na server dosáhl a prokázal, kdo je: deskriptor spojení (každá cesta plus otisk identity), čerstvě vydané id zařízení, 32bajtový předem sdílený klíč a razítko platnosti. Telefon ho dekóduje, záznam párování uloží místně a fragment odebere, takže tajemství z URL zmizí.

Jsou dva tvary payloadu a nejdou zaměnit. QR telefonu vydaný z panelu párování v aplikaci je v2 PairingPayload výše a míří na hostitele PWA Remote. cc_server pair --client-url vydá jiný, starší odkaz v1 ({s, i, k} — URL serveru, id zařízení, klíč) jen pro webového klienta.

Liší se i životností, a to se snadno splete:

Vydal Platnost pověření
Panel párování v aplikaci (pairing.mint) vždy 30 dní
cc_server pair na příkazovém řádku Žádná — pověření nevyprší

Spárované zařízení je ověřené, ale nedůvěryhodné. Několik nezávislých bran brání tomu, aby se schválené (nebo uniklé) párování stalo plným ovládáním serveru.

1. Hranicí je členství, ne párování

Sekce “1. Hranicí je členství, ne párování”

Platný párovací klíč dokazuje, které zařízení jsi. Co smíš číst nebo měnit, rozhoduje role v pracovním prostoru, znovu vyhodnocená při každém jednotlivém volání, a u všeho, co odhaluje obsah repozitáře, i oprávnění k tomu repozitáři. Zařízení s úplně platným klíčem, které patří uživateli, jenž není členem uvedeného pracovního prostoru, se odmítne textem “Not a member of this workspace”.

Minimální role se odvodí z druhu operace, pokud si operace nestanoví vlastní: čtení potřebuje guest, změna member, destruktivní operace admin.

2. Telefon je nižší úroveň relace

Sekce “2. Telefon je nižší úroveň relace”

Nad kontrolou role nese relace telefonu nižší schopnost než relace desktopu nebo webu. Operace deklarované jen pro plného klienta se telefonu odmítnou ještě předtím, než se spustí handler, ať je uživatel za ním jakkoli privilegovaný: vydávání, výpis, přejmenování a odvolání párování zařízení; čtení a nastavení konektivity tunelu; záloha serveru a export či import pracovního prostoru; detekce a ukončení procesů; sondy adaptérů; nastavení serveru; správa SSO; řízení flotily; převzetí běžícího agenta nebo vrácení řízení.

3. Seznam povolených nástrojů s výchozím zákazem

Sekce “3. Seznam povolených nástrojů s výchozím zákazem”

Konkrétně pro plochu nástrojů MCP (tools/call) platí seznam povolených s výchozím zákazem: určuje, které nástroje telefon smí zavolat. Co na seznamu není, se odmítne ještě před během. Seznam je převážně čtení a pozorování plus hrstka zápisů jen místních — zpráva, aktualizace ticketu, příznak článku — které neutrácí rozpočet LLM, nespouští proces a nesahají na vnější systém.

Odmítne se třeba: zeptat se agenta, spustit AI kontrolu, ukončit agenta, publikovat revizi na GitHub, najmout nebo propustit agenty, založit pracovní prostor.

4. Rozsah pracovního prostoru u každého volání

Sekce “4. Rozsah pracovního prostoru u každého volání”

Server nedrží žádný „aktuální pracovní prostor“. Je schválně bezstavový: každé volání vázané na pracovní prostor musí ve svých argumentech uvést cílové workspace_id a dispečer volání rovnou odmítne, když chybí nebo jmenuje pracovní prostor, který server nemá zaregistrovaný — dřív, než cokoli otevře databázi. Telefon proto nikdy nezdědí rozsah jiného klienta ani do něj nesklouzne a pojmenovat cizí pracovní prostor taky nepomůže, protože kontrola členství z brány 1 pořád platí. Je to stejný invariant izolace pracovních prostorů, který vynucuje zbytek produktu.

5. Rámce zapečetěné od konce ke konci předem sdíleným klíčem

Sekce “5. Rámce zapečetěné od konce ke konci předem sdíleným klíčem”

Každý rámec mezi telefonem a serverem je zapečetěný párovacím klíčem; vstupní token klienta jen pustí do místnosti a nic neodšifruje. Zprostředkovatel přeposílá šifrový text a klíč nikdy neuvidí. Odvolané zařízení najde své pověření už pryč, takže se při opětovném připojení uzavře.

Pověření vydané aplikací je časově omezené na 30 dní; po nich ho brána připojení odmítne a telefon se musí spárovat znovu. Odvolání je živé: server sleduje tabulku zařízení a do několika sekund shodí otevřené relace odvolaného zařízení, místo aby čekal na další připojení.

6. Omezování četnosti podle principála

Sekce “6. Omezování četnosti podle principála”

Omezovač s posuvným oknem stropuje vzdálený provoz nástrojů na 120 volání za minutu a na slovesa, která mění stav, má přísnější dílčí strop 30 za minutu. Rozpočet patří principálovi, ne relaci: tři tvá zařízení čerpají z jednoho přídělu, takže unesený klient nezíská víc prostoru tím, že otevře další relace, a jeden hlučný člen nemůže ostatním kapacitu sebrat.

7. Zprostředkovatel, který se nic nedozví

Sekce “7. Zprostředkovatel, který se nic nedozví”

Zprostředkovatel relé je schválně hloupý: hostuje místnosti, přeposílá zapečetěné rámce a nedrží účty, data aplikace ani klíče. Místnosti jsou za pozvánkou a dočasné. Data aplikace, zvuk, přepis, zdrojový kód i přihlašovací údaje zůstávají na serveru.

Po spárování dostává telefon živé aktualizace jako oznamovací rámce — nové zprávy agentů, tickety přidělené tobě, změny stavu — ve stejném duchu jako oznámení na desktopu. Server ty rámce rozešle každé připojené relaci a filtr pracovního prostoru se použije na klientovi, takže vidíš to, co patří k pracovnímu prostoru, na který se díváš.

Plocha Co ukazuje
Nastavení → Vy → Vaše zařízení (/workspaces/:workspaceId/settings/you/devices) Spárovaní klienti s živým stavem, plus Spárovat nového klienta (webový prohlížeč, desktopová aplikace nebo telefon) a odvolat

Stejný panel vydává párování i pro druhý prohlížeč nebo desktopovou aplikaci, ne jen pro telefony — postup je stejný, liší se jen přímý odkaz.