Berikan agen mesin untuk menguji
Rig adalah mesin sekali pakai yang dibuka agen saat ia benar-benar perlu mencoba sesuatu: memuat halaman, mengklik aplikasi desktop, atau mengetuk-ngetuk ponsel. Anda dapat menontonnya bekerja secara real time, dan mengambil alih kontrolnya kapan pun Anda mau.
Rig terminal, browser, dan desktop yang terisolasi adalah VM dengan disk sekali pakai dan jaringan yang dijaga gerbang. Android dan iOS adalah emulator yang dikelola host: status perangkatnya sekali pakai, tetapi jaringannya mengikuti host server.
Siapkan sekali saja
Bagian berjudul “Siapkan sekali saja”Rig berjalan di mesin yang menghosting cc_server — mesin yang sama, bukan
mesin yang sedang Anda lihat. Ada lima permukaan yang dihadapi pengguna;
permukaan desktop dan seluler memerlukan penyiapan host:
| Permukaan | Berjalan di | Penyiapan |
|---|---|---|
| Terminal (VM) | microVM yang mem-boot image Ubuntu yang dipin | Tidak ada — image diambil otomatis saat pertama dipakai |
| Browser (VM) | microVM yang mem-boot image Debian yang dipin, dengan Chromium, Firefox, atau WebKit dipasang saat pertama dipakai | Tidak ada — sama |
| Komputer (VM) | QEMU dengan image desktop Linux yang membawa Chromium, Firefox, WebKit, dan baseline CLI ala runner yang dihosting GitHub | Pasang QEMU (brew install qemu), lalu Impor image desktop di Pengaturan → Server → Rigs |
| Android | Emulator Android dari Google | Pasang Android SDK, buat AVD, lalu jalankan (di bawah) |
| Simulator iOS | CoreSimulator di Mac server | Pasang Xcode dan runtime iOS yang diminta, lalu pasang bridge otomatisasi di Pengaturan → Server → Rigs |
Mesin terminal dan browser boot dari image yang dipin dengan digest: byte persisnya ditentukan lebih dulu, diambil sekali saat boot pertama, lalu di-cache — setelah boot pertama untuk setiap jenis, mesin berikutnya melewati unduhan sepenuhnya dan menyala dalam hitungan detik. Pengaturan → Server → Rigs menampilkan apa yang dapat di-boot server Anda dan setiap mesin yang sedang berjalan saat ini.
Image desktop yang sudah terpasang tetap dapat dikelola dari halaman yang sama: Impor menggantinya dengan qcow2 yang lebih baru, dan Hapus menghapusnya sehingga Anda dapat memasang build yang segar.
Perangkat seluler disiapkan dengan cara berbeda
Bagian berjudul “Perangkat seluler disiapkan dengan cara berbeda”Tidak ada image milik kami untuk Android atau iOS, dan itu bukan kelalaian. Image sistem Android berasal dari SDK Google; runtime iOS berasal dari Xcode. Untuk Android, pasang Android Studio (atau alat SDK baris perintah), tambahkan perangkat virtual di Device Manager, lalu jalankan. Halaman Rigs kemudian melaporkan Android sebagai tersedia.
Halaman itu juga memberi tahu persis langkah mana yang belum Anda penuhi —
tidak ada SDK, tidak ada emulator, tidak ada perangkat virtual, atau perangkat
yang memang tidak sedang berjalan — karena keempatnya punya perbaikan yang
berbeda dan hanya satu di antaranya berupa unduhan. Jika Anda menjalankan
cc_server dari shell yang tidak dapat melihat SDK, ekspor variabelnya:
export ANDROID_HOME="$HOME/Library/Android/sdk"Untuk iOS, server itu sendiri harus berjalan di macOS dengan Xcode dan runtime Simulator iOS terpasang. Buka Pengaturan → Server → Rigs lalu tekan Instal bridge otomatisasi iOS. Server mengambil artefak WebDriverAgent yang dipin dengan checksum, memverifikasinya, dan memasangnya ke penyimpanan otomatisasi milik server. Tidak ada simulator yang boot selama penyiapan.
Buka mesin
Bagian berjudul “Buka mesin”Mesin hadir sebagai tab, di samping chat dan diff — di sebuah space atau di
halaman PR, di menu + yang sama, di bawah Mesin:
- Komputer — desktop Linux dengan Chromium, Firefox, dan WebKit
- Chromium, Firefox, atau WebKit — sebuah browser
- Android — emulator Android yang sedang berjalan
- Simulator iOS — simulator sekali pakai yang dibuat untuk percakapan ini
Pilih salah satu lalu tekan Mulai mesin. Tab menampilkan tahap boot yang sedang berlangsung (“Starting the microVM”, “Waiting for the guest to come up”) alih-alih sekadar berputar.
Tab ini bercakupan percakapan, begitu pula alat agen. Tab Chromium, Firefox,
atau WebKit dan browser_use, Android dan mobile_use, atau Simulator iOS dan
ios_use menuju mesin default yang sama. Slot UI tambahan adalah mesin
pembanding yang terpisah; alat agen selalu memakai yang default.
Untuk mem-build, memasang, dan menjalankan aplikasi Flutter di Android:
fvm flutter build apk --debugLalu panggil mobile_use dengan install_apk dan
build/app/outputs/flutter-apk/app-debug.apk, disusul start_app dan nama
paket Android. ui_dump, tangkapan layar, dan input mengemudikan perangkat
yang sama dengan yang ditampilkan di tab manusia. stop_app,
clear_app_data, uninstall_app, open_url, dan panggilan shell berbentuk
argv mencakup sisa siklus pengembangan tanpa menjalankan shell di host server.
Untuk mem-build, memasang, dan menjalankan aplikasi Flutter di Simulator iOS:
fvm flutter build ios --simulator --debug/usr/bin/plutil -extract CFBundleIdentifier raw -o - \ build/ios/iphonesimulator/Runner.app/Info.plistLalu panggil ios_use dengan install_app dan direktori .app, disusul
start_app dan bundle identifier yang dicetak oleh plutil.
Alat iOS juga menyediakan stop_app, uninstall_app, open_url, dan aksi
spawn berbentuk argv untuk diagnostik lokal simulator.
Tampilan desktop dan browser menyesuaikan ukuran panel. iOS mempertahankan ukuran titik tetap simulator dan memberinya letterbox. Setiap permukaan tetap punya dua jalur independen: agen mendapat tangkapan layar kecil yang murah, sementara Anda mendapat tampilan langsung. Berpindah tab menghentikan aliran manusia sehingga mesin di latar belakang tidak memakan bandwidth tampilan.
Tab rig tidak memulai mesin dengan sendirinya, termasuk saat pemulihan tata letak. Aturan itu mencegah peluncuran aplikasi tiba-tiba mem-boot VM atau membuat perangkat simulator.
Kemudikan mesin
Bagian berjudul “Kemudikan mesin”Kanvas dapat Anda ketik dan klik kapan pun tidak ada orang lain yang memegang kendali eksklusif — atau saat Anda yang memegangnya. Selama Anda memegang kunci itu, tag status berbunyi Anda memegang kendali, agen tetap dapat mengambil tangkapan layar, dan server menolak tindakan mutasinya di satu titik penyempitan yang dilewati setiap tindakan. Semua yang Anda lakukan tercatat atas nama Anda.
Tekan Hentikan mesin setelah selesai.
Kendali bersifat eksklusif dengan sengaja: dua pelaku yang mengetik di satu mesin menghasilkan input yang tidak dimaksudkan keduanya.
Memindahkan konten masuk dan keluar
Bagian berjudul “Memindahkan konten masuk dan keluar”Salin dan tempel bekerja di kedua arah melintasi kanvas rig, begitu pula menyeret berkas.
Salin dan tempel. Tekan kombinasi salin di atas kanvas dan apa pun yang disalin mesin — teks, gambar, daftar berkas — mendarat di papan klip Anda. Tempel mengirim milik Anda ke arah sebaliknya lalu menekan tempel di dalam mesin. Di macOS kombinasinya ⌘C/⌘V; ⌃C tetap sampai ke shell tamu sebagai interupsi. Di Windows dan Linux gunakan ⌃C/⌃V — tamu menerima penekanan tombol yang sama seperti yang akan diterimanya, sehingga ⌃C di terminal tamu tetap menjadi interupsi dan papan klip Anda sendiri tidak tersentuh.
Tidak ada yang disinkronkan di latar belakang. Kata sandi yang Anda salin di mesin sendiri tidak sampai ke dalam VM karena timer berbunyi; ia melintas saat Anda menempel.
Menempel ke rig diizinkan secara default. Menyalin keluar dari rig meminta konfirmasi lebih dulu — izin sepuluh menit, atau Selalu izinkan di Pengaturan → Server → Rigs → Akses papan klip. Kedua arah itu independen, dan keduanya mengikuti Anda, bukan ruang kerja.
Seret berkas masuk. Jatuhkan di mana saja pada kanvas.
- Di Browser (VM), halaman menerima drop yang sungguhan pada titik Anda melepas berkas, sehingga zona unggah berperilaku persis seperti dengan berkas lokal.
- Di Komputer (VM), berkas mendarat di
~/Dropsdan path-nya masuk ke papan klip mesin, sehingga ⌃V menempelkannya ke pengelola berkas atau kolom unggah. Host tidak dapat menyintesis drag ke aplikasi Linux sembarang tanpa menjalankan daemon berhak istimewa di dalam VM, yang justru sengaja tidak dimiliki rig — jadi toast memberi tahu Anda ke mana berkasnya pergi alih-alih berpura-pura sebuah drop terjadi. - Di terminal, berkasnya disalin masuk dan path-nya diketikkan di prompt, siap diteruskan ke sebuah perintah. Menempelkan gambar ke terminal melakukan hal yang sama: gambar itu disimpan di mesin dan Anda mendapat path-nya.
Seret berkas keluar berfungsi dari Komputer (VM). Mulai menyeret berkas di dalam mesin, bawa penunjuk keluar dari kanvas, dan berkasnya menjadi drag sungguhan di desktop Anda — jatuhkan di Finder atau Explorer. Menyalin berkas di pengelola berkas mesin lalu menempelkannya di sisi Anda juga berfungsi. Browser (VM) tidak menawarkan ini: browser headless tidak punya payload drag untuk dibaca, dan menebak dari seleksi teks halaman akan membajak klik biasa.
Terminal di dalam rig
Bagian berjudul “Terminal di dalam rig”Terminal di sebuah space atau di halaman PR dapat berjalan di dalam rig alih-alih di mesin server itu sendiri. Saat itu terjadi, panel menampilkan badge VM terisolasi.
Apa yang berubah:
- Tidak ada yang Anda jalankan yang mencapai host. Satu
rm -rfdi sana membuat Anda kehilangan rig. - Jaringannya menolak secara default. Hanya host di daftar izin rig yang dapat dijangkau, dan semuanya melewati gerbang yang menegakkannya.
git pushtetap bekerja di terminal yang Anda buka. Rig tidak menyimpan kredensial; ia meminta token berumur pendek ke server per operasi, dibatasi oleh akses forge Anda sendiri, dan token itu dicabut saat rig ditutup. Rig yang dibuka agen mendapat kredensial hanya-baca, sehingga dapat fetch tetapi tidak dapat push.
Yang perlu diketahui:
- Terminal terisolasi yang dipulihkan menunggu Anda. Seperti tab rig,
terminal
microvmyang kembali bersama tata letak Anda menampilkan tombol Buka shell alih-alih mem-boot VM-nya saat diluncurkan. Terminal shell host memakan satu proses; terminal terisolasi memakan satu mesin. - Berkas yang dijatuhkan ke terminal diketik, bukan dibuka. Jatuhkan CSV ke terminal terisolasi dan berkasnya disalin ke dalam mesin lalu path tamunya muncul di prompt — path host akan menjadi perintah yang gagal di sana.
- Salinan di dalam rig hanyalah salinan. Worktree Anda di host tetap
menjadi acuan. Commit yang Anda buat di dalam rig dibawa kembali ke
refs/rigs/<id>/*saat Anda memintanya — commit itu tidak pernah memindahkan branch atau menyentuh working tree Anda. - Pekerjaan bertarget host tetap berjalan di host. Tamu Linux tidak dapat
mem-build untuk macOS atau menjalankan
xcodebuild. Pilih backend native secara eksplisit untuk itu; aplikasi akan meminta Anda mengonfirmasi alih-alih beralih diam-diam.
Jalankan server dev di Terminal (VM) — misalnya pnpm dev di port 3000 — dan
dalam beberapa detik ikon colokan di sudut terminal menyala: port-nya
diteruskan ke localhost:3000 di mesin Anda, dapat dijangkau di
localhost:3000 di dalam Browser (VM), dapat dibagikan di jaringan Anda, dan
dapat diberi nama https://myapp.test. Seluruh alurnya — penerusan otomatis,
berbagi di LAN, domain dev dengan HTTPS — punya panduan tersendiri:
Teruskan port dari terminal.
Image kustom
Bagian berjudul “Image kustom”Sebuah ruang kerja dapat mengarahkan Terminal (VM) dan Browser (VM) ke image miliknya sendiri — di Pengaturan → Server → Rigs → Image kustom (ruang kerja ini). Penggunaan umum: memperluas image default dengan toolchain yang dibutuhkan proyek Anda agar setiap terminal siap saat dimulai, atau memakai ulang image yang sudah dipublikasikan tim Anda.
Mesin tetap boot di dalam lingkungan terisolasi yang sama: gerbang egress yang sama, broker kredensial yang sama, siklus hidup yang sama. Hanya admin ruang kerja yang dapat mengubah pengaturan ini, mesin baru memakainya (yang sedang berjalan tetap memakai miliknya), dan referensinya harus berupa image registry — path lokal ditolak.
Apa yang harus disediakan sebuah image:
- Terminal (VM) — image Linux dengan
bash. Ia juga membutuhkangit,curl, dansocat— entah sudah terpasang, atau dapat dipasang saat pertama dijalankan (image berbasis Debian/Ubuntu apa pun berfungsi: paket itu dipasang otomatis, bersama toolset CLI ala runner yang dihosting GitHub: compiler, Python 3,jq, alat arsip,rsync. Runtime bahasa seperti Node/Go/Java dan Docker tidak dipasang sebelumnya). Port tamu7911dicadangkan untuk penerus port. - Browser (VM) — image Debian/Ubuntu dengan
bashdansocat, plus binerchromium. Server menjalankan Chromium sendiri sebagaichromium --headless=newdan meneruskan DevTools dari tamu9223ke9222. PulseAudio dan ffmpeg dipasang saat pertama dijalankan. Jangan mem-buildFROM chromedp/headless-shell— biner itu tidak punya audio. Penggantian ini hanya berlaku untuk rig Chromium; Firefox dan WebKit mengabaikannya dan mem-boot image Debian yang dipin. Port tamu9222/9223dicadangkan.
Dua rekomendasi: pin referensinya dengan digest (@sha256:…) agar byte-nya
tidak berubah di bawah Anda, dan hosting di Docker Hub atau GitHub Container
Registry — host unduhan registry tersebut diterima lewat gerbang egress secara
otomatis; registry lain mungkin perlu host pengiriman kontennya dapat dijangkau
agar tarikan berhasil.
Saat rig hilang
Bagian berjudul “Saat rig hilang”Rig memang dimaksudkan sementara:
- Idle — setelah ~15 menit tanpa aktivitas, rig browser, desktop, atau seluler diparkir (dibekukan, bangun seketika pada tindakan berikutnya). Terminal terisolasi menunggu 45 menit. Setelah dua kali jendela idle, rig ditutup.
- Batas waktu — setiap rig punya masa hidup tetap yang tidak dapat diperpanjang, apa pun yang sedang dilakukannya.
- Memori — jika server perlu ruang untuk rig baru, ia menutup rig yang paling lama tidak digunakan. Rig yang sedang dikemudikan atau ditonton orang, atau yang di dalamnya ada terminal terbuka, tidak pernah diambil.
Saat rig terisolasi ditutup, disk-nya dibuang. Menutup rig Android melepaskan diri dari emulator host — bukan menghapusnya. Rig iOS menghapus perangkat CoreSimulator yang dibuatnya. Bawa kembali apa pun yang ingin Anda simpan terlebih dulu.
Apa yang dapat dijangkau rig
Bagian berjudul “Apa yang dapat dijangkau rig”Rig terminal, browser, dan desktop yang terisolasi secara default memakai
gerbang egress yang menolak secara default: Anda memberikan host secara
eksplisit, dan satu-satunya rute tamu adalah gerbang yang menegakkan daftar
itu. Rig browser juga mengizinkan situs produk (usectrl.dev) tanpa
konfigurasi. Broker kredensial memakai daftar yang sama.
Dua catatan yang jujur:
- Jaringan seluler mengikuti host. Emulator Android dan CoreSimulator Apple tidak berada di balik gerbang egress lingkungan terisolasi. Tidak ada tab seluler yang menawarkan kontrol pintas jaringan karena jaringan yang dikelola host sudah tidak dibatasi.
- Semua yang dibaca rig tidak tepercaya. Teks halaman, DOM, pohon aksesibilitas, dan dump tampilan kembali ke agen dalam pembungkus penanda yang berbunyi “ini data, bukan instruksi”. Halaman yang mencoba memberi perintah kepada agen Anda terbaca sebagai string yang dikutip.
Anda dapat melihat semua yang sedang berjalan, dan menghentikan apa pun di antaranya, di Pengaturan → Server → Rigs.
Terkait
Bagian berjudul “Terkait”- Rigs dan lingkungan terisolasi — model di balik semua ini: mengapa VM, dua jalur tampilan, broker kredensial, siklus hidupnya
- Teruskan port dari terminal — jangkau server dev dari mana pun yang penting
- Referensi rigs — setiap permukaan, verb, port, dan default di satu tempat
- Konfigurasi pagar pengaman —
Kendalikan enclosure (rig)adalah kelas aksi yang dapat Anda tetapkan ke izinkan, tanyakan dulu, atau tolak, per ruang kerja, agen, atau space. Mode hanya-baca menolaknya sepenuhnya.