Gå til innholdet

Fjernstyring og mobil

Control Center er en skrivebordsapp, men arbeidet den følger med på, stopper ikke når du forlater skrivebordet. Fjernstyring parer telefonen din med cc_server ved hjelp av Remote, følgeappen på remote.usectrl.dev, slik at du kan følge flåten derfra: lese meldinger og saker, svare en agent, prioritere nyhetsstrømmen din — uten at lyden, transkripsjonen, kildekoden eller legitimasjonen som ligger på serveren, noen gang forlater den.

Se på den som en ledsager til skrivebordet som stort sett leser. Den er ikke ment å erstatte den fulle skrivebordsklienten.

Telefonen når cc_server over en WebSocket: enten en direkte tilkobling (loopback, LAN, tailnet eller wss://) eller et invitasjonsbeskyttet rom hos en signalmegler som videresender forseglede rammer. Det finnes ingen peer-to-peer-datakanal.

Den parede telefonen når en liten, bevisst utvalgt del av serverens flate:

  • Les saker, agenter, områder og meldingene deres, og nyhetsstrømmen din
  • Svar: send en melding i et område, oppdater eller tildel en sak, merk en artikkel som lest eller lagret
  • Kjør en playbook: instansier en lagret planmal med parameterne sine. Dette bare foreslår en plan; ingenting utføres eller koster noe før en operatør godkjenner den i Plan Studio på en full klient
  • Bytt arbeidsområde, fra telefonens egen velger

Det er nesten alt sammen. En telefon er en principal med lavere privilegier enn en full klient. Den kan ikke starte prosesser, bruke LLM-budsjett, pushe til GitHub eller opprette arbeidsområder. Se tilgangsmodellen for hvordan dette håndheves i stedet for bare å være ment.

Forbindelsen går over et formidlet relé: serveren blir med i ett invitasjonsbeskyttet rom hos en wss://-megler som eieren sin, og hver parede klient — skrivebord, nett, telefon — blir med i samme rom med et tidsbegrenset adgangstoken. Tre brikker spiller sammen:

Brikke Rolle
Remote (telefonappen) Følgenettappen, hostet på remote.usectrl.dev som standard, eller selvhostet. Lastes i en nettleser, holder paringsoppføringen i IndexedDB.
Relémegleren Et tilstandsløst wss://-relé (cc_signaling_server) som er vert for rom med N parter. Det frakter bare ugjennomsiktige rammer: hver nyttelast forsegles ende-til-ende mellom telefonen og serveren, så megleren ser aldri appdata eller paringshemmeligheten og tolker aldri det den videresender.
cc_server Eieren av rommet. Den svarer på telefonens kall gjennom den samme dispatcheren som alle andre klienter bruker.

Et paringstilbud inneholder en tilkoblingsbeskrivelse som lister opp alle veier til serveren (LAN, tailnet, offentlig wss://, relé) pluss identitetsfingeravtrykket. Telefonens oppslager velger den beste tilgjengelige veien og fester fingeravtrykket ved første tilkobling (TOFU); reléet garanterer tilkobling selv når ingen direkte vei finnes, uten å kunne lese trafikken.

Paring utstedes fra appen og leveres som en dyplenke; se Koble til en enhet for framgangsmåten. Anatomien er det som betyr noe her.

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

Nyttelasten ligger i URL-fragmentet, delen etter # som nettlesere aldri sender til serveren, så PWA-ens HTTPS-vert ser den aldri. Den inneholder alt telefonen trenger for å nå serveren og bevise hvem den er: tilkoblingsbeskrivelsen (alle veier pluss identitetsfingeravtrykket), en nyutstedt enhets-id, en forhåndsdelt nøkkel på 32 byte og et utløpstidsstempel. Telefonen dekoder den, lagrer en paringsoppføring lokalt og fjerner fragmentet, slik at hemmeligheten forlater URL-en.

Det finnes to former for nyttelast, og de er ikke utbyttbare. Telefon-QR-en som utstedes fra paringspanelet i appen, er v2-PairingPayload over, rettet mot Remote PWA-verten. cc_server pair --client-url sender ut en annen, eldre v1-lenke ({s, i, k} — server-URL, enhets-id, nøkkel) som bare er ment for nettklienten.

De skiller seg også i levetid, noe det er lett å ta feil av:

Utstedt av Legitimasjonens utløp
Paringspanelet i appen (pairing.mint) 30 dager, alltid
cc_server pair på kommandolinjen Ingen — legitimasjonen utløper ikke

En paret enhet er autentisert, men ikke betrodd. Flere uavhengige sperrer hindrer at en godkjent (eller lekket) paring blir full kontroll over serveren.

En gyldig paringsnøkkel beviser hvilken enhet du er. Hva du får lese eller endre, avgjøres av arbeidsområderollen din, som løses opp på nytt ved hvert eneste kall, og av per-repo-tildelinger for alt som eksponerer repoinnhold. En enhet med en helt gyldig nøkkel, men som tilhører en bruker som ikke er medlem av det navngitte arbeidsområdet, avvises med «Du er ikke medlem av dette arbeidsområdet».

Rollegulvet utledes fra operasjonens type med mindre den erklærer sitt eget: lesing krever guest, mutasjoner krever member, destruktive operasjoner krever admin.

Utover rollekontrollen har en telefonøkt lavere rettigheter enn en skrivebords- eller nettøkt. Operasjoner som er erklært kun for fulle klienter, avvises for en telefon før behandleren kjører, uansett hvor privilegert brukeren bak den er: å utstede, liste opp, gi nytt navn til og tilbakekalle enhetsparinger; å lese og angi tunnelkonnektivitet; sikkerhetskopi av server og eksport/import av arbeidsområde; prosessoppdagelse og -avslutning; adapterprober; serverinnstillinger; SSO-administrasjon; flåtestyring; og å overta eller levere tilbake en kjørende agent.

3. En tillatelsesliste for verktøy med standard avvisning

Seksjon med tittelen «3. En tillatelsesliste for verktøy med standard avvisning»

For MCP-verktøyflaten spesielt (tools/call) styrer en tillatelsesliste med standard avvisning hvilke verktøy telefonen kan kalle. Alt som ikke står på listen, avvises før det kjører. Listen er tung på lesing og observasjon, pluss en håndfull kun lokale skriveoperasjoner — en melding, en saksoppdatering, et artikkelflagg — som ikke bruker LLM-budsjett, starter noen prosess eller berører noe eksternt system.

Avvist, for eksempel: å rådføre seg med en agent, starte en AI-gjennomgang, avslutte en agent, publisere en gjennomgang til GitHub, ansette eller si opp agenter, opprette et arbeidsområde.

Serveren har ingen «gjeldende arbeidsområde». Den er tilstandsløs av design: hvert kall som er knyttet til et arbeidsområde, må navngi målet sitt workspace_id i argumentene, og dispatcheren avviser kallet helt når det mangler eller navngir et arbeidsområde serveren ikke har registrert — før noe åpner en database. En telefon kan derfor aldri arve eller gli inn i en annen klients avgrensning, og å navngi et fremmed arbeidsområde hjelper heller ikke, fordi medlemskapskontrollen i sperre 1 fortsatt gjelder. Dette er den samme invarianten for arbeidsområdeisolering som resten av produktet håndhever.

5. Ende-til-ende-forseglede rammer nøklet med den forhåndsdelt nøkkelen

Seksjon med tittelen «5. Ende-til-ende-forseglede rammer nøklet med den forhåndsdelt nøkkelen»

Hver ramme mellom telefon og server forsegles med paringsnøkkelen; adgangstokenet slipper bare en klient inn i rommet og dekrypterer ingenting. Megleren videresender chiffertekst og ser aldri nøkkelen. En enhet som tilbakekalles, oppdager at legitimasjonen allerede er borte, så den svikter lukket ved gjentilkobling.

En legitimasjon utstedt av appen er tidsbegrenset til 30 dager; etter det avviser tilkoblingssperren den, og telefonen må pares på nytt. Tilbakekalling skjer umiddelbart: serveren overvåker enhetstabellen og lukker åpne økter for en tilbakekalt enhet innen sekunder i stedet for å vente på neste tilkobling.

En begrenser med glidende vindu setter taket for ekstern verktøytrafikk til 120 kall i minuttet, med en strammere delgrense på 30 i minuttet for de muterende handlingene. Budsjettet tilhører principalen, ikke økten: tre av enhetene dine trekker på én og samme kvote, så en kapret klient kan ikke kjøpe seg spillerom ved å åpne flere økter, og ett støyende medlem kan ikke sulte ut de andre.

Relémegleren er med vilje dum: den er vert for rom, videresender forseglede rammer og har ingen kontoer, ingen appdata og ingen nøkler. Rommene er invitasjonsbeskyttede og kortvarige. Appdata, lyd, transkripsjon, kildekode og legitimasjon blir alt sammen på serveren.

Når telefonen er paret, mottar den sanntidsoppdateringer som varselrammer — nye agentmeldinger, saker tildelt deg, statusendringer — som speiler skrivebordets egne varsler. Serveren kringkaster disse rammene til hver tilkoblet økt, og arbeidsområdefilteret brukes på klientsiden, så det du ser, er avgrenset til arbeidsområdet du ser på.

Flate Hva den viser
Innstillinger → Deg → Dine enheter (/workspaces/:workspaceId/settings/you/devices) Parede klienter med sanntidsstatus, pluss Par en ny klient (nettleser, skrivebordsapp eller telefon) og tilbakekalling

Det samme panelet utsteder paringer for en ekstra nettleser eller skrivebordsapp, ikke bare telefoner — flyten er identisk, bare dyplenken er forskjellig.