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.
Transport
Avsnitt med rubriken “Transport”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.
Vad telefonen kan göra
Avsnitt med rubriken “Vad telefonen kan göra”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.
Hur länken byggs upp
Avsnitt med rubriken “Hur länken byggs upp”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.
Vad parkopplingsnyttolasten är
Avsnitt med rubriken “Vad parkopplingsnyttolasten är”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 |
Åtkomstmodellen
Avsnitt med rubriken “Åtkomstmodellen”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.
1. Medlemskapet, inte parkopplingen, är gränsen
Avsnitt med rubriken “1. Medlemskapet, inte parkopplingen, är gränsen”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.
2. En telefon ligger på en lägre sessionsnivå
Avsnitt med rubriken “2. En telefon ligger på en lägre sessionsnivå”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.
4. Arbetsyteavgränsning per anrop
Avsnitt med rubriken “4. Arbetsyteavgränsning per anrop”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.
6. Hastighetsbegränsning per principal
Avsnitt med rubriken “6. Hastighetsbegränsning per principal”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.
7. En broker som inte får veta något
Avsnitt med rubriken “7. En broker som inte får veta något”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.
Liveuppdateringar
Avsnitt med rubriken “Liveuppdateringar”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å.
Var den finns
Avsnitt med rubriken “Var den finns”| 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.
- Arbetsytor och isolering: arbetsyteavgränsningen per anrop som detta vilar på
- Multiplayer – identitet, medlemskap och närvaro: roller, medlemskap och behörigheter per repo
- Driftsättning och klienter: var fjärrstyrningen hör hemma bland klientnivåerna
- Arkitektur: var fjärrstyrningen hör hemma i stacken
- Para en enhet