Langkau ke kandungan

Stesen

Fakta sahaja. Untuk model di sebaliknya, baca Stesen dan persekitaran terasing; untuk membuka mesin, ikut panduan.

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 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 ignoreCache BiDi 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 memerlukan ffmpeg pada 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.
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.

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.

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.

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.

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.

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.

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 Penerangan
rig_list Senaraikan stesen sesebuah ruang kerja dengan permukaan, status, paparan dan pengawal
rig_close Musnahkan stesen dan buang cakeranya
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
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 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.test atau name.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. Tiada openssl pada hos bermakna tiada lorong HTTPS; HTTP biasa masih dilalukan.
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.

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 sebagai 2-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 XdndSelection tetamu 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_files dan read_file membawa kiraan, saiz dan laluan. Papan klip ialah tempat kelayakan hidup selama beberapa saat pada satu masa, dan tiada satu pun daripadanya dicatat.
  • Alat stesen mengisytiharkan kelas tindakan enclosureControl (serta networkEgress dan processSpawn pada alat use; mobile_use dan ios_use turut mengisytiharkan packageInstall). rig_close mengisytiharkan enclosureControl; rig_list tidak 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_sessions dan rig_action_log dalam 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/rigs ialah skrin tetapan Stesen.