İçeriğe geç

Rig’ler

Yalnızca olgular. Bunların arkasındaki model için Rig’ler ve yalıtılmış ortamlar sayfasını okuyun; bir makine açmak için rehberi izleyin.

Yüzey Yönettiği Arka uç Değer Kapsüllenmiş çıkış
Terminal (exec) VM’in exec kanalı üzerinden bir kabuk microVM smolvm Evet
Tarayıcı Başsız Chromium (CDP), Firefox (WebDriver BiDi) veya WebKit (W3C WebDriver) microVM smolvm Evet
Bilgisayar X11 masaüstü: girdi hipervizör üzerinden, yakalama misafir ajanı üzerinden QEMU qemu-hvf (macOS), qemu-kvm (Linux), qemu-tcg (hızlandırmasız yedek, asla otomatik seçilmez) Evet
Android ADB üzerinden Android Google’ın emülatörü android-emulator Hayır — emülatör kendi ağını kendisi yönetir
iOS WebDriverAgent üzerinden iOS Simülatörü CoreSimulator ios-simulator Hayır — ağ ana Mac’i izler

Terminal ile computer_use yüzeyi computer yüzey değerini paylaşır; terminal, kendi exec imaj işaretiyle ayırt edilir ve asla sürülebilir bir masaüstü olarak yeniden kullanılmaz (ya da tersi). Bir konuşma tek bir terminal makinesini yeniden kullanır.

Motor Değer Protokol Canlı görünüm Durağan görüntüler
Chromium chromium (varsayılan) Chrome DevTools Protokolü Ekran yayını — sayfa yeniden çizilirken tarayıcı kareleri iter JPEG
Firefox firefox WebDriver BiDi Yoklanan durağan görüntüler (BiDi’de ekran yayını yoktur), 6 fps ile sınırlı JPEG
WebKit webkit W3C WebDriver (klasik) Ana makinenin ffmpeg’iyle dönüştürülen yoklanan durağan görüntüler PNG

Bir rig, tüm ömrü boyunca tek bir motor çalıştırır. Bir konuşma motor başına bir rig tutabilir; yan yana karşılaştırmayı mümkün kılan da budur: “Firefox (VM)”’i “Chromium (VM)”’in yanında açmak iki makine demektir ve birini kapatmak diğerini çalışır bırakır.

engine değerini rig.open çağrısına ya da browser_use aracına geçirin. Bilinmeyen bir ad varsayılana düşürülmek yerine reddedilir — bir tarayıcı isteyip sessizce başkasını almak, uyumluluk sorusunu yanlış yanıtla yanıtlamaktır.

Motora özgü sınırlar, etrafından dolaşılmak yerine açıkça belirtilir:

  • Firefox’ta önbelleği atlayan yeniden yükleme yoktur (BiDi’nin ignoreCache seçeneğini doğrudan reddeder), bu yüzden sert yeniden yükleme normal bir yeniden yüklemedir.
  • WebKit’te de önbelleği atlayan yeniden yükleme yoktur; konsol akışı da yoktur (çıktı, her gezinmeden sonra console.* kancalanarak yakalanır, bu yüzden yükleme sırasında günlüğe yazılan her şey kaçırılır — her konsol çıkarımı bunu söyler) ve canlı görünümü için ana makinede ffmpeg gerekir.
  • İkisi de protokolü üzerinden platformun erişilebilirlik ağacını sunmaz; bu yüzden extract (a11y), DOM’dan türetilmiş bir yaklaşık değer döndürür ve bunu böyle etiketler.
  • İkisi de gerçek bir dosya bırakma işlemini kabul edemez; yine de bir dosya girişi makinenin içindeki yollara yöneltilebilir.
Yüzey İmaj Getirilme biçimi
Terminal ubuntu:24.04, digest ile sabitlenmiş İlk önyüklemede otomatik olarak, makinenin kendi kapılanmış ağı üzerinden
Tarayıcı (Chromium, Firefox, WebKit) debian:trixie-slim, digest ile sabitlenmiş, artı motorun kendi paketleri İlk önyüklemede otomatik olarak, ardından ısıtılmış bir paket olarak önbelleğe alınır
Bilgisayar Chromium, Firefox, WebKit içeren ve terminalin ısıttığı aynı GitHub tarafından barındırılan runner CLI temelini taşıyan bir qcow2 masaüstü imajı Ayarlar → Sunucu → Rigs altında İçe aktar (yayımlandığı yerlerde sağlama toplamıyla sabitlenmiş indirmeler)
Android Google’ın sistem imajları Android SDK üzerinden
iOS Bir Xcode Simülatör çalışma zamanı artı sağlama toplamıyla sabitlenmiş WebDriverAgent Çalışma zamanı Xcode üzerinden; otomasyon köprüsü Ayarlar → Sunucu → Rigs üzerinden

Her microVM türünün ilk önyüklemesinden sonra sunucu, veri dizini altında önceden çıkarılmış bir kopyayı önbelleğe alır ve sonraki her makineyi oradan önyükler — paketleri zaten kurulu, önceden ısıtılmış imajlar dahil. Terminal, GitHub tarafından barındırılan runner tarzı bir CLI araç setini ısıtır (git, gcc, python3, jq, rsync, arşiv araçları ve apt temelinin geri kalanı; Docker ya da dil araç önbellekleri değil). Bilgisayar qcow2’si aynı CLI adlarını imaj derlemesinde, XFCE ile üç tarayıcının yanına gömer. Her tarayıcı kendi motorunu ısıtır. Üç motor da bir Debian temelini paylaşır ama asla bir paketi paylaşmaz: önbellek, imaj, motor ve bir ses revizyonu (audio-v1-<engine>) üzerinden anahtarlanır; çünkü bir motora — ya da PulseAudio ile ffmpeg iş yükünün parçası olmadan önce — ısıtılmış bir makinede diğeri yoktur. Terminal paketi de aynı nedenle bir araç seti revizyonu (tools-v1) üzerinden anahtarlanır: derleyici imajın parçası olmadan önce ısıtılmış bir paket, derleyicisi olması gereken bir makineye hizmet etmemelidir.

Alınmaya değer, hazır gömülü bir otomasyon imajı yoktur — Chromium’un chromedp/headless-shell imajı hem ALSA’yı hem PulseAudio’yu dışarıda bırakacak şekilde derlenir, bu yüzden asla ses üretemez; bakımı yapılan tek Firefox imajı Debian temelinin 33 katı boyutundadır ve yine de socat içermez; bakımı yapılan bir WebKit imajı ise hiç yoktur. Bu yüzden her motor ilk başlatmada kurulur (chromium, firefox-esr ya da webkit2gtk-driver) ve bunu yaparken Debian arşivlerine (deb.debian.org, security.debian.org, cloudfront.debian.net) erişir. Chromium, chromium --headless=new olarak başlatılan dağıtım ikilisidir.

Ayar anahtarı Geçersiz kıldığı ayar
rigs.smolvm.execImage Terminal (VM) imajı
rigs.smolvm.browserImage Chromium Tarayıcı (VM) imajı

Yönetici kapısından geçen çalışma alanı ayarları deposu üzerinden yazılır (Ayarlar → Sunucu → Rigs → Özel imajlar (bu çalışma alanı)). Değer bir registry referansı olmalıdır — yerel yollar, arşivler ve bayrak benzeri dizeler hem alanda hem de önyüklemede yeniden reddedilir. Geçersiz bir saklanan değer gürültülü biçimde yok sayılır ve yerine varsayılan önyüklenir. İmajın kendi registry’si (artı Docker Hub, GHCR, Quay, GitLab ve GCR için bilinen blob CDN eşlikçileri) çekme işlemi için çıkış kapısından kabul edilir.

Terminal imaj sözleşmesi — bash mevcut; git, curl, socat önceden kurulu ya da bir Debian/Ubuntu apt temeli (yalıtılmış ortam ilk başlatmada bu üçünü artı GitHub tarafından barındırılan runner tarzı bir CLI araç setini kurar: derleyiciler, Python 3, jq, arşiv araçları, rsync. Dil araç önbellekleri ve Docker kurulmaz).

Tarayıcı imaj sözleşmesi — bash ve socat içeren bir Debian/Ubuntu apt temeli (ya da paketler zaten kurulu), artı sunucunun kendisinin chromium --headless=new olarak başlattığı, DevTools misafir loopback’inde 9223’te olup misafir 9222 portuna aktarılan bir chromium ikilisi. PulseAudio ve ffmpeg, ses kanalı için ilk başlatmada kurulur. FROM chromedp/headless-shell ile derlemeyin: upstream headless.gn hem ALSA’yı hem PulseAudio’yu dışarıda bırakacak şekilde derler, bu yüzden o ikili ses üretemez. Bu geçersiz kılma yalnızca Chromium rig’leri için geçerlidir — önyüklediği iş yükü komutu Chromium’a aittir ve bunu Firefox ya da WebKit’e vermek, orada olmayan bir ikiliyi başlatmak olur. Bir Firefox ya da WebKit rig’i bunu gürültülü biçimde yok sayar ve kendi sabitlenmiş imajını önyükler.

Otomasyon portları — her tarayıcı makinesi, ana makinede tam olarak bir loopback portunu misafir 9222 portuna yönlendirir. Arkasında: Chromium’un DevTools’u ve Firefox’un uzak ajanı, önlerinde bir socat aktarımıyla misafir loopback’inde 9223 üzerinde oturur (ikisi de koşulsuz olarak loopback’e bağlanır); WebKit’in sürücüsü bir --host alır ve misafir NIC’ine kendisi bağlanır. Firefox ayrıca Host başlığını kendi portuna göre doğrular; bu yüzden istemci, aradığı yetki yerine misafir tarafındaki yetkiyi gönderir.

Her eylem eksiksiz ayrıştırılır: bozuk bir yük, alanı adlandıran bir ileti döndürür, asla bir istisna değil. Gözlem eylemleri (○ ile işaretli) bir insan kontrolü elinde tutarken izinli kalır; değiştirici eylemler reddedilir.

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 sn), type, wait○ (0–60 sn), set_display, clipboard_read○, clipboard_write.

Koordinatlar, misafirin geçerli modundaki misafir pikselleridir; her ekran görüntüsü ekran boyutunu belirtir. Tuş kombinasyonları X11 yazımlarını kullanır (ctrl+s, alt+Tab, Return).

clipboard_read bir selection alır: clipboard (ctrl+C’nin doldurduğu şey, varsayılan), primary (X11 seçip kopyalama) ya da xdnd (süren bir sürükleme). Boş bir sonuç, üçü için de normal bir yanıttır. clipboard_write yalnızca text alır — görüntüler ve dosyalar dosya kanalından gider, çünkü bir eylemin bağımsız değişkenleri denetim kaydına yazılır ve görüntü baytlarının orada işi yoktur. Pano içeriği, güvenilmez veri olarak çevrelenerek döner.

navigate (yalnızca http/https), reload (hard isteğe bağlı), stop_loading, click (seçici ya da koordinat), fill, type, key (DOM tuş adları), scroll, mouse_move, drag, left_mouse_down, left_mouse_up, extract○ (a11y | dom | console), screenshot○ (full_page isteğe bağlı), set_viewport (en az 320×240), history, wait_for○ (seçici, 0,1–30 sn), clipboard_read○, clipboard_write.

Çıkarılan sayfa içeriği, güvenilmez veri olarak çevrelenerek döner.

Tarayıcının tam olarak bir panosu vardır, bu yüzden clipboard_read bir selection almaz. Her iki pano fiili de bir güvenli bağlam gerektirir: düz http:// üzerinden sunulan bir sayfada pano API’si hiç yoktur ve fiil, boş bir pano bildirmek yerine bunu söyler — orada type kullanın; bu, panodan geçmeden imlecin bulunduğu yere ekler.

tap, swipe (50–5000 ms), type, key (takma adlar back, home, recents, enter, delete, backspace, tab, escape, search, menu, volume_up, volume_down, power ya da herhangi bir KEYCODE_*), screenshot○, ui_dump○, install_apk (rig’in worktree’si ve sunucu veri diziniyle sınırlı), start_app, stop_app, clear_app_data, uninstall_app, open_url ve shell. shell bir argv listesi alır ve Android’in içinde çalışır, asla bir ana makine kabuğu üzerinden değil; logcat, dumpsys ve pm grant gibi geliştirici tanılamalarını kapsar.

mobile_use’ın pano fiilleri yoktur. Android 10’dan beri panoyu yalnızca odaktaki uygulama okuyabilir.

tap, swipe (50–5000 ms), type, key (enter, backspace, tab, escape, ok tuşları ya da tek bir yazdırılabilir karakter; isteğe bağlı command, control, option ve shift değiştiricileri), home, lock, unlock, screenshot○, ui_dump○, install_app (rig worktree’si ya da sunucu veri diziniyle sınırlı bir simülatör .app dizini), start_app, stop_app, uninstall_app, open_url ve spawn. spawn argv alır ve simctl üzerinden simülatörün içinde yürütür; asla bir ana makine kabuğunu çağırmaz.

Koordinatlar ekran görüntüsü pikselleri değil, iOS ekran noktalarıdır. Canlı akış, simülatörün sabit boyutunu korur ve aygıtı yeniden boyutlandırmak yerine ona letterbox uygular. Ana makineden simülatöre ve simülatörden ana makineye metin panosu aktarımı, diğer rig’lerle aynı kullanıcı başına, yön başına izin politikasını kullanır; dosyalar ve görüntüler iOS pano kanalı tarafından kabul edilmez.

Her rig, kendine ait bir CoreSimulator aygıtı ve WebDriverAgent oturumu oluşturur. Kapatmak, WebDriverAgent’ı durdurur, o aygıtı kapatıp siler ve kayıt girdisini kaldırır. iOS rig’leri yalnızca Xcode, kurulu bir iOS çalışma zamanı ve sabitlenmiş otomasyon köprüsü bulunan bir macOS sunucusunda çalışır. Ses, mikrofon, dosya bırakma, ana makine kabuğu ya da kapalı ağ garantisi sunmazlar.

Araç Açıklama
rig_list Bir çalışma alanının rig’lerini yüzey, durum, ekran ve denetleyici ile listeler
rig_close Bir rig’i yok eder ve diskini atar
Aşama Anlamı
provisioning Önyükleniyor; durum ayrıntısı geçerli adımı olduğu gibi taşır
ready Erişilebilir ve eylemleri kabul ediyor
parked Boşta park edilmiş: vCPU’lar durmuş, RAM hâlâ yerinde; sonraki eylem onu uyandırır
closing Kapatılıyor
closed Gitmiş; satır denetim izi için kalır
failed Öldü ya da hiç açılamadı; arayüzün yeniden deneme sunabilmesi için ayırt edilebilir
Kapanma nedeni Ne zaman tetiklenir
requested Bir kişi ya da ajan istedi
idleTimeout Boşta kalma penceresinin 2 katını aştı ya da bellek için tahliye edildi
ttlExpired Katı ömür doldu
conversationEnded Sahibi olan konuşma sona erdi
workspaceGone Çalışma alanı silindi ya da üyelik kaybedildi
serverShutdown Sunucu duruyor
backendFailure Altındaki hipervizör öldü
Değer Terminal Tarayıcı Bilgisayar Mobil
Bellek 512 MB 2048 MB (Chromium); 2560 MB (Firefox, WebKit) 4096 MB 4096 MB
vCPU 2 2 4 4
Katı TTL 8 sa 2 sa 2 sa 2 sa
Boşta kalma penceresi 45 dk 15 dk 15 dk 15 dk
Önyükleme ekranı — 1280×800 1280×800 1080×1920
  • Ajan kanalındaki durağan görüntüler 1280×800 ile sınırlıdır; insan kanalı 2560×1600’e kadar pazarlık eder.
  • Ana makinenin tüm rig’ler için yerleşik bellek bütçesi varsayılan olarak 12 GB’tır ve yerleşik megabayt cinsinden sayılır (park edilmiş bir VM, RAM’ini hâlâ tutar). Tahliye, en uzun süredir kullanılmayandan başlar ve birinin yönettiği, izlediği ya da terminalini açık tuttuğu bir makineyi asla almaz.
  • Açık bir terminal ya da izleme kanalı, rig’i park etmeye ve boşta toplamaya karşı sabitler; katı TTL yine de geçerlidir.
Port Yer Neye ayrılmış
7911 Terminal misafiri Her yönlendirmenin üzerinden geçtiği port çoğullayıcısı
9222, 9223 Tarayıcı misafiri Otomasyon aktarımı ve uç noktası (WebKit doğrudan 9222’ye bağlanır ve aktarım kullanmaz)
80, 443 Tarayıcı misafiri loopback’i Geliştirme etki alanı HTTP/HTTPS kanalları
  • Keşif, sunucu tarafında terminal misafirinin dinleyen TCP portlarını yaklaşık 4 sn’de bir yoklar.
  • Rig başına en fazla 16 port otomatik yönlendirilir; fazlası günlükte listelenir, yönlendirilmez.
  • Ana makine tarafındaki yönlendirme loopback’e bağlanır ve misafirin kendi port numarasını tercih eder; Yerel ağda paylaş, işletim sisteminin atadığı bir LAN portu ekler.
  • Geliştirme etki alanları name.test ya da name.localhost ile eşleşmelidir (küçük harf, en fazla 63 karakterlik etiket). Bir etki alanı bir porta eşlenir.
  • Geliştirme etki alanı HTTPS’i, *.test / *.localhost için tek bir joker yaprak sertifikayla birlikte sunucuya yerel bir CA kullanır (EC P-256, <dataDir>/rigs/tls/ altında, anahtarlar 0600 ve asla bir misafirde değil). Ana makinede openssl yoksa HTTPS kanalı da yoktur; düz HTTP yine yönlendirilir.
Yüzey Varsayılan izin listesi
Terminal Sandbox geliştirici temeli (forge’lar, paket kayıtları, model sağlayıcıları) + Ubuntu apt yansıları + worktree’nin kendi forge ana makinesi
Tarayıcı usectrl.dev (ürün sitesi) — artı her motorun ilk önyüklemesinde, paketlerini kurarken eriştiği Debian arşivleri. Ana sayfa yerel bir file:// belgesidir ve çıkış gerektirmez
Bilgisayar Boş — bir çağıran ana makine izni verene kadar her şeyi reddet
Mobil Uygulanmaz (emülatör tarafından yönetilen ağ)

Her microVM ayrıca, yalnızca çekme işlemi için imajının registry ana makinelerini alır. Kimlik bilgisi broker’ının izin verilen ana makineler kümesi aynı izin listesinden türetilir: misafirin erişemediği bir ana makine için token üretilmez.

Kopyalama/yapıştırmanın iki yönü ve dosyaları içeri ve dışarı sürükleme. Bir rig’i yöneten kişi için kullanılabilir; bir ajan panoyu yukarıdaki fiiller üzerinden alır ve dosya aktarımına hiç erişemez (yalıtılmış ortamın içinde zaten bir kabuğu vardır).

Pano geçişi kullanıcı başına ve yön başına ayrıdır. Ana makineden rig’e yapıştırmaya varsayılan olarak izin verilir; rig’den ana makineye kopyalama sorar (on dakikalık bir izin ya da Ayarlar → Sunucu → Rigs → Pano erişimi altında her zaman izin ver). İki seçim birbirinden bağımsızdır ve asla bir çalışma alanı ayarı değildir.

Kanal Yol Taşıdığı
Pano GET/POST /rig/clipboard/<rigId> Metin, bir PNG/JPEG (≤16 MB) ve panodaki dosyaların misafir yolları
Dosyalar POST /rig/files/<rigId> En fazla 64 dosya, her biri ≤256 MB ve bırakma başına ≤512 MB, isteğe bağlı bir misafir pikseli bırakma noktasıyla
Dosyalar GET /rig/files/<rigId>?p=<base64url path> Bir dosyanın baytları, geri dışarı
  • RPC değil, HTTP. RPC soketi, gelen bir çerçeve 256 KB’ı aştığında bağlantıyı kapatır — JSON komutları için doğru, yapıştırılmış bir ekran görüntüsü için ölümcül olan bir DoS koruması. Baytlar, rig karelerinin ve toplantı sesinin zaten kullandığı türden bir yolu kullanır.
  • Kimlik doğrulama, imzalı rig-files:<workspaceId>/<rigId> hedefi artı çalışma alanı üyeliğidir — kendine ait bir hedef, böylece bir makineyi izlemek için üretilen bir URL onun içine dosya da yazamaz.
  • Devralma geçerlidir. Panoya yazmak ve dosya bırakmak değiştiricidir ve başka biri kontrolü elinde tutarken reddedilir; panoyu okumak ve bir dosyayı dışarı okumak gözlemdir ve reddedilmez.
  • Bırakılanların indiği yer: ~/Drops (masaüstü), ~/drops (terminal — worktree’nin yanında, asla içinde değil, böylece bir bırakma hiçbir zaman izlenmeyen bir değişiklik olarak görünmez), /tmp/cc-drops (tarayıcı). Dizini sunucu seçer; bir çağıran onu adlandıramaz. Var olan dosyaların üzerine asla yazılmaz — çakışan bir ad 2-name.ext olarak iner.
  • Misafire ne söylenir: bir tarayıcı sayfası, istenen noktada gerçek bir bırakma olayı alır (Input.dispatchDragEvent); bir masaüstü, dosyaları ve URI’lerini panosuna alır; çünkü hiçbir ana makine, misafirin içinde ayrıcalıklı bir daemon olmadan rastgele bir araç setine XDND sürüklemesi üretemez. Yanıt, ikisinden hangisinin olduğunu belirtir.
  • Dışarı sürükleme yalnızca masaüstünde çalışır ve bir sürükleme sürerken misafirin XdndSelection değerini okur. Basma başladığında misafirin zaten tuttuğuyla aynı olan bir yük, yeni değil, bitmiş bir sürüklemeden kalan bayat bir seçim sayılır — X’te “sürükleme bitti” diye bir adım yoktur.
  • İmaj gereksinimleri: masaüstü imajı protokol 2 ya da üzeri olmalıdır (pano desteği eklendikten sonra derlenmiş). Daha eski bir imaj 404 yanıtı verir ve uygulama, bozuk bir makine bildirmek yerine imajın yeniden derlenmesini söyler.
  • Denetim kaydı biçimi kaydeder, içeriği asla: clipboard_read, clipboard_write, drop_files ve read_file satırları sayıları, boyutları ve yolları taşır. Pano, kimlik bilgilerinin birkaç saniyeliğine yaşadığı yerdir ve bunların hiçbiri yazıya dökülmez.
  • Rig araçları enclosureControl eylem sınıfını bildirir (artı use araçlarında networkEgress ve processSpawn; mobile_use ve ios_use ayrıca packageInstall bildirir). rig_close enclosureControl bildirir; rig_list hiçbirini bildirmez. Varsayılan olarak izin verilir; salt okunur modlar bunu tümden reddeder; alan başına özerklik kadranı onu önce sor’a indirebilir.
  • Alan olayları: RigClosedEvent (kapanma nedeniyle birlikte), RigControlChanged (devralma / geri verme), RigReaped (boşta kalma, TTL ya da bellek tahliyesi, yöneten ajanla birlikte). Bir rig açmak olay değildir. Bkz. alan olayları.
  • Depolama: her çalışma alanı veritabanında rig_sessions ve rig_action_log. Eylem günlüğü, her girdi olayını öznesi ve rig başına monotonik bir sırayla kaydeder; yazılan metin, yazılmadan önce bir uzunluğa ve hash’e indirgenir.
  • Veri dizini: rigs/images/ (içe aktarılan qcow2 imajları), rigs/smolvm/ (rig başına çalışma zamanı durumu), rigs/smolvm-packs/ (önceden çıkarılmış makine paketleri), rigs/tls/ (geliştirme etki alanı CA’sı), rigs/run/ (QEMU overlay’leri ve seed’leri).
  • Rotalar: canlı görünüm, bir alandaki ya da PR sayfasındaki bir sekmedir; /settings/server/rigs Rigs ayarlar ekranıdır.