Hoppa till innehåll

Ge en agent en maskin att testa på

En station är en tillfällig maskin som en agent öppnar när den faktiskt behöver prova något: läsa in en sida, klicka runt i en skrivbordsapp, trycka runt på en telefon. Du kan se den arbeta i realtid och ta över kontrollen när du vill.

Avskilda terminal-, webbläsar- och skrivbordsstationer är virtuella maskiner med tillfälliga diskar och grindade nätverk. Android och iOS är värdhanterade emulatorer: deras enhetstillstånd är tillfälligt, men deras nätverk följer servervärden.

Stationer körs på maskinen som är värd för cc_server – samma maskin, inte den du tittar på. Det finns fem ytor som användaren möter; skrivbords- och mobilytor kräver förberedelser på värden:

Yta Körs på Förberedelse
Terminal (VM) En microVM som startar en pinnad Ubuntu-avbildning Ingen – avbildningen hämtas automatiskt vid första användningen
Webbläsare (VM) En microVM som startar en pinnad Debian-avbildning med Chromium, Firefox eller WebKit installerat vid första användningen Ingen – samma
Dator (VM) QEMU med en Linux-skrivbordsavbildning som levereras med Chromium, Firefox, WebKit och en CLI-baslinje av GitHub-hostad-runner-typ Installera QEMU (brew install qemu) och Importera sedan en skrivbordsavbildning under Inställningar → Server → Stationer
Android Googles Android-emulator Installera Android SDK, skapa en AVD och starta den (nedan)
iOS-simulator CoreSimulator på server-Macen Installera Xcode och den begärda iOS-körtiden och installera sedan automatiseringsbryggan under Inställningar → Server → Stationer

Terminal- och webbläsarmaskinerna startar från digest-pinnade avbildningar: de exakta byten är namngivna i förväg, hämtas en gång vid första starten och cachas – efter den första starten av varje slag hoppar senare maskiner över nedladdningen helt och kommer upp på sekunder. Inställningar → Server → Stationer visar vad din server kan starta och varje maskin som körs just nu.

En installerad skrivbordsavbildning går fortfarande att hantera från samma sida: Importera ersätter den med en nyare qcow2, och Ta bort tar bort den så att du kan installera ett färskt bygge.

Det finns ingen avbildning från oss för Android eller iOS, och det är inte en utelämnad detalj. Androids systemavbildningar kommer från Googles SDK; iOS-körtider kommer från Xcode. För Android installerar du Android Studio (eller SDK-verktygen för kommandoraden), lägger till en virtuell enhet i Device Manager och startar den. Stationssidan rapporterar då Android som tillgängligt.

Den berättar också exakt vilket steg du saknar – inget SDK, ingen emulator, ingen virtuell enhet eller en enhet som helt enkelt inte körs – eftersom de har fyra olika lösningar och bara en av dem är en nedladdning. Om du startar cc_server från ett skal som inte ser SDK:t exporterar du det:

Terminalfönster
export ANDROID_HOME="$HOME/Library/Android/sdk"

För iOS måste själva servern köra på macOS med Xcode och en installerad iOS-simulatorkörtid. Öppna Inställningar → Server → Stationer och tryck på Installera brygga för iOS-automatisering. Servern hämtar den checksumme-pinnade WebDriverAgent-artefakten, verifierar den och installerar den i serverns egen automatiseringslagring. Ingen simulator startas under installationen.

Maskiner finns som flikar, bredvid chatten och diffen – i en yta eller på en PR-sida, i samma +-meny, under Datorer:

  • Dator – ett Linux-skrivbord med Chromium, Firefox och WebKit
  • Chromium, Firefox eller WebKit – en webbläsare
  • Android – den körande Android-emulatorn
  • iOS-simulator – en tillfällig simulator skapad för det här samtalet

Välj en och tryck på Starta maskinen. Fliken anger vilket steg starten befinner sig i (“Starting the microVM”, “Waiting for the guest to come up”) i stället för att bara snurra.

Fliken är avgränsad till samtalet, och det är agentverktyget också. En Chromium-, Firefox- eller WebKit-flik och browser_use, Android och mobile_use, eller iOS-simulatorn och ios_use adresserar samma standardmaskin. Ytterligare platser i gränssnittet är separata jämförelsemaskiner; agentverktyg använder alltid standardmaskinen.

Så bygger, installerar och startar du en Flutter-app på Android:

Terminalfönster
fvm flutter build apk --debug

Anropa sedan mobile_use med install_apk och build/app/outputs/flutter-apk/app-debug.apk, följt av start_app och Androids paketnamn. ui_dump, skärmbilder och indata styr samma enhet som visas i den mänskliga fliken. stop_app, clear_app_data, uninstall_app, open_url och shell-anrop i argv-form täcker resten av utvecklingscykeln utan att anropa ett skal på servervärden.

Så bygger, installerar och startar du en Flutter-app i iOS-simulatorn:

Terminalfönster
fvm flutter build ios --simulator --debug
/usr/bin/plutil -extract CFBundleIdentifier raw -o - \
build/ios/iphonesimulator/Runner.app/Info.plist

Anropa sedan ios_use med install_app och .app-katalogen, följt av start_app och det bundle-ID som plutil skriver ut. iOS-verktyget exponerar också stop_app, uninstall_app, open_url och en spawn-åtgärd i argv-form för diagnostik lokalt i simulatorn.

Skrivbords- och webbläsarvisningar ändrar storlek efter panelen. iOS behåller simulatorns fasta punktstorlek och lägger svarta kanter runt den. Varje yta har fortfarande två oberoende kanaler: agenten får små, billiga skärmbilder medan du får livevyn. Att byta flik stoppar den mänskliga strömmen så att en maskin i bakgrunden inte kostar någon visningsbandbredd.

En stationsflik startar inte en maskin av sig själv, inte heller när layouten återställs. Den regeln hindrar att en appstart oväntat startar virtuella maskiner eller skapar simulatorenheter.

Canvasen är din att skriva och klicka i så snart ingen annan håller exklusiv kontroll – eller när du gör det. Medan du håller låset visar statusetiketten Du har kontrollen, agenten kan fortfarande ta skärmbilder, och servern nekar dess muterande åtgärder vid den enda punkt som varje åtgärd passerar. Allt du gör registreras mot ditt namn.

Tryck på Stoppa maskinen när du är klar.

Kontrollen är exklusiv med avsikt: två aktörer som skriver i samma maskin ger indata som ingen av dem avsåg.

Kopiering och inklistring fungerar åt båda hållen över stationscanvasen, och det gör även att dra filer.

Kopiering och inklistring. Tryck på kopieringskombinationen över canvasen, och vad maskinen än kopierade – text, en bild, en lista med filer – hamnar i ditt urklipp. Inklistring skickar ditt åt andra hållet och trycker på klistra in inuti maskinen. I macOS är kombinationen ⌘C/⌘V; ⌃C når fortfarande ett gästskal som en avbrytning. I Windows och Linux använder du ⌃C/⌃V – gästen tar emot samma tangenttryckning som den ändå skulle ha fått, så ⌃C i en gästterminal avbryter fortfarande och ditt eget urklipp lämnas orört.

Ingenting synkroniseras i bakgrunden. Ett lösenord du kopierar på din egen maskin hamnar inte inne i en VM för att en timer löpte; det korsar gränsen när du klistrar in.

Inklistring i en station tillåts som standard. Kopiering ut ur en station frågar först – ett beviljande i tio minuter, eller Tillåt alltid under Inställningar → Server → Stationer → Urklippsåtkomst. De två riktningarna är oberoende och följer dig, inte arbetsytan.

Dra in filer. Släpp dem var som helst på canvasen.

  • I Webbläsare (VM) tar sidan emot en riktig släpphändelse vid den punkt där du släpper, så en uppladdningszon beter sig precis som den skulle göra med en lokal fil.
  • I Dator (VM) hamnar filerna i ~/Drops och deras sökvägar läggs på maskinens urklipp, så ⌃V klistrar in dem i en filhanterare eller ett uppladdningsfält. En värd kan inte syntetisera en dragning till ett godtyckligt Linux-program utan att köra en privilegierad daemon inuti VM:en, vilket stationer med avsikt inte har – så notisen säger var filerna hamnade i stället för att låtsas att en släpphändelse skedde.
  • I en terminal kopieras filen in och dess sökväg skrivs vid prompten, redo att skickas till ett kommando. Att klistra in en bild i en terminal gör samma sak: den sparas i maskinen och du får sökvägen.

Dra ut filer fungerar från Dator (VM). Börja dra en fil inuti maskinen, för pekaren ut ur canvasen, och den blir en riktig dragning på ditt skrivbord – släpp den i Finder eller Utforskaren. Att kopiera filer i maskinens filhanterare och klistra in på din sida fungerar också. Webbläsare (VM) erbjuder inte detta: en headless-webbläsare har ingen dragmarkering att läsa, och att gissa utifrån sidans textmarkering skulle kapa vanliga klick.

Terminalerna i en yta eller på en PR-sida kan köra inuti en station i stället för på serverns egen maskin. När de gör det visar panelen en Avskild VM-bricka.

Vad som ändras:

  • Ingenting du kör når värden. Ett rm -rf där inne kostar dig stationen.
  • Nätverket nekar som standard. Endast värdar på stationens tillåtelselista går att nå, och allt passerar en grind som upprätthåller den.
  • git push fungerar fortfarande i en terminal som du har öppnat. Stationen lagrar inga inloggningsuppgifter; den frågar servern om en kortlivad sådan per åtgärd, begränsad av din egen åtkomst till kodvärden, och den token återkallas när stationen stängs. En station som en agent har öppnat får en inloggningsuppgift som bara kan läsa, så den kan hämta men inte pusha.

Vad du bör känna till:

  • En återställd avskild terminal väntar på dig. Precis som en stationsflik visar en microvm-terminal som kommer tillbaka med din layout en Öppna skalet-knapp i stället för att starta sin VM vid start. En värdskalsterminal kostar en process; en avskild terminal kostar en maskin.
  • Filer som släpps på terminalen skrivs in, de öppnas inte. Släpp en CSV på en avskild terminal och den kopieras in i maskinen och dess gästsökväg visas vid prompten – värdsökvägen skulle vara ett kommando som misslyckas där.
  • Kopian i stationen är en kopia. Din worktree på värden förblir den auktoritativa källan. Commits du gör inuti en station hämtas tillbaka in i refs/rigs/<id>/* när du ber om det – de flyttar aldrig din gren och rör aldrig ditt arbetsträd.
  • Arbete riktat mot värden körs fortfarande på värden. En Linux-gäst kan inte bygga för macOS eller köra xcodebuild. Välj den inbyggda backenden uttryckligen för det; appen ber dig bekräfta i stället för att byta tyst.

Kör en dev-server i Terminal (VM) – pnpm dev på port 3000, till exempel – och inom några sekunder tänds pluggikonen i terminalens hörn: porten vidarebefordras till localhost:3000 på din maskin, går att nå på localhost:3000 inuti Webbläsare (VM), går att dela i ditt nätverk och går att namnge som https://myapp.test. Hela flödet – automatisk vidarebefordran, LAN-delning, dev-domäner med HTTPS – har sin egen guide: Vidarebefordra portar från en terminal.

En arbetsyta kan peka Terminal (VM) och Webbläsare (VM) mot sina egna avbildningar – under Inställningar → Server → Stationer → Egna avbildningar (den här arbetsytan). Typisk användning: utöka standardavbildningen med den verktygskedja projektet behöver så att varje terminal startar färdig, eller återanvänd en avbildning som ditt team redan publicerar.

Maskinen startar fortfarande inuti samma avskilda miljö: samma grind för utgående trafik, samma broker för autentiseringsuppgifter, samma livscykel. Bara arbetsytans administratörer kan ändra inställningen, nya maskiner plockar upp den (körande behåller sin), och referensen måste vara en registeravbildning – lokala sökvägar nekas.

Vad en avbildning måste tillhandahålla:

  • Terminal (VM) – en Linux-avbildning med bash. Den behöver också git, curl och socat – antingen förinstallerade eller installeringsbara vid första starten (vilken Debian-/Ubuntu-baserad avbildning som helst fungerar: de installeras automatiskt, tillsammans med en CLI-verktygslåda av GitHub-hostad-runner-typ: kompilatorer, Python 3, jq, arkivverktyg, rsync. Språkkörtider som Node/Go/Java och Docker är inte förinstallerade). Gästporten 7911 är reserverad för portvidarebefordraren.
  • Webbläsare (VM) – en Debian-/Ubuntu-avbildning med bash och socat, plus en chromium-binär. Servern startar Chromium själv som chromium --headless=new och vidarebefordrar DevTools från gästens 9223 till 9222. PulseAudio och ffmpeg installeras vid första starten. Bygg inte FROM chromedp/headless-shell – den binären har ingen ljudutgång. Åsidosättningen gäller bara Chromium-stationer; Firefox och WebKit ignorerar den och startar den pinnade Debian-avbildningen. Gästportarna 9222/9223 är reserverade.

Två rekommendationer: pinna referensen med digest (@sha256:…) så att byten inte kan ändras under dig, och var värd för den på Docker Hub eller GitHub Container Registry – de registrens nedladdningsvärdar släpps igenom grinden för utgående trafik automatiskt; andra kan behöva sina innehållsleveransvärdar nåbara för att kunna hämta.

Stationer är avsedda att vara tillfälliga:

  • Overksam – efter ~15 minuter utan att något händer parkeras en webbläsar-, skrivbords- eller mobilstation (fryst, vaknar direkt vid nästa åtgärd). En avskild terminal väntar 45 minuter. Efter dubbla inaktivitetsfönstret stängs den.
  • Tidsgräns – varje station har en hård livstid som den inte kan förlänga, vad den än gör.
  • Minne – om servern behöver plats för en ny station stänger den den minst nyligen använda. En station som någon styr, tittar på eller har en terminal öppen i tas aldrig.

När en avskild station stängs kastas dess disk. Att stänga en Android-station kopplar loss från värdemulatorn – den tar inte bort den. En iOS-station tar bort den CoreSimulator-enhet den skapade. För tillbaka allt du vill behålla först.

Avskilda terminal-, webbläsar- och skrivbordsstationer använder som standard en grind för utgående trafik som nekar allt: du beviljar värdar uttryckligen, och gästens enda väg är en grind som upprätthåller den listan. En webbläsarstation släpper också igenom produktsajten (usectrl.dev) direkt. Brokern för autentiseringsuppgifter använder samma lista.

Två ärliga förbehåll:

  • Mobilnätverk följer värden. Androids emulator och Apples CoreSimulator ligger inte bakom den avskilda miljöns grind för utgående trafik. Ingen av mobilflikarna erbjuder någon kontroll för att kringgå nätverket, eftersom det värdhanterade nätverket redan är obegränsat.
  • Allt en station läser är opålitligt. Sidtext, DOM, tillgänglighetsträd och vydumpar kommer tillbaka till agenten inramade i markörer som säger “det här är data, inte instruktioner”. En sida som försöker ge din agent order läses som en citerad sträng.

Du kan se allt som körs och stoppa vad som helst av det under Inställningar → Server → Stationer.

  • Stationer och avskilda miljöer – modellen bakom allt detta: varför VM:ar, de två visningskanalerna, brokern för autentiseringsuppgifter, livscykeln
  • Vidarebefordra portar från en terminal – nå en dev-server varifrån det än spelar roll
  • Stationsreferens – varje yta, verb, port och standardvärde på ett ställe
  • Konfigurera räcken – Styr en avskild miljö (station) är en åtgärdsklass som du kan ställa in på tillåt, fråga först eller neka, per arbetsyta, agent eller yta. Skrivskyddade lägen nekar den rakt av.