Stesen
Fakta sahaja. Untuk model di sebaliknya, baca Stesen dan persekitaran terasing; untuk membuka mesin, ikut panduan.
Permukaan dan bahagian belakang
Bahagian bertajuk “Permukaan dan bahagian belakang”| Permukaan | Memandu | Bahagian belakang | Nilai | Keluar yang dikurung |
|---|---|---|---|---|
| Terminal (exec) | Shell melalui saluran exec VM | microVM | smolvm |
Ya |
| Penyemak imbas | Chromium tanpa kepala (CDP), Firefox (WebDriver BiDi) atau WebKit (W3C WebDriver) | microVM | smolvm |
Ya |
| Komputer | Desktop X11: input melalui hipervisor, tangkapan melalui ejen tetamu | QEMU | qemu-hvf (macOS), qemu-kvm (Linux), qemu-tcg (sandaran tanpa pecutan, tidak pernah dipilih secara automatik) |
Ya |
| Android | Android melalui ADB | Emulator Google | android-emulator |
Tidak — emulator menguruskan rangkaian sendiri |
| iOS | Simulator iOS melalui WebDriverAgent | CoreSimulator | ios-simulator |
Tidak — rangkaian mengikut Mac hos |
Terminal dan permukaan computer_use berkongsi nilai permukaan computer;
terminal dibezakan oleh penanda imej execnya dan tidak pernah digunakan semula
sebagai desktop yang boleh dipandu (atau sebaliknya). Satu perbualan menggunakan
semula satu mesin terminal.
Enjin penyemak imbas
Bahagian bertajuk “Enjin penyemak imbas”| Enjin | Nilai | Protokol | Paparan langsung | Gambar pegun |
|---|---|---|---|---|
| Chromium | chromium (lalai) |
Chrome DevTools Protocol | Screencast — penyemak imbas menolak bingkai semasa halaman dilukis semula | JPEG |
| Firefox | firefox |
WebDriver BiDi | Gambar pegun yang ditinjau (BiDi tiada screencast), dihadkan pada 6 fps | JPEG |
| WebKit | webkit |
W3C WebDriver (klasik) | Gambar pegun yang ditinjau, ditranskod oleh ffmpeg hos | PNG |
Sebuah stesen menjalankan satu enjin sepanjang hayatnya. Satu perbualan boleh memegang satu stesen bagi setiap enjin, dan itulah yang membolehkan perbandingan bersebelahan: membuka “Firefox (VM)” di sebelah “Chromium (VM)” ialah dua mesin, dan menutup satu membiarkan yang satu lagi berjalan.
Hantar engine kepada rig.open atau kepada alat browser_use. Nama yang
tidak dikenali ditolak dan bukan dijadikan lalai — meminta penyemak imbas lalu
secara senyap mendapat yang berbeza menjawab soalan keserasian dengan jawapan
yang salah.
Had khusus enjin, dinyatakan dan bukan diakali:
- Firefox tiada muat semula yang melangkau cache (ia menolak
ignoreCacheBiDi secara terus), jadi muat semula keras ialah muat semula biasa. - WebKit juga tiada muat semula yang melangkau cache, tiada suapan konsol
(output ditangkap dengan mengait
console.*selepas setiap navigasi, jadi apa-apa yang dilog semasa muat tidak direkodkan — setiap pengekstrakan konsol menyatakannya), dan memerlukanffmpegpada hos untuk paparan langsungnya. - Kedua-duanya tidak mendedahkan pepohon kebolehcapaian platform melalui
protokolnya, jadi
extract (a11y)mengembalikan penghampiran terbitan DOM, dilabel sedemikian. - Kedua-duanya tidak boleh menerima lepasan fail yang sebenar; input fail masih boleh ditunjukkan kepada laluan di dalam mesin.
Imej mesin
Bahagian bertajuk “Imej mesin”| Permukaan | Imej | Diambil |
|---|---|---|
| Terminal | ubuntu:24.04, dipinkan mengikut digest |
Secara automatik pada but pertama, melalui rangkaian berpintu mesin itu sendiri |
| Penyemak imbas (Chromium, Firefox, WebKit) | debian:trixie-slim, dipinkan mengikut digest, serta pakej enjin itu sendiri |
Secara automatik pada but pertama, kemudian dicache sebagai pek yang telah dipanaskan |
| Komputer | Imej desktop qcow2 dengan Chromium, Firefox, WebKit dan garis dasar CLI runner yang dihoskan GitHub yang sama yang dipanaskan oleh terminal | Import di bawah Tetapan → Pelayan → Stesen (muat turun yang dipinkan mengikut checksum jika diterbitkan) |
| Android | Imej sistem Google | Melalui Android SDK |
| iOS | Runtime Xcode Simulator serta WebDriverAgent yang dipinkan mengikut checksum | Runtime melalui Xcode; jambatan automasi dari Tetapan → Pelayan → Stesen |
Selepas but pertama setiap jenis microVM, pelayan mencache salinan yang telah
diekstrak di bawah direktori data dan but setiap mesin seterusnya daripadanya —
termasuk imej yang telah dipanaskan dengan pakej sudah dipasang. Terminal
memanaskan set alat CLI bergaya runner yang dihoskan GitHub (git, gcc,
python3, jq, rsync, alat arkib, dan selebihnya garis dasar apt; bukan
Docker atau toolcache bahasa). Qcow2 Komputer membenamkan nama CLI yang sama
semasa binaan imej, bersebelahan XFCE dan ketiga-tiga penyemak imbas. Setiap
penyemak imbas memanaskan enjinnya. Ketiga-tiga enjin berkongsi asas Debian
tetapi tidak pernah berkongsi pek: cache dikunci pada imej, enjin dan satu
revisi audio (audio-v1-<engine>), kerana mesin yang dipanaskan untuk satu
enjin — atau sebelum PulseAudio dan ffmpeg menjadi sebahagian daripada beban
kerja — tiada yang lain di dalamnya. Pek terminal dikunci pada revisi set alat
(tools-v1) atas sebab yang sama: pek yang dipanaskan sebelum pengkompil
menjadi sebahagian daripada imej tidak boleh melayani mesin yang sepatutnya
memilikinya.
Tiada imej automasi bawaan yang berbaloi diambil — chromedp/headless-shell
Chromium mengeluarkan kedua-dua ALSA dan PulseAudio daripada binaan, jadi ia
tidak boleh mengeluarkan bunyi; satu-satunya imej Firefox yang diselenggara
ialah 33× saiz asas Debian dan masih tidak menyertakan socat; tiada langsung
imej WebKit yang diselenggara. Jadi setiap enjin memasang pada permulaan
pertama (chromium, firefox-esr, atau webkit2gtk-driver) dan mencapai
arkib Debian (deb.debian.org, security.debian.org, cloudfront.debian.net)
semasa melakukannya. Chromium ialah binari edaran yang dilancarkan sebagai
chromium --headless=new.
Imej tersuai bagi setiap ruang kerja
Bahagian bertajuk “Imej tersuai bagi setiap ruang kerja”| Kunci tetapan | Mengatasi |
|---|---|
rigs.smolvm.execImage |
Imej Terminal (VM) |
rigs.smolvm.browserImage |
Imej Penyemak imbas (VM) Chromium |
Ditulis melalui stor tetapan ruang kerja yang berpintu admin (Tetapan → Pelayan → Stesen → Imej tersuai (ruang kerja ini)). Nilai itu mesti rujukan daftar — laluan setempat, arkib dan rentetan seperti flag ditolak, baik pada medan mahupun sekali lagi semasa but. Nilai tersimpan yang tidak sah diabaikan secara lantang dan lalai akan but sebaliknya. Daftar imej itu sendiri (serta rakan blob-CDN yang dikenali untuk Docker Hub, GHCR, Quay, GitLab dan GCR) diterima masuk melalui pintu keluar untuk penarikan itu.
Kontrak imej Terminal — bash hadir; git, curl, socat telah dipasang
atau asas apt Debian/Ubuntu (persekitaran terasing memasang ketiga-tiga itu
serta set alat CLI bergaya runner yang dihoskan GitHub pada permulaan pertama:
pengkompil, Python 3, jq, alat arkib, rsync. Toolcache bahasa dan Docker
tidak dipasang).
Kontrak imej Penyemak imbas — asas apt Debian/Ubuntu (atau pakej yang sudah
dipasang) dengan bash dan socat, serta binari chromium yang dilancarkan
sendiri oleh pelayan sebagai chromium --headless=new dengan DevTools pada
loopback tetamu 9223, digeganti ke port tetamu 9222. PulseAudio dan ffmpeg
dipasang pada permulaan pertama untuk lorong audio. Jangan bina
FROM chromedp/headless-shell: headless.gn huluan mengeluarkan kedua-dua ALSA
dan PulseAudio daripada binaan, jadi binari itu tidak boleh mengeluarkan bunyi.
Pengatasan ini terpakai kepada stesen Chromium sahaja — arahan beban kerja
yang dibutnya ialah milik Chromium, dan menyerahkannya kepada Firefox atau
WebKit akan melancarkan binari yang tiada di situ. Stesen Firefox atau WebKit
mengabaikannya secara lantang dan but imej yang dipinkannya.
Port automasi — setiap mesin penyemak imbas memajukan tepat satu port
loopback hos ke tetamu 9222. Di belakangnya: DevTools Chromium dan ejen jauh
Firefox berada pada loopback tetamu 9223 dengan geganti socat di hadapannya
(kedua-duanya mengikat loopback tanpa syarat); pemacu WebKit mengambil --host
dan mengikat NIC tetamu sendiri. Firefox turut mengesahkan pengepala Host
terhadap portnya sendiri, jadi klien menghantar autoriti sisi tetamu dan bukan
yang didailnya.
Kata kerja tindakan
Bahagian bertajuk “Kata kerja tindakan”Setiap tindakan dihurai secara menyeluruh: muatan yang cacat mengembalikan mesej yang menamakan medan itu, tidak pernah pengecualian. Kata kerja pemerhatian (ditandakan ○) kekal dibenarkan semasa manusia memegang kawalan; kata kerja yang mengubah keadaan ditolak.
computer_use
Bahagian bertajuk “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.
Koordinat ialah piksel tetamu dalam modus semasa tetamu; setiap tangkapan skrin
menyatakan saiz paparan. Gabungan kekunci menggunakan ejaan X11 (ctrl+s,
alt+Tab, Return).
clipboard_read mengambil selection: clipboard (apa yang diisi oleh ctrl+C,
iaitu lalai), primary (pilih-untuk-salin X11) atau xdnd (seretan yang sedang
berlangsung). Hasil kosong ialah jawapan biasa bagi ketiga-tiganya.
clipboard_write mengambil text sahaja — imej dan fail bergerak pada lorong
fail, kerana argumen tindakan disimpan dalam log audit dan bait imej tiada urusan
di situ. Kandungan papan klip kembali dipagari sebagai data tidak dipercayai.
browser_use
Bahagian bertajuk “browser_use”navigate (http/https sahaja), reload (hard pilihan), stop_loading,
click (pemilih atau koordinat), fill, type, key (nama kekunci DOM),
scroll, mouse_move, drag, left_mouse_down, left_mouse_up,
extract○ (a11y | dom | console), screenshot○ (full_page
pilihan), set_viewport (min 320×240), history, wait_for○ (pemilih,
0.1–30 s), clipboard_read○, clipboard_write.
Kandungan halaman yang diekstrak kembali dipagari sebagai data tidak dipercayai.
Penyemak imbas mempunyai tepat satu papan klip, jadi clipboard_read tidak
mengambil selection. Kedua-dua kata kerja papan klip memerlukan konteks
selamat: halaman yang disajikan melalui http:// biasa tiada API papan klip
langsung, dan kata kerja itu menyatakannya dan bukan melaporkan yang kosong —
gunakan type di situ, yang menyisipkan pada titik sisipan tanpa melalui papan
klip.
mobile_use
Bahagian bertajuk “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, atau mana-mana KEYCODE_*),
screenshot○, ui_dump○, install_apk
(terhad kepada worktree stesen dan direktori data pelayan), start_app,
stop_app, clear_app_data, uninstall_app, open_url, dan shell.
shell mengambil senarai argv dan berjalan di dalam Android, tidak pernah
melalui shell hos; ia merangkumi diagnostik pembangun seperti logcat,
dumpsys dan pm grant.
mobile_use tiada kata kerja papan klip. Sejak Android 10, hanya aplikasi yang
berfokus boleh membaca papan klip.
ios_use
Bahagian bertajuk “ios_use”tap, swipe (50–5000 ms), type, key (enter, backspace, tab,
escape, kekunci anak panah atau satu aksara boleh cetak; pengubah command,
control, option dan shift yang pilihan), home, lock, unlock,
screenshot○, ui_dump○, install_app (direktori .app simulator
yang terhad kepada worktree stesen atau direktori data pelayan), start_app,
stop_app, uninstall_app, open_url, dan spawn. spawn mengambil argv
dan melaksanakan di dalam simulator melalui simctl; ia tidak pernah
memanggil shell hos.
Koordinat ialah mata skrin iOS, bukan piksel tangkapan skrin. Strim langsung mengekalkan saiz tetap simulator dan memaparkannya dengan jalur hitam di sekelilingnya dan bukan mengubah saiz peranti. Pemindahan papan klip teks dari hos ke simulator dan dari simulator ke hos menggunakan polisi kebenaran bagi setiap pengguna dan setiap arah yang sama seperti stesen lain; fail dan imej tidak diterima oleh lorong papan tampal iOS.
Setiap stesen mencipta peranti CoreSimulator yang dimiliki dan sesi WebDriverAgent. Menutupnya menghentikan WebDriverAgent, mematikan dan memadam peranti itu, serta membuang entri daftarnya. Stesen iOS berjalan hanya pada pelayan macOS dengan Xcode, runtime iOS yang dipasang dan jambatan automasi yang dipinkan. Ia tidak mendedahkan audio, mikrofon, lepasan fail, shell hos atau jaminan rangkaian terkurung.
Alat pengurusan
Bahagian bertajuk “Alat pengurusan”| Alat | Penerangan |
|---|---|
rig_list |
Senaraikan stesen sesebuah ruang kerja dengan permukaan, status, paparan dan pengawal |
rig_close |
Musnahkan stesen dan buang cakeranya |
Kitaran hayat
Bahagian bertajuk “Kitaran hayat”| Fasa | Maksud |
|---|---|
provisioning |
Sedang but; butiran status membawa langkah semasa secara kata demi kata |
ready |
Boleh dicapai dan menerima tindakan |
parked |
Diparkir melahu: vCPU dihentikan, RAM masih mastautin; tindakan seterusnya membangunkannya |
closing |
Sedang menutup |
closed |
Telah hilang; barisnya kekal untuk jejak audit |
failed |
Mati atau tidak pernah naik; boleh dibezakan supaya UI boleh menawarkan cuba semula |
| Sebab penutupan | Dicetuskan apabila |
|---|---|
requested |
Seseorang atau ejen memintanya |
idleTimeout |
Melahu melebihi 2× tetingkap melahu, atau disingkirkan kerana memori |
ttlExpired |
Jangka hayat keras telah tamat |
conversationEnded |
Perbualan pemiliknya tamat |
workspaceGone |
Ruang kerja dipadamkan atau keahlian hilang |
serverShutdown |
Pelayan sedang berhenti |
backendFailure |
Hipervisor mati di bawahnya |
Lalai dan siling
Bahagian bertajuk “Lalai dan siling”| Nilai | Terminal | Penyemak imbas | Komputer | Mudah alih |
|---|---|---|---|---|
| Memori | 512 MB | 2048 MB (Chromium); 2560 MB (Firefox, WebKit) | 4096 MB | 4096 MB |
| vCPUs | 2 | 2 | 4 | 4 |
| TTL keras | 8 h | 2 h | 2 h | 2 h |
| Tetingkap melahu | 45 min | 15 min | 15 min | 15 min |
| Paparan but | — | 1280×800 | 1280×800 | 1080×1920 |
- Gambar pegun lorong ejen dihadkan pada 1280×800; lorong manusia merunding sehingga 2560×1600.
- Bajet memori mastautin hos untuk semua stesen ialah 12 GB secara lalai, dikira dalam megabait mastautin (VM yang diparkirkan masih memegang RAM-nya). Penyingkiran ialah yang paling lama tidak digunakan dan tidak pernah mengambil mesin yang sedang dipandu, ditonton, atau mempunyai terminal terbuka.
- Terminal terbuka atau lorong tontonan menyematkan stesen daripada diparkirkan dan daripada dituai kerana melahu; TTL keras tetap terpakai.
Port dan domain dev
Bahagian bertajuk “Port dan domain dev”| Port | Di mana | Dikhususkan untuk |
|---|---|---|
7911 |
Tetamu terminal | Pemultipleks port yang ditunggangi setiap pemajuan |
9222, 9223 |
Tetamu penyemak imbas | Geganti dan titik akhir automasi (WebKit mengikat 9222 secara terus dan tidak menggunakan geganti) |
80, 443 |
Loopback tetamu penyemak imbas | Lorong HTTP/HTTPS domain dev |
- Penemuan meninjau port TCP yang mendengar pada tetamu terminal setiap ~4 s, di sisi pelayan.
- Paling banyak 16 port dimajukan secara automatik bagi setiap stesen; yang lebih banyak disenaraikan dalam log, bukan dimajukan.
- Pemajuan di sisi hos mengikat loopback, mengutamakan nombor port tetamu sendiri; Kongsi pada rangkaian setempat menambah port LAN yang diberikan OS.
- Domain dev mesti sepadan dengan
name.testatauname.localhost(huruf kecil, label maksimum 63 aksara). Satu domain memetakan kepada satu port. - HTTPS domain dev menggunakan CA setempat pelayan (EC P-256, di bawah
<dataDir>/rigs/tls/, kunci 0600 dan tidak pernah dalam tetamu) dengan satu daun kad liar untuk*.test/*.localhost. Tiadaopensslpada hos bermakna tiada lorong HTTPS; HTTP biasa masih dilalukan.
Lalai keluar
Bahagian bertajuk “Lalai keluar”| Permukaan | Senarai kebenaran lalai |
|---|---|
| Terminal | Garis dasar pembangun kotak pasir (hos kod, daftar pakej, penyedia model) + cermin apt Ubuntu + hos kod worktree itu sendiri |
| Penyemak imbas | usectrl.dev (tapak produk) — serta arkib Debian pada but pertama setiap enjin, semasa ia memasang pakejnya. Halaman utama ialah dokumen file:// setempat dan tidak memerlukan keluar |
| Komputer | Kosong — tolak semuanya — sehingga pemanggil memberikan hos |
| Mudah alih | Tidak dikuatkuasakan (rangkaian diurus emulator) |
Setiap microVM tambahan mendapat hos daftar imejnya, untuk penarikan sahaja. Set hos dibenarkan broker kelayakan diterbitkan daripada senarai kebenaran yang sama: tiada token dikeluarkan untuk hos yang tidak boleh dicapai tetamu.
Papan klip dan pemindahan fail
Bahagian bertajuk “Papan klip dan pemindahan fail”Kedua-dua arah salin/tampal, dan menyeret fail masuk dan keluar. Tersedia kepada orang yang memandu stesen; ejen mendapat papan klip melalui kata kerja di atas dan tiada pemindahan fail sama sekali (ia sudah mempunyai shell di dalam persekitaran terasing).
Pelintasan papan klip ialah bagi setiap pengguna dan setiap arah. Tampal dari hos ke stesen dibenarkan secara lalai; salin dari stesen ke hos akan bertanya dahulu (kebenaran sepuluh minit, atau sentiasa benarkan di bawah Tetapan → Pelayan → Stesen → Akses papan klip). Kedua-dua pilihan itu bebas dan tidak pernah menjadi tetapan ruang kerja.
| Lorong | Laluan | Membawa |
|---|---|---|
| Papan klip | GET/POST /rig/clipboard/<rigId> |
Teks, satu PNG/JPEG (≤16 MB), dan laluan tetamu fail pada papan klip |
| Fail | POST /rig/files/<rigId> |
Sehingga 64 fail, ≤256 MB setiap satu dan ≤512 MB bagi setiap lepasan, dengan titik lepasan piksel tetamu yang pilihan |
| Fail | GET /rig/files/<rigId>?p=<base64url path> |
Bait satu fail, dibawa keluar |
- HTTP, bukan RPC. Soket RPC menutup sambungan pada bingkai masuk melebihi 256 KB — pengawal DoS yang betul untuk arahan JSON dan membawa maut untuk tangkapan skrin yang ditampal. Bait menunggang jenis laluan yang sama seperti bingkai stesen dan audio mesyuarat.
- Pengesahan ialah sasaran yang ditandatangani
rig-files:<workspaceId>/<rigId>serta keahlian ruang kerja — sasaran tersendiri, jadi URL yang dicipta untuk menonton mesin tidak boleh juga menulis fail ke dalamnya. - Pengambilalihan terpakai. Menulis papan klip dan melepaskan fail adalah mengubah keadaan dan ditolak semasa orang lain memegang kawalan; membaca papan klip dan membaca fail keluar ialah pemerhatian dan bukan.
- Di mana lepasan mendarat:
~/Drops(desktop),~/drops(terminal — di sebelah worktree, tidak pernah di dalamnya, jadi lepasan tidak pernah muncul sebagai perubahan tidak dijejaki),/tmp/cc-drops(penyemak imbas). Pelayan memilih direktori itu; pemanggil tidak boleh menamakannya. Fail sedia ada tidak pernah ditulis ganti — nama yang bercanggah mendarat sebagai2-name.ext. - Apa yang diberitahu kepada tetamu: halaman penyemak imbas mendapat
peristiwa lepasan sebenar pada titik yang diminta
(
Input.dispatchDragEvent); desktop mendapat fail itu serta URI-nya pada papan klipnya, kerana tiada hos boleh mensintesis seretan XDND ke dalam toolkit sewenang-wenangnya tanpa daemon istimewa dalam tetamu. Balasan menyatakan yang mana satu daripada kedua-duanya berlaku. - Menyeret keluar hanya untuk desktop dan membaca
XdndSelectiontetamu semasa seretan sedang berlangsung. Muatan yang sama seperti yang sudah dipegang tetamu semasa tekan bermula dianggap pemilihan basi daripada seretan yang telah tamat, bukan yang baharu — X tiada langkah “seretan sudah tamat”. - Keperluan imej: imej desktop mesti protokol 2 atau lebih baharu (dibina selepas sokongan papan klip diperkenalkan). Imej yang lebih lama menjawab 404 dan apl menyatakan supaya binanya semula dan bukan melaporkan mesin yang rosak.
- Log audit merekodkan bentuknya, tidak pernah kandungannya: baris
clipboard_read,clipboard_write,drop_filesdanread_filemembawa kiraan, saiz dan laluan. Papan klip ialah tempat kelayakan hidup selama beberapa saat pada satu masa, dan tiada satu pun daripadanya dicatat.
Guardrail, acara, storan
Bahagian bertajuk “Guardrail, acara, storan”- Alat stesen mengisytiharkan kelas tindakan
enclosureControl(sertanetworkEgressdanprocessSpawnpada alat use;mobile_usedanios_useturut mengisytiharkanpackageInstall).rig_closemengisytiharkanenclosureControl;rig_listtidak mengisytiharkan apa-apa. Dibenarkan secara lalai; modus baca sahaja menolaknya secara menyeluruh; dail autonomi bagi setiap ruang boleh menurunkannya kepada tanya dahulu. - Acara domain:
RigClosedEvent(dengan sebab penutupannya),RigControlChanged(pengambilalihan / pemulangan),RigReaped(melahu, TTL atau penyingkiran memori, dengan ejen yang memandu). Membuka stesen bukan acara. Lihat acara domain. - Storan:
rig_sessionsdanrig_action_logdalam setiap pangkalan data ruang kerja. Log tindakan merekodkan setiap peristiwa input dengan prinsipalnya dan jujukan monotonik setiap stesen; teks yang ditaip disunting kepada panjang dan cincang sebelum ia ditulis. - Direktori data:
rigs/images/(imej qcow2 yang diimport),rigs/smolvm/(keadaan runtime setiap stesen),rigs/smolvm-packs/(pek mesin yang telah diekstrak),rigs/tls/(CA domain dev),rigs/run/(tindanan dan benih QEMU). - Laluan: paparan langsung ialah tab dalam ruang atau halaman PR;
/settings/server/rigsialah skrin tetapan Stesen.