Hoppa till innehåll

Fjärrstyrning och mobil

Control Center är en skrivbordsapp, men arbetet den håller reda på stannar inte när du lämnar skrivbordet. Fjärrstyrning parkopplar din telefon med din cc_server via Remote, kompanjonappen på remote.usectrl.dev, så att du kan följa flottan därifrån: läsa meddelanden och ärenden, svara en agent, triagea ditt nyhetsflöde – utan att ljud, avskrifter, källkod eller autentiseringsuppgifter som finns på servern någonsin lämnar den.

Se den som en kompanjon som mest läser, vid sidan av skrivbordsappen. Den är inte tänkt att ersätta den fullvärdiga skrivbordsklienten.

Telefonen når cc_server över en WebSocket: antingen en direkt anslutning (loopback, LAN, tailnet eller wss://) eller ett inbjudningsskyddat rum hos en signalbroker som vidarebefordrar förseglade ramar. Det finns ingen peer-to-peer-datakanal.

Den parkopplade telefonen når en liten, avsiktligt vald del av serverns yta:

  • Läsa ärenden, agenter, ytor och deras meddelanden samt ditt nyhetsflöde
  • Svara: skicka ett meddelande i en yta, uppdatera eller tilldela ett ärende, markera en artikel som läst eller sparad
  • Köra en playbook: instansiera en sparad planmall med dess parametrar. Detta föreslår bara en plan; ingenting körs eller spenderar något förrän en operatör godkänner den i Plan Studio i en fullvärdig klient
  • Byta arbetsyta, från telefonens egen väljare

Det är nästan allt. En telefon är en principal med lägre privilegier än en fullvärdig klient. Den kan inte starta processer, förbruka LLM-budget, pusha till GitHub eller skapa arbetsytor. Se åtkomstmodellen för hur detta upprätthålls i praktiken och inte bara är avsett.

Anslutningen går över ett förmedlat relä: servern ansluter till ett inbjudningsskyddat rum hos en wss://-broker som dess ägare, och varje parkopplad klient – skrivbord, webb, telefon – ansluter till samma rum med ett tidsbegränsat tillträdestoken. Tre delar samverkar:

Del Roll
Remote (telefonapp) Kompanjonwebbappen, som standard hostad på remote.usectrl.dev, eller egenhostad. Laddas i en webbläsare och håller parkopplingsposten i IndexedDB.
Reläbroker Ett tillståndslöst wss://-relä (cc_signaling_server) som hyser rum för N parter. Det bär endast ogenomskinliga ramar: varje nyttolast förseglas end-to-end mellan telefonen och servern, så brokern ser aldrig appdata eller parkopplingshemligheten och tolkar aldrig det den vidarebefordrar.
cc_server Rummets ägare. Den besvarar telefonens anrop genom samma dispatcher som alla andra klienter använder.

Ett parkopplingserbjudande bär en anslutningsbeskrivning som listar varje väg till servern (LAN, tailnet, publik wss://, relä) plus dess identitetsfingeravtryck. Telefonens uppslagning väljer den bäst nåbara vägen och fäster fingeravtrycket vid första anslutningen (TOFU); reläet garanterar anslutning även när ingen direkt väg finns, utan att någonsin kunna läsa trafiken.

Parkoppling skapas i appen och levereras som en djuplänk; se Para en enhet för proceduren. Anatomin är det som spelar roll här.

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

Nyttolasten färdas i URL:ens fragment, delen efter # som webbläsare aldrig skickar till servern, så PWA:ns HTTPS-värd ser den aldrig. Den bär allt telefonen behöver för att nå servern och bevisa vem den är: anslutningsbeskrivningen (varje väg plus identitetsfingeravtrycket), ett nytt enhets-id, en i förväg delad nyckel på 32 byte och en utgångsstämpel. Telefonen avkodar den, lagrar en parkopplingspost lokalt och tar bort fragmentet så att hemligheten lämnar URL:en.

Det finns två former av nyttolasten och de är inte utbytbara. Telefon-QR:en som skapas i parkopplingspanelen i appen är v2-PairingPayload ovan, riktad mot Remote-PWA-värden. cc_server pair --client-url ger en annan, äldre v1-länk ({s, i, k} – server-URL, enhets-id, nyckel) avsedd endast för webbklienten.

De skiljer sig också i livstid, vilket är lätt att få fel:

Skapad av Autentiseringsuppgiftens giltighet
Parkopplingspanelen i appen (pairing.mint) 30 dagar, alltid
cc_server pair på kommandoraden Ingen – autentiseringsuppgiften löper inte ut

En parkopplad enhet är autentiserad men ej betrodd. Flera oberoende grindar hindrar en godkänd (eller läckt) parkoppling från att bli full kontroll över servern.

En giltig parkopplingsnyckel bevisar vilken enhet du är. Vad du får läsa eller ändra avgörs av din arbetsyteroll, som löses om vid varje enskilt anrop, och av behörigheter per repo för allt som exponerar repo-innehåll. En enhet med en fullt giltig nyckel men som tillhör en användare som inte är medlem i den angivna arbetsytan avvisas med “Not a member of this workspace”.

Det lägsta rollkravet härleds från operationens typ om den inte deklarerar ett eget: läsning kräver guest, ändringar kräver member, destruktiva operationer kräver admin.

Utöver rollkontrollen har en telefonsession lägre kapabilitet än en skrivbords- eller webbsession. Operationer som deklareras endast för fullvärdiga klienter avvisas för en telefon innan hanteraren körs, oavsett hur privilegierad användaren bakom den är: att skapa, lista, byta namn på och återkalla enhetsparkopplingar; att läsa och ställa in tunnelanslutning; serversäkerhetskopiering och export/import av arbetsytor; processdetektering och avlivning; adaptersonder; serverinställningar; SSO-administration; flottstyrning; samt att ta över eller lämna tillbaka en körande agent.

3. En tillåtelselista för verktyg med neka som standard

Avsnitt med rubriken “3. En tillåtelselista för verktyg med neka som standard”

För just MCP-verktygsytan (tools/call) styr en tillåtelselista med neka som standard vilka verktyg telefonen får anropa. Allt som inte står på listan avvisas innan det körs. Listan domineras av läsning och observation plus en handfull endast lokala skrivningar – ett meddelande, en ärendeuppdatering, en artikelmarkering – som inte förbrukar någon LLM-budget, inte startar någon process och inte rör något externt system.

Nekade är till exempel: konsultera en agent, starta en AI-granskning, döda en agent, publicera en granskning till GitHub, anställa eller avskeda agenter, skapa en arbetsyta.

Servern har ingen “aktuell arbetsyta”. Den är tillståndslös till sin konstruktion: varje arbetsytebundet anrop måste ange sitt mål workspace_id i sina argument, och dispatchern avvisar anropet direkt när det saknas eller anger en arbetsyta som servern inte har registrerad – innan något öppnar en databas. En telefon kan därför aldrig ärva eller glida in i en annan klients omfattning, och att ange en främmande arbetsyta hjälper inte heller, eftersom medlemskapskontrollen i grind 1 fortfarande gäller. Det här är samma arbetsyteisolering som resten av produkten upprätthåller.

5. End-to-end-förseglade ramar som nycklas av den i förväg delade nyckeln

Avsnitt med rubriken “5. End-to-end-förseglade ramar som nycklas av den i förväg delade nyckeln”

Varje ram mellan telefon och server förseglas med parkopplingsnyckeln; tillträdestoken släpper bara in en klient i rummet, den dekrypterar ingenting. Brokern vidarebefordrar ciphertext och ser aldrig nyckeln. En enhet som återkallas upptäcker att dess autentiseringsuppgift redan är borta, så den faller stängt vid återanslutning.

En autentiseringsuppgift som skapats i appen är tidsbegränsad till 30 dagar; därefter underkänns den av anslutningsgrinden och telefonen måste parkopplas på nytt. Återkallning sker direkt: servern bevakar enhetstabellen och stänger en återkallad enhets öppna sessioner inom några sekunder i stället för att vänta på nästa anslutning.

En begränsare med glidande fönster sätter ett tak för fjärrverktygstrafiken vid 120 anrop i minuten, med en snävare delgräns på 30 i minuten för de muterande verben. Budgeten tillhör principalen, inte sessionen: dina tre enheter tar från samma tilldelning, så en kapad klient kan inte köpa sig mer utrymme genom att öppna fler sessioner och en högljudd medlem kan inte svälta ut de andra.

Reläbrokern är medvetet dum: den hyser rum, vidarebefordrar förseglade ramar och har inga konton, ingen appdata och inga nycklar. Rummen är inbjudningsskyddade och kortlivade. Appdata, ljud, avskrifter, källkod och autentiseringsuppgifter stannar allt på servern.

När telefonen är parkopplad tar den emot liveuppdateringar i form av aviseringsramar – nya agentmeddelanden, ärenden som tilldelats dig, statusändringar – som speglar skrivbordsappens egna aviseringar. Servern sänder dessa ramar till varje ansluten session och arbetsytefiltret tillämpas på klientsidan, så det du ser är begränsat till arbetsytan du tittar på.

Yta Vad den visar
Inställningar → Du → Dina enheter (/workspaces/:workspaceId/settings/you/devices) Parkopplade klienter med aktuell status, plus Parkoppla en ny klient (webbläsare, skrivbordsapp eller telefon) och återkallning

Samma panel skapar parkopplingar för en andra webbläsare eller skrivbordsapp, inte bara telefoner – flödet är identiskt, bara djuplänken skiljer sig.