Hoppa till innehåll

Stationer

Bara fakta. För modellen bakom dem, läs Stationer och avskilda miljöer; för att öppna en maskin, följ guiden.

Yta Driver Backend Värde Avskild utgående trafik
Terminal (exec) Ett skal över VM:ens exec-kanal microVM smolvm Ja
Webbläsare Headless Chromium (CDP), Firefox (WebDriver BiDi) eller WebKit (W3C WebDriver) microVM smolvm Ja
Dator X11-skrivbord: indata via hypervisorn, bildfångst via gästagenten QEMU qemu-hvf (macOS), qemu-kvm (Linux), qemu-tcg (oaccelererad reservväg, väljs aldrig automatiskt) Ja
Android Android över ADB Googles emulator android-emulator Nej – emulatorn sköter sitt eget nätverk
iOS iOS-simulator via WebDriverAgent CoreSimulator ios-simulator Nej – nätverket följer värd-Macen

Terminalen och computer_use-ytan delar ytvärdet computer; terminalen känns igen på sin exec-avbildningsmarkör och återanvänds aldrig som ett styrbart skrivbord (eller tvärtom). Ett samtal återanvänder en terminalmaskin.

Motor Värde Protokoll Livevy Stillbilder
Chromium chromium (standard) Chrome DevTools Protocol Screencast – webbläsaren skickar bildrutor när sidan ritas om JPEG
Firefox firefox WebDriver BiDi Pollade stillbilder (BiDi har ingen screencast), högst 6 fps JPEG
WebKit webkit W3C WebDriver (klassisk) Pollade stillbilder, omkodade av värdens ffmpeg PNG

En station kör en motor under hela sin livstid. Ett samtal kan hålla en station per motor, och det är vad som gör en jämförelse sida vid sida möjlig: att öppna ”Firefox (VM)” bredvid ”Chromium (VM)” är två maskiner, och att stänga den ena lämnar den andra igång.

Skicka engine till rig.open eller till verktyget browser_use. Ett okänt namn avvisas i stället för att ersättas med standard – att be om en webbläsare och tyst få en annan besvarar en kompatibilitetsfråga med fel svar.

Motorspecifika gränser, redovisade i stället för att kringgås:

  • Firefox har ingen omladdning som förbigår cachen (den avvisar BiDis ignoreCache rakt av), så en hård omladdning är en vanlig omladdning.
  • WebKit har inte heller någon omladdning som förbigår cachen, ingen konsolström (utdata fångas genom att haka i console.* efter varje navigering, så allt som loggas under inläsningen missas – varje konsolutdrag säger det), och behöver ffmpeg på värden för sin livevy.
  • Ingen av dem exponerar ett plattformstillgänglighetsträd över sitt protokoll, så extract (a11y) returnerar en DOM-härledd approximation, märkt som just det.
  • Ingen av dem kan ta emot ett riktigt filsläpp; ett filuppladdningsfält kan fortfarande riktas mot sökvägar inuti maskinen.
Yta Avbildning Hämtas
Terminal ubuntu:24.04, digest-pinnad Automatiskt vid första starten, via maskinens eget grindade nätverk
Webbläsare (Chromium, Firefox, WebKit) debian:trixie-slim, digest-pinnad, plus motorns egna paket Automatiskt vid första starten, cachas sedan som ett förvärmt paket
Dator En qcow2-skrivbordsavbildning med Chromium, Firefox, WebKit och samma CLI-baslinje för GitHub-hostade runners som terminalen värmer Importera under Inställningar → Server → Stationer (nedladdningar pinnade med kontrollsumma där sådana publicerats)
Android Googles systemavbildningar Via Android SDK
iOS En körtid för Xcode-simulatorn plus kontrollsummepinnad WebDriverAgent Körtid via Xcode; automatiseringsbrygga från Inställningar → Server → Stationer

Efter den första starten av varje microVM-slag cachar servern en redan uppackad kopia under datakatalogen och startar varje senare maskin från den – inklusive förvärmda avbildningar med paketen redan installerade. Terminalen värmer en CLI-verktygsuppsättning av samma slag som en GitHub-hostad runner (git, gcc, python3, jq, rsync, arkivverktyg och resten av apt-baslinjen; inte Docker eller språkverktygscachar). Dator-qcow2:n bakar in samma CLI-namn vid avbildningens byggtiden, bredvid XFCE och de tre webbläsarna. Varje webbläsare värmer sin motor. Alla tre motorerna delar en Debian-bas men delar aldrig ett paket: cachen är nycklad på avbildningen, motorn och en ljudrevision (audio-v1-<engine>), eftersom en maskin som värmts för en motor – eller innan PulseAudio och ffmpeg ingick i arbetslasten – inte har någon av de andra i sig. Terminalpaketet är nycklat på en verktygsuppsättningsrevision (tools-v1) av samma skäl: ett paket som värmts innan kompilatorn ingick i avbildningen får inte betjäna en maskin som ska ha en.

Det finns ingen färdigbakad automatiseringsavbildning värd att använda – Chromiums chromedp/headless-shell kompilerar bort både ALSA och PulseAudio, så den kan aldrig avge ljud; den enda underhållna Firefox-avbildningen är 33× storleken på Debian-basen och levereras ändå utan socat; det finns ingen underhållen WebKit-avbildning alls. Så varje motor installeras vid första starten (chromium, firefox-esr eller webkit2gtk-driver) och når Debian-arkiven (deb.debian.org, security.debian.org, cloudfront.debian.net) under tiden. Chromium är distributionsbinären som startas som chromium --headless=new.

Inställningsnyckel Åsidosätter
rigs.smolvm.execImage Terminalavbildningen (VM)
rigs.smolvm.browserImage Chromium-webbläsaravbildningen (VM)

Skrivs via det admin-grindade inställningslagret för arbetsytan (Inställningar → Server → Stationer → Egna avbildningar (den här arbetsytan)). Värdet måste vara en registerreferens – lokala sökvägar, arkivfiler och flaggliknande strängar avvisas, både i fältet och igen vid start. Ett ogiltigt sparat värde ignoreras högljutt och standardvärdet startar i stället. Avbildningens eget register (plus kända blob-CDN-följeslagare för Docker Hub, GHCR, Quay, GitLab och GCR) släpps in genom utgångsgrinden för hämtningen.

Terminalavbildningens kontrakt – bash finns; git, curl, socat förinstallerade eller en Debian/Ubuntu apt-bas (den avskilda miljön installerar de tre plus en CLI-verktygsuppsättning av samma slag som en GitHub-hostad runner vid första starten: kompilatorer, Python 3, jq, arkivverktyg, rsync. Språkverktygscachar och Docker installeras inte).

Webbläsaravbildningens kontrakt – en Debian/Ubuntu apt-bas (eller paketen redan installerade) med bash och socat, plus en chromium-binär som servern startar själv som chromium --headless=new med DevTools på gästens loopback 9223, vidarebefordrad till gästporten 9222. PulseAudio och ffmpeg installeras vid första starten för ljudkanalen. Bygg inte FROM chromedp/headless-shell: upstream headless.gn kompilerar bort både ALSA och PulseAudio, så den binären kan inte avge ljud. Åsidosättningen gäller endast Chromium-stationer – arbetslastkommandot den startar är Chromiums, och att ge det till Firefox eller WebKit skulle starta en binär som inte finns där. En Firefox- eller WebKit-station ignorerar den högljutt och startar sin pinnade avbildning.

Automatiseringsportar – varje webbläsarmaskin vidarebefordrar exakt en loopback-port på värden till gästen 9222. Bakom den: Chromiums DevTools och Firefox fjärragent ligger på gästens loopback 9223 med ett socat-relä framför (båda binder loopback ovillkorligt); WebKits drivrutin tar en --host och binder gästens nätverkskort själv. Firefox validerar dessutom Host-huvudet mot sin egen port, så klienten skickar gästsidans auktoritet i stället för den den ringde upp.

Varje åtgärd parsas totalt: en felformad nyttolast returnerar ett meddelande som namnger fältet, aldrig ett undantag. Observationsverb (markerade ○) tillåts fortfarande medan en människa håller kontrollen; muterande verb nekas.

screenshot○, cursor_position○, mouse_move, left_click, right_click, middle_click, double_click, triple_click, left_mouse_down, left_mouse_up, left_click_drag, scroll, key, hold_key (0–60 s), type, wait○ (0–60 s), set_display, clipboard_read○, clipboard_write.

Koordinater är gästpixlar i gästens aktuella läge; varje skärmbild anger skärmstorleken. Tangentkombinationer använder X11-stavning (ctrl+s, alt+Tab, Return).

clipboard_read tar en selection: clipboard (det ctrl+C fyller, standarden), primary (X11 markera-för-att-kopiera) eller xdnd (en pågående dragning). Ett tomt resultat är ett normalt svar för alla tre. clipboard_write tar bara text – bilder och filer färdas på filkanalen, eftersom en åtgärds argument sparas i granskningsloggen och bildbyte har inget där att göra. Urklippsinnehåll kommer tillbaka inhägnat som opålitliga data.

navigate (endast http/https), reload (hard valfritt), stop_loading, click (väljare eller koordinat), fill, type, key (DOM-tangentnamn), scroll, mouse_move, drag, left_mouse_down, left_mouse_up, extract○ (a11y | dom | console), screenshot○ (full_page valfritt), set_viewport (min 320×240), history, wait_for○ (väljare, 0,1–30 s), clipboard_read○, clipboard_write.

Extraherat sidinnehåll kommer tillbaka inhägnat som opålitliga data.

Webbläsaren har exakt ett urklipp, så clipboard_read tar ingen selection. Båda urklippsverben behöver en säker kontext: en sida som serveras över vanlig http:// har inget urklipps-API alls, och verbet säger det i stället för att rapportera ett tomt – använd type där, som infogar vid insättningspunkten utan att gå via ett urklipp.

tap, swipe (50–5000 ms), type, key (alias back, home, recents, enter, delete, backspace, tab, escape, search, menu, volume_up, volume_down, power, eller valfritt KEYCODE_*), screenshot○, ui_dump○, install_apk (begränsad till stationens worktree och serverns datakatalog), start_app, stop_app, clear_app_data, uninstall_app, open_url, och shell. shell tar en argv-lista och körs inuti Android, aldrig via ett skal på värden; det täcker utvecklardiagnostik som logcat, dumpsys och pm grant.

mobile_use har inga urklippsverb. Sedan Android 10 får bara den fokuserade appen läsa urklippet.

tap, swipe (50–5000 ms), type, key (enter, backspace, tab, escape, piltangenter eller ett skrivbart tecken; valfria modifierare command, control, option och shift), home, lock, unlock, screenshot○, ui_dump○, install_app (en .app-katalog för simulatorn begränsad till stationens worktree eller serverns datakatalog), start_app, stop_app, uninstall_app, open_url, och spawn. spawn tar argv och kör inuti simulatorn via simctl; den anropar aldrig ett skal på värden.

Koordinater är iOS-skärmens punkter, inte skärmbildspixlar. Liveströmmen behåller simulatorns fasta storlek och förser den med svarta kanter i stället för att ändra enhetens storlek. Texturklippsöverföring från värd till simulator och från simulator till värd använder samma behörighetspolicy per användare och per riktning som andra stationer; filer och bilder tas inte emot av iOS urklippskanal.

Varje station skapar en egen CoreSimulator-enhet och WebDriverAgent-session. Att stänga den stoppar WebDriverAgent, stänger av och raderar enheten och tar bort dess registerpost. iOS-stationer körs bara på en macOS-server med Xcode, en installerad iOS-körtid och den pinnade automatiseringsbryggan. De exponerar ingen garanti för ljud, mikrofon, filsläpp, skal på värden eller avskilt nätverk.

Verktyg Beskrivning
rig_list Listar en arbetsytas stationer med yta, status, skärm och kontrollinnehavare
rig_close Förstör en station och kastar dess disk
Fas Betydelse
provisioning Startar; statusdetaljen återger det aktuella steget ordagrant
ready Nåbar och tar emot åtgärder
parked Parkerad i inaktivitet: vCPU:er stoppade, RAM kvar i minnet; nästa åtgärd väcker den
closing Stänger av
closed Borta; raden finns kvar för granskningsspåret
failed Dog eller kom aldrig upp; särskiljbar så att gränssnittet kan erbjuda ett nytt försök
Stängningsorsak Utlöses när
requested En person eller agent begärde det
idleTimeout Inaktiv förbi 2× inaktivitetsfönstret, eller vräkt av minnesskäl
ttlExpired Den hårda livstiden tog slut
conversationEnded Ägarsamtalet avslutades
workspaceGone Arbetsytan raderades eller medlemskapet förlorades
serverShutdown Servern stoppas
backendFailure Hypervisorn under den dog
Värde Terminal Webbläsare Dator Mobil
Minne 512 MB 2048 MB (Chromium); 2560 MB (Firefox, WebKit) 4096 MB 4096 MB
vCPU:er 2 2 4 4
Hård TTL 8 h 2 h 2 h 2 h
Inaktivitetsfönster 45 min 15 min 15 min 15 min
Startskärm — 1280×800 1280×800 1080×1920
  • Agentkanalens stillbilder har en övre gräns på 1280×800; den mänskliga kanalen förhandlar upp till 2560×1600.
  • Värdens residentminnesbudget för alla stationer är som standard 12 GB, räknat i residenta megabyte (en parkerad VM håller fortfarande sitt RAM). Vräkning sker enligt minst nyligen använd och tar aldrig en maskin som någon kör, tittar på eller har en terminal öppen i.
  • En öppen terminal eller tittarkanal håller stationen kvar mot parkering och inaktivitetsupprensning; den hårda TTL:en gäller fortfarande.
Port Var Reserverad för
7911 Terminalgästen Portmultiplexern som varje vidarebefordran färdas över
9222, 9223 Webbläsargästen Automatiseringsreläet och ändpunkten (WebKit binder 9222 direkt och använder inget relä)
80, 443 Webbläsargästens loopback Dev-domänens HTTP/HTTPS-kanaler
  • Upptäckt pollar terminalgästens lyssnande TCP-portar ungefär var 4:e s, på serversidan.
  • Högst 16 portar vidarebefordras automatiskt per station; fler listas i loggen, men vidarebefordras inte.
  • Vidarebefordran på värdsidan binder loopback och föredrar gästens eget portnummer; Dela på det lokala nätverket lägger till en LAN-port som operativsystemet tilldelar.
  • Dev-domäner måste matcha name.test eller name.localhost (gemener, etikett på högst 63 tecken). En domän mappas till en port.
  • HTTPS för dev-domänen använder en serverlokal CA (EC P-256, under <dataDir>/rigs/tls/, nycklar 0600 och aldrig i en gäst) med ett lövcertifikat med jokertecken för *.test / *.localhost. Ingen openssl på värden betyder ingen HTTPS-kanal; vanlig HTTP dirigeras fortfarande.
Yta Standardtillåtelselista
Terminal Sandlådans utvecklarbaslinje (kodvärdar, paketregister, modellleverantörer) + Ubuntus apt-speglar + worktreens egen kodvärd
Webbläsare usectrl.dev (produktsajten) – plus Debian-arkiven vid varje motors första start, medan den installerar sina paket. Startsidan är ett lokalt file://-dokument och behöver ingen utgående trafik
Dator Tom – neka allt – tills en anropare beviljar värdar
Mobil Framtvingas inte (emulatorstyrt nätverk)

Varje microVM får dessutom sin avbildnings registervärdar, bara för hämtningen. Uppsättningen tillåtna värdar för brokern för autentiseringsuppgifter härleds från samma tillåtelselista: ingen token skapas för en värd som gästen inte kan nå.

Kopiering och inklistring åt båda hållen, och att dra filer in och ut. Tillgängligt för en person som kör en station; en agent får urklippet genom verben ovan och ingen filöverföring alls (den har redan ett skal inuti den avskilda miljön).

Korsning av urklipp sker per användare och per riktning. Inklistring från värd till station tillåts som standard; kopiering från station till värd frågar först (ett beviljande i tio minuter, eller tillåt alltid under Inställningar → Server → Stationer → Urklippsåtkomst). De två valen är oberoende och är aldrig en arbetsyteinställning.

Kanal Rutt Bär
Urklipp GET/POST /rig/clipboard/<rigId> Text, en PNG/JPEG (≤16 MB) och gästsökvägarna för filer i urklippet
Filer POST /rig/files/<rigId> Upp till 64 filer, ≤256 MB var och ≤512 MB per släpp, med en valfri släpppunkt i gästpixlar
Filer GET /rig/files/<rigId>?p=<base64url path> En fils byte, tillbaka ut
  • HTTP, inte RPC. RPC-socketen stänger en anslutning vid en inkommande ram över 256 KB – ett DoS-skydd som är rätt för JSON-kommandon och ödesdigert för en inklistrad skärmbild. Byte färdas på samma slags rutt som stationens bildrutor och mötesljud redan gör.
  • Autentisering är det signerade målet rig-files:<workspaceId>/<rigId> plus arbetsytemedlemskap – ett eget mål, så en URL som skapats för att titta på en maskin kan inte samtidigt skriva filer till den.
  • Övertagande gäller. Att skriva urklippet och släppa filer är muterande och nekas medan någon annan håller kontrollen; att läsa urklippet och läsa ut en fil är observation och nekas inte.
  • Var släpp landar: ~/Drops (skrivbordet), ~/drops (terminalen – bredvid worktreen, aldrig inuti den, så ett släpp aldrig dyker upp som en ospårad ändring), /tmp/cc-drops (webbläsaren). Servern väljer katalogen; en anropare kan inte namnge den. Befintliga filer skrivs aldrig över – ett namn som krockar landar som 2-name.ext.
  • Vad gästen får veta: en webbläsarsida får en riktig släpphändelse vid den begärda punkten (Input.dispatchDragEvent); ett skrivbord får filerna plus deras URI:er i sitt urklipp, eftersom ingen värd kan syntetisera en XDND-dragning in i ett godtyckligt toolkit utan en privilegierad daemon i gästen. Svaret anger vilket av de två som hände.
  • Att dra ut fungerar bara på skrivbordet och läser gästens XdndSelection medan en dragning pågår. En nyttolast som är identisk med den gästen redan höll när tryckningen började behandlas som en inaktuell markering från en avslutad dragning, inte en ny – X har inget steg för ”dragningen är över”.
  • Avbildningskrav: skrivbordsavbildningen måste vara protokoll 2 eller senare (byggd efter att urklippsstödet landade). En äldre avbildning svarar 404 och appen säger att den ska byggas om i stället för att rapportera en trasig maskin.
  • Granskningsloggen registrerar formen, aldrig innehållet: clipboard_read, clipboard_write, drop_files och read_file-rader bär antal, storlekar och sökvägar. Ett urklipp är där autentiseringsuppgifter lever i några sekunder i taget, och inget av det skrivs ned.
  • Stationsverktygen deklarerar åtgärdsklassen enclosureControl (plus networkEgress och processSpawn på användningsverktygen; mobile_use och ios_use deklarerar också packageInstall). rig_close deklarerar enclosureControl; rig_list deklarerar ingen. Tillåtet som standard; skrivskyddade lägen nekar det rakt av; autonomivredet per yta kan degradera det till att fråga först.
  • Domänhändelser: RigClosedEvent (med sin stängningsorsak), RigControlChanged (övertagande / återlämning), RigReaped (inaktivitet, TTL eller minnesvräkning, med den körande agenten). Att öppna en station är inte en händelse. Se domänhändelser.
  • Lagring: rig_sessions och rig_action_log i varje arbetsytas databas. Åtgärdsloggen registrerar varje indatahändelse med sin principal och en monoton sekvens per station; skriven text maskeras till en längd och en hash innan den skrivs.
  • Datakatalog: rigs/images/ (importerade qcow2-avbildningar), rigs/smolvm/ (körningstillstånd per station), rigs/smolvm-packs/ (redan uppackade maskinpaket), rigs/tls/ (dev-domänens CA), rigs/run/ (QEMU-överlägg och seeds).
  • Rutter: livevyn är en flik i en yta eller en PR-sida; /settings/server/rigs är inställningsskärmen Stationer.