Stationer
Bara fakta. För modellen bakom dem, läs Stationer och avskilda miljöer; för att öppna en maskin, följ guiden.
Ytor och backends
Avsnitt med rubriken “Ytor och backends”| 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.
Webbläsarmotorer
Avsnitt med rubriken “Webbläsarmotorer”| 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
ignoreCacherakt 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överffmpegpå 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.
Maskinavbildningar
Avsnitt med rubriken “Maskinavbildningar”| 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.
Egna avbildningar per arbetsyta
Avsnitt med rubriken “Egna avbildningar per arbetsyta”| 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.
Åtgärdsverb
Avsnitt med rubriken “Åtgärdsverb”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.
computer_use
Avsnitt med rubriken “computer_use”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.
browser_use
Avsnitt med rubriken “browser_use”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.
mobile_use
Avsnitt med rubriken “mobile_use”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.
Hanteringsverktyg
Avsnitt med rubriken “Hanteringsverktyg”| 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 |
Livscykel
Avsnitt med rubriken “Livscykel”| 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 |
Standardvärden och tak
Avsnitt med rubriken “Standardvärden och tak”| 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.
Portar och dev-domäner
Avsnitt med rubriken “Portar och dev-domäner”| 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.testellername.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. Ingenopensslpå värden betyder ingen HTTPS-kanal; vanlig HTTP dirigeras fortfarande.
Standardvärden för utgående trafik
Avsnitt med rubriken “Standardvärden för utgående trafik”| 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å.
Urklipp och filöverföring
Avsnitt med rubriken “Urklipp och filöverföring”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 som2-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
XdndSelectionmedan 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_filesochread_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.
Räcken, händelser, lagring
Avsnitt med rubriken “Räcken, händelser, lagring”- Stationsverktygen deklarerar åtgärdsklassen
enclosureControl(plusnetworkEgressochprocessSpawnpå användningsverktygen;mobile_useochios_usedeklarerar ocksåpackageInstall).rig_closedeklarerarenclosureControl;rig_listdeklarerar 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_sessionsochrig_action_logi 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.