Μετάβαση στο περιεχόμενο

Σταθμοί

Μόνο γεγονότα. Για το μοντέλο πίσω από αυτά, διαβάστε Σταθμοί και περιβλήματα· για να ανοίξετε μια μηχανή, ακολουθήστε τον οδηγό.

Επιφάνεια Οδηγεί Υποσύστημα Τιμή Περιορισμένη εξερχόμενη κίνηση
Τερματικό (exec) Ένα κέλυφος πάνω από το κανάλι εκτέλεσης της VM microVM smolvm Ναι
Περιηγητής Headless Chromium (CDP), Firefox (WebDriver BiDi) ή WebKit (W3C WebDriver) microVM smolvm Ναι
Υπολογιστής Επιφάνεια εργασίας X11: είσοδος μέσω του υπερεπόπτη, σύλληψη μέσω του πράκτορα του φιλοξενούμενου QEMU qemu-hvf (macOS), qemu-kvm (Linux), qemu-tcg (μη επιταχυνόμενη εφεδρική λύση, δεν επιλέγεται ποτέ αυτόματα) Ναι
Android Android μέσω ADB Ο εξομοιωτής της Google android-emulator Όχι — ο εξομοιωτής διαχειρίζεται μόνος του τη δικτύωσή του
iOS Προσομοιωτής iOS μέσω WebDriverAgent CoreSimulator ios-simulator Όχι — το δίκτυο ακολουθεί τον Mac του ξενιστή

Το τερματικό και η επιφάνεια computer_use μοιράζονται την τιμή επιφάνειας computer· το τερματικό ξεχωρίζει από τον δείκτη της εικόνας εκτέλεσής του και δεν επαναχρησιμοποιείται ποτέ ως οδηγήσιμη επιφάνεια εργασίας (ούτε το αντίστροφο). Μία συνομιλία επαναχρησιμοποιεί μία μηχανή τερματικού.

Μηχανή Τιμή Πρωτόκολλο Ζωντανή προβολή Ακίνητες εικόνες
Chromium chromium (προεπιλογή) Chrome DevTools Protocol Screencast — ο περιηγητής σπρώχνει καρέ καθώς η σελίδα επαναζωγραφίζεται JPEG
Firefox firefox WebDriver BiDi Ακίνητες εικόνες με δειγματοληψία (το BiDi δεν έχει screencast), με ανώτατο όριο 6 fps JPEG
WebKit webkit W3C WebDriver (κλασικό) Ακίνητες εικόνες με δειγματοληψία, με κωδικοποίηση από το ffmpeg του ξενιστή PNG

Ένας σταθμός εκτελεί μία μηχανή σε όλη του τη ζωή. Μία συνομιλία μπορεί να κρατά έναν σταθμό ανά μηχανή, κι αυτό είναι που κάνει δυνατή τη σύγκριση δίπλα-δίπλα: το άνοιγμα του «Firefox (VM)» δίπλα στο «Chromium (VM)» είναι δύο μηχανές, και το κλείσιμο της μίας αφήνει την άλλη σε λειτουργία.

Περάστε το engine στο rig.open ή στο εργαλείο browser_use. Ένα άγνωστο όνομα απορρίπτεται αντί να πέσει στην προεπιλογή — το να ζητήσετε έναν περιηγητή και να πάρετε σιωπηλά έναν άλλον απαντά σε ένα ερώτημα συμβατότητας με λάθος απάντηση.

Όρια ειδικά για κάθε μηχανή, που δηλώνονται αντί να παρακάμπτονται:

  • Ο Firefox δεν έχει επαναφόρτωση με παράκαμψη της κρυφής μνήμης (απορρίπτει ευθέως το ignoreCache του BiDi), οπότε μια σκληρή επαναφόρτωση είναι μια απλή επαναφόρτωση.
  • Το WebKit δεν έχει ούτε αυτό επαναφόρτωση με παράκαμψη της κρυφής μνήμης, ούτε ροή κονσόλας (η έξοδος συλλαμβάνεται με άγκιστρο στο console.* μετά από κάθε πλοήγηση, οπότε ό,τι καταγράφεται κατά τη φόρτωση χάνεται — κάθε εξαγωγή κονσόλας το δηλώνει), και χρειάζεται ffmpeg στον ξενιστή για τη ζωντανή προβολή του.
  • Καμία από τις δύο δεν εκθέτει δέντρο προσβασιμότητας της πλατφόρμας μέσω του πρωτοκόλλου της, οπότε το extract (a11y) επιστρέφει μια προσέγγιση που παράγεται από το DOM, χαρακτηρισμένη ως τέτοια.
  • Καμία από τις δύο δεν δέχεται πραγματική απόθεση αρχείου· μια είσοδος αρχείου μπορεί ωστόσο να δείξει σε διαδρομές μέσα στη μηχανή.
Επιφάνεια Εικόνα Λήψη
Τερματικό ubuntu:24.04, καθηλωμένη σε digest Αυτόματα στην πρώτη εκκίνηση, μέσω του δικού της φραγμένου δικτύου της μηχανής
Περιηγητής (Chromium, Firefox, WebKit) debian:trixie-slim, καθηλωμένη σε digest, συν τα δικά της πακέτα της μηχανής Αυτόματα στην πρώτη εκκίνηση και μετά στην προσωρινή μνήμη ως προθερμασμένο πακέτο
Υπολογιστής Μια εικόνα επιφάνειας εργασίας qcow2 με Chromium, Firefox, WebKit και την ίδια βάση CLI τύπου runner φιλοξενημένου στο GitHub που προθερμαίνει το τερματικό Εισαγωγή στις Ρυθμίσεις → Διακομιστής → Σταθμοί (λήψεις καθηλωμένες σε άθροισμα ελέγχου όπου δημοσιεύονται)
Android Οι εικόνες συστήματος της Google Μέσω του Android SDK
iOS Ένα runtime του Προσομοιωτή Xcode συν WebDriverAgent καθηλωμένο σε άθροισμα ελέγχου Το runtime μέσω Xcode· η γέφυρα αυτοματοποίησης από τις Ρυθμίσεις → Διακομιστής → Σταθμοί

Μετά την πρώτη εκκίνηση κάθε είδους microVM, ο διακομιστής αποθηκεύει προσωρινά ένα προ-εξαγμένο αντίγραφο στον κατάλογο δεδομένων και εκκινεί κάθε επόμενη μηχανή από αυτό — συμπεριλαμβανομένων προθερμασμένων εικόνων με τα πακέτα ήδη εγκατεστημένα. Το τερματικό προθερμαίνει ένα σύνολο εργαλείων CLI τύπου runner φιλοξενημένου στο GitHub (git, gcc, python3, jq, rsync, εργαλεία αρχειοθέτησης και την υπόλοιπη βάση του apt· όχι Docker ή toolcache γλωσσών). Το qcow2 του Υπολογιστή ενσωματώνει τα ίδια ονόματα CLI κατά την κατασκευή της εικόνας, δίπλα στο XFCE και στους τρεις περιηγητές. Κάθε περιηγητής προθερμαίνει τη μηχανή του. Και οι τρεις μηχανές μοιράζονται μια βάση Debian αλλά δεν μοιράζονται ποτέ πακέτο: η κρυφή μνήμη κλειδώνεται με βάση την εικόνα, τη μηχανή και μια αναθεώρηση ήχου (audio-v1-<engine>), επειδή μια μηχανή που προθερμάνθηκε για μία μηχανή — ή πριν το PulseAudio και το ffmpeg γίνουν μέρος του φόρτου — δεν έχει μέσα της καμία από τις άλλες. Το πακέτο του τερματικού κλειδώνεται με βάση μια αναθεώρηση συνόλου εργαλείων (tools-v1) για τον ίδιο λόγο: ένα πακέτο που προθερμάνθηκε πριν ο μεταγλωττιστής γίνει μέρος της εικόνας δεν πρέπει να εξυπηρετεί μια μηχανή που υποτίθεται ότι έχει έναν.

Δεν αξίζει να πάρει κανείς μια έτοιμη εικόνα αυτοματοποίησης — το chromedp/headless-shell του Chromium αποκλείει κατά τη μεταγλώττιση και το ALSA και το PulseAudio, οπότε δεν μπορεί ποτέ να βγάλει ήχο· η μόνη συντηρούμενη για Firefox είναι 33× το μέγεθος της βάσης Debian και εξακολουθεί να μη διαθέτει socat· για WebKit δεν υπάρχει καμία συντηρούμενη. Έτσι κάθε μηχανή περιήγησης εγκαθίσταται στην πρώτη εκκίνηση (chromium, firefox-esr ή webkit2gtk-driver) και φτάνει στα αποθετήρια Debian (deb.debian.org, security.debian.org, cloudfront.debian.net) κατά τη διάρκεια. Ο Chromium είναι το δυαδικό της διανομής, που εκκινείται ως chromium --headless=new.

Προσαρμοσμένες εικόνες ανά χώρο εργασίας

Ενότητα με τίτλο «Προσαρμοσμένες εικόνες ανά χώρο εργασίας»
Κλειδί ρύθμισης Παρακάμπτει
rigs.smolvm.execImage Την εικόνα του Τερματικού (VM)
rigs.smolvm.browserImage Την εικόνα του Περιηγητή (VM) Chromium

Γράφονται μέσω της αποθήκης ρυθμίσεων χώρου εργασίας που ελέγχεται από διαχειριστή (Ρυθμίσεις → Διακομιστής → Σταθμοί → Προσαρμοσμένες εικόνες (αυτός ο χώρος εργασίας)). Η τιμή πρέπει να είναι αναφορά registry — τοπικές διαδρομές, αρχεία αρχειοθέτησης και συμβολοσειρές που μοιάζουν με σημαίες απορρίπτονται, και στο πεδίο και πάλι στην εκκίνηση. Μια άκυρη αποθηκευμένη τιμή αγνοείται με θόρυβο και αντί γι’ αυτής εκκινεί η προεπιλογή. Το δικό της registry της εικόνας (συν γνωστούς συνοδούς blob-CDN για Docker Hub, GHCR, Quay, GitLab και GCR) γίνεται δεκτό μέσω της πύλης εξερχόμενης κίνησης για το pull.

Σύμβαση εικόνας τερματικού — παρουσία του bash· τα git, curl, socat προεγκατεστημένα ή μια βάση apt Debian/Ubuntu (το περίβλημα εγκαθιστά αυτά τα τρία συν ένα σύνολο εργαλείων CLI τύπου runner φιλοξενημένου στο GitHub στην πρώτη εκκίνηση: μεταγλωττιστές, Python 3, jq, εργαλεία αρχειοθέτησης, rsync. Toolcache γλωσσών και Docker δεν εγκαθίστανται).

Σύμβαση εικόνας περιηγητή — μια βάση apt Debian/Ubuntu (ή τα πακέτα ήδη εγκατεστημένα) με bash και socat, συν ένα δυαδικό chromium που ο διακομιστής εκκινεί μόνος του ως chromium --headless=new με το DevTools στο loopback του φιλοξενούμενου 9223, αναμεταδιδόμενο στη θύρα 9222 του φιλοξενούμενου. Τα PulseAudio και ffmpeg εγκαθίστανται στην πρώτη εκκίνηση για τη δίοδο ήχου. Μην κάνετε build FROM chromedp/headless-shell: το headless.gn των ανάντη αποκλείει κατά τη μεταγλώττιση και το ALSA και το PulseAudio, οπότε αυτό το δυαδικό δεν μπορεί να βγάλει ήχο. Η παράκαμψη ισχύει μόνο για σταθμούς Chromium — η εντολή φόρτου που εκκινεί είναι του Chromium, και το να τη δώσετε σε Firefox ή WebKit θα εκκινούσε ένα δυαδικό που δεν υπάρχει. Ένας σταθμός Firefox ή WebKit την αγνοεί με θόρυβο και εκκινεί την καθηλωμένη του εικόνα.

Θύρες αυτοματοποίησης — κάθε μηχανή περιηγητή προωθεί ακριβώς μία θύρα loopback του ξενιστή στη θύρα 9222 του φιλοξενούμενου. Πίσω από αυτήν: το DevTools του Chromium και ο απομακρυσμένος πράκτορας του Firefox βρίσκονται στο loopback του φιλοξενούμενου 9223 με ένα ρελέ socat μπροστά (και τα δύο δεσμεύουν το loopback χωρίς όρους)· ο οδηγός του WebKit δέχεται ένα --host και δεσμεύει ο ίδιος την κάρτα δικτύου του φιλοξενούμενου. Ο Firefox επιπλέον επικυρώνει την κεφαλίδα Host ως προς τη δική του θύρα, οπότε ο πελάτης στέλνει το authority της πλευράς του φιλοξενούμενου αντί για εκείνο στο οποίο κατέφυγε.

Κάθε ενέργεια αναλύεται ολικά: ένα κακοσχηματισμένο φορτίο επιστρέφει ένα μήνυμα που ονομάζει το πεδίο, ποτέ μια εξαίρεση. Τα ρήματα παρατήρησης (σημειωμένα με ○) παραμένουν επιτρεπτά όσο ένας άνθρωπος κρατά τον έλεγχο· τα μεταλλακτικά ρήματα απορρίπτονται.

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.

Οι συντεταγμένες είναι pixel του φιλοξενούμενου στην τρέχουσα λειτουργία του φιλοξενούμενου· κάθε στιγμιότυπο δηλώνει το μέγεθος της οθόνης. Οι συνδυασμοί πλήκτρων χρησιμοποιούν τη γραφή του X11 (ctrl+s, alt+Tab, Return).

Το clipboard_read δέχεται ένα selection: clipboard (ό,τι γεμίζει το ctrl+C, η προεπιλογή), primary (επιλογή-για-αντιγραφή του X11) ή xdnd (ένα σύρσιμο σε εξέλιξη). Ένα κενό αποτέλεσμα είναι κανονική απάντηση και για τα τρία. Το clipboard_write δέχεται μόνο text — οι εικόνες και τα αρχεία ταξιδεύουν στη δίοδο αρχείων, επειδή τα ορίσματα μιας ενέργειας διατηρούνται στο μητρώο ελέγχου και τα byte μιας εικόνας δεν έχουν καμία δουλειά εκεί. Το περιεχόμενο του προχείρου επιστρέφει περιφραγμένο ως μη αξιόπιστα δεδομένα.

navigate (μόνο http/https), reload (hard προαιρετικό), stop_loading, click (επιλογέας ή συντεταγμένη), fill, type, key (ονόματα πλήκτρων DOM), scroll, mouse_move, drag, left_mouse_down, left_mouse_up, extract○ (a11y | dom | console), screenshot○ (full_page προαιρετικό), set_viewport (ελάχιστο 320×240), history, wait_for○ (επιλογέας, 0.1–30 s), clipboard_read○, clipboard_write.

Το περιεχόμενο της εξαγόμενης σελίδας επιστρέφει περιφραγμένο ως μη αξιόπιστα δεδομένα.

Ο περιηγητής έχει ακριβώς ένα πρόχειρο, οπότε το clipboard_read δεν δέχεται selection. Και τα δύο ρήματα του προχείρου χρειάζονται ασφαλές περιβάλλον: μια σελίδα που σερβίρεται μέσω απλού http:// δεν έχει καθόλου API προχείρου, και το ρήμα το λέει αντί να αναφέρει ένα κενό — χρησιμοποιήστε εκεί το type, που εισάγει στο σημείο του κέρσορα χωρίς να περάσει από πρόχειρο.

tap, swipe (50–5000 ms), type, key (ψευδώνυμα back, home, recents, enter, delete, backspace, tab, escape, search, menu, volume_up, volume_down, power, ή οποιοδήποτε KEYCODE_*), screenshot○, ui_dump○, install_apk (περιορισμένο στο worktree του σταθμού και στον κατάλογο δεδομένων του διακομιστή), start_app, stop_app, clear_app_data, uninstall_app, open_url και shell. Το shell δέχεται μια λίστα argv και εκτελείται μέσα στο Android, ποτέ μέσω κελύφους του ξενιστή· καλύπτει διαγνωστικά προγραμματιστή όπως τα logcat, dumpsys και pm grant.

Το mobile_use δεν έχει ρήματα προχείρου. Από το Android 10, μόνο η εφαρμογή που έχει την εστίαση μπορεί να διαβάσει το πρόχειρο.

tap, swipe (50–5000 ms), type, key (enter, backspace, tab, escape, πλήκτρα βέλους ή έναν εκτυπώσιμο χαρακτήρα· προαιρετικούς τροποποιητές command, control, option και shift), home, lock, unlock, screenshot○, ui_dump○, install_app (ένας κατάλογος .app του προσομοιωτή, περιορισμένος στο worktree του σταθμού ή στον κατάλογο δεδομένων του διακομιστή), start_app, stop_app, uninstall_app, open_url και spawn. Το spawn δέχεται argv και εκτελεί μέσα στον προσομοιωτή μέσω simctl· δεν καλεί ποτέ κέλυφος του ξενιστή.

Οι συντεταγμένες είναι points της οθόνης iOS, όχι pixel του στιγμιότυπου. Η ζωντανή ροή διατηρεί το σταθερό μέγεθος του προσομοιωτή και τον τοποθετεί με letterbox αντί να αλλάξει το μέγεθος της συσκευής. Η μεταφορά κειμένου προχείρου από τον ξενιστή στον προσομοιωτή και αντίστροφα χρησιμοποιεί την ίδια πολιτική άδειας ανά χρήστη και ανά κατεύθυνση όπως οι άλλοι σταθμοί· αρχεία και εικόνες δεν γίνονται δεκτά από τη δίοδο pasteboard του iOS.

Κάθε σταθμός δημιουργεί μια συσκευή CoreSimulator που του ανήκει και μια συνεδρία WebDriverAgent. Το κλείσιμό του σταματά το WebDriverAgent, τερματίζει και διαγράφει αυτή τη συσκευή και αφαιρεί την καταχώρισή της από το μητρώο. Οι σταθμοί iOS εκτελούνται μόνο σε διακομιστή macOS με Xcode, εγκατεστημένο runtime iOS και την καθηλωμένη γέφυρα αυτοματοποίησης. Δεν παρέχουν εγγύηση για ήχο, μικρόφωνο, απόθεση αρχείων, κέλυφος ξενιστή ή περίκλειστο δίκτυο.

Εργαλείο Περιγραφή
rig_list Παραθέτει τους σταθμούς ενός χώρου εργασίας με επιφάνεια, κατάσταση, οθόνη και ελεγκτή
rig_close Καταστρέφει έναν σταθμό και απορρίπτει τον δίσκο του
Φάση Σημασία
provisioning Εκκίνηση· η λεπτομέρεια κατάστασης μεταφέρει το τρέχον βήμα αυτολεξεί
ready Προσβάσιμος και δέχεται ενέργειες
parked Σε παύση αδράνειας: οι vCPU σταματούν, η RAM παραμένει στη μνήμη· η επόμενη ενέργεια τον ξυπνά
closing Τερματισμός
closed Έφυγε· η εγγραφή επιβιώνει για το ίχνος ελέγχου
failed Πέθανε ή δεν ξεκίνησε ποτέ· ξεχωρίζει ώστε η διεπαφή να μπορεί να προσφέρει επανάληψη
Αιτία κλεισίματος Ενεργοποιείται όταν
requested Το ζήτησε ένας άνθρωπος ή ένας πράκτορας
idleTimeout Αδράνεια πέραν του διπλάσιου του παραθύρου αδράνειας, ή αποβολή λόγω μνήμης
ttlExpired Εξαντλήθηκε η σκληρή διάρκεια ζωής
conversationEnded Η συνομιλία που τον κατέχει τερματίστηκε
workspaceGone Ο χώρος εργασίας διαγράφηκε ή χάθηκε η ιδιότητα μέλους
serverShutdown Ο διακομιστής σταματά
backendFailure Ο υπερεπόπτης πέθανε από κάτω του
Τιμή Τερματικό Περιηγητής Υπολογιστής Κινητό
Μνήμη 512 MB 2048 MB (Chromium)· 2560 MB (Firefox, WebKit) 4096 MB 4096 MB
vCPUs 2 2 4 4
Σκληρό TTL 8 h 2 h 2 h 2 h
Παράθυρο αδράνειας 45 min 15 min 15 min 15 min
Οθόνη εκκίνησης — 1280×800 1280×800 1080×1920
  • Οι ακίνητες εικόνες της διόδου του πράκτορα έχουν ανώτατο όριο 1280×800· η ανθρώπινη δίοδος διαπραγματεύεται έως 2560×1600.
  • Ο προϋπολογισμός μνήμης που παραμένει δεσμευμένη στον ξενιστή για όλους τους σταθμούς έχει προεπιλογή 12 GB, μετρημένο σε megabyte που παραμένουν δεσμευμένα (μια σταθμευμένη VM κρατά ακόμη τη RAM της). Η αποβολή γίνεται με κριτήριο τη λιγότερο πρόσφατη χρήση και δεν παίρνει ποτέ μια μηχανή που κάποιος οδηγεί, παρακολουθεί ή έχει ανοιχτό τερματικό μέσα της.
  • Ένα ανοιχτό τερματικό ή μια δίοδος παρακολούθησης καθηλώνει τον σταθμό ώστε να μην παρκάρει και να μη συγκομίζεται λόγω αδράνειας· το σκληρό TTL ισχύει ακόμη.
Θύρα Πού Δεσμευμένη για
7911 Φιλοξενούμενο τερματικού Τον πολυπλέκτη θυρών πάνω στον οποίο ταξιδεύει κάθε προώθηση
9222, 9223 Φιλοξενούμενο περιηγητή Το ρελέ και το τελικό σημείο αυτοματοποίησης (το WebKit δεσμεύει απευθείας το 9222 και δεν χρησιμοποιεί ρελέ)
80, 443 Loopback φιλοξενούμενου περιηγητή Τις διόδους HTTP/HTTPS των domains ανάπτυξης
  • Η ανακάλυψη δειγματοληπτεί τις θύρες TCP σε ακρόαση του φιλοξενούμενου τερματικού κάθε ~4 s, στην πλευρά του διακομιστή.
  • Το πολύ 16 θύρες προωθούνται αυτόματα ανά σταθμό· περισσότερες καταγράφονται στο αρχείο καταγραφής, δεν προωθούνται.
  • Η προώθηση στην πλευρά του ξενιστή δεσμεύει loopback, προτιμώντας τον ίδιο αριθμό θύρας του φιλοξενούμενου· η Κοινή χρήση στο τοπικό δίκτυο προσθέτει μια θύρα LAN που εκχωρεί το λειτουργικό σύστημα.
  • Τα domains ανάπτυξης πρέπει να ταιριάζουν με name.test ή name.localhost (πεζά, ετικέτα έως 63 χαρακτήρες). Ένα domain αντιστοιχίζεται σε μία θύρα.
  • Το HTTPS των domains ανάπτυξης χρησιμοποιεί μια τοπική για τον διακομιστή αρχή έκδοσης πιστοποιητικών (EC P-256, κάτω από <dataDir>/rigs/tls/, κλειδιά 0600 και ποτέ μέσα σε φιλοξενούμενο) με ένα φύλλο μπαλαντέρ για *.test / *.localhost. Χωρίς openssl στον ξενιστή δεν υπάρχει δίοδος HTTPS· το απλό HTTP δρομολογείται ακόμη.
Επιφάνεια Προεπιλεγμένη λίστα επιτρεπόμενων
Τερματικό Η βασική γραμμή του προγραμματιστή στο sandbox (κεντρικοί υπολογιστές κώδικα, μητρώα πακέτων, πάροχοι μοντέλων) + οι καθρέφτες apt του Ubuntu + ο δικός του κεντρικός υπολογιστής κώδικα του worktree
Περιηγητής usectrl.dev (ο ιστότοπος του προϊόντος) — συν τα αποθετήρια Debian στην πρώτη εκκίνηση κάθε μηχανής, όσο εγκαθιστά τα πακέτα της. Η αρχική σελίδα είναι ένα τοπικό έγγραφο file:// και δεν χρειάζεται εξερχόμενη κίνηση
Υπολογιστής Κενή — απόρριψη όλων — μέχρι ο καλών να παραχωρήσει κεντρικούς υπολογιστές
Κινητό Δεν επιβάλλεται (δικτύωση διαχειριζόμενη από τον εξομοιωτή)

Κάθε microVM παίρνει επιπλέον τους κεντρικούς υπολογιστές του registry της εικόνας του, μόνο για το pull. Το σύνολο επιτρεπόμενων κεντρικών υπολογιστών του μεσίτη διαπιστευτηρίων προκύπτει από την ίδια λίστα επιτρεπόμενων: δεν εκδίδεται token για κεντρικό υπολογιστή που το φιλοξενούμενο δεν μπορεί να προσεγγίσει.

Και οι δύο κατευθύνσεις αντιγραφής/επικόλλησης, καθώς και το σύρσιμο αρχείων μέσα και έξω. Διαθέσιμα σε έναν άνθρωπο που οδηγεί έναν σταθμό· ένας πράκτορας παίρνει το πρόχειρο μέσα από τα παραπάνω ρήματα και καμία μεταφορά αρχείων (έχει ήδη ένα κέλυφος μέσα στο περίβλημα).

Η διέλευση του προχείρου είναι ανά χρήστη και ανά κατεύθυνση. Η επικόλληση από τον ξενιστή στον σταθμό επιτρέπεται εξ ορισμού· η αντιγραφή από τον σταθμό στον ξενιστή ζητά επιβεβαίωση (παραχώρηση δέκα λεπτών ή «Να επιτρέπεται πάντα» στις Ρυθμίσεις → Διακομιστής → Σταθμοί → Πρόσβαση στο πρόχειρο). Οι δύο επιλογές είναι ανεξάρτητες και δεν αποτελούν ποτέ ρύθμιση χώρου εργασίας.

Δίοδος Διαδρομή Μεταφέρει
Πρόχειρο GET/POST /rig/clipboard/<rigId> Κείμενο, ένα PNG/JPEG (≤16 MB) και τις διαδρομές των αρχείων στο πρόχειρο μέσα στο φιλοξενούμενο
Αρχεία POST /rig/files/<rigId> Έως 64 αρχεία, ≤256 MB το καθένα και ≤512 MB ανά απόθεση, με προαιρετικό σημείο απόθεσης σε pixel του φιλοξενούμενου
Αρχεία GET /rig/files/<rigId>?p=<base64url path> Τα byte ενός αρχείου, προς τα έξω
  • HTTP, όχι RPC. Η υποδοχή RPC κλείνει μια σύνδεση σε εισερχόμενο πλαίσιο πάνω από 256 KB — έναν φραγμό DoS σωστό για εντολές JSON και θανάσιμο για ένα επικολλημένο στιγμιότυπο. Τα byte ταξιδεύουν στο ίδιο είδος διαδρομής που χρησιμοποιούν ήδη τα καρέ των σταθμών και ο ήχος των συσκέψεων.
  • Επαλήθευση ταυτότητας είναι ο υπογεγραμμένος στόχος rig-files:<workspaceId>/<rigId> συν η ιδιότητα μέλους του χώρου εργασίας — ένας δικός του στόχος, ώστε ένα URL που εκδόθηκε για να παρακολουθεί μια μηχανή να μην μπορεί επίσης να γράψει αρχεία μέσα της.
  • Η ανάληψη ελέγχου ισχύει. Η εγγραφή στο πρόχειρο και η απόθεση αρχείων είναι μεταλλακτικές και απορρίπτονται όσο κάποιος άλλος κρατά τον έλεγχο· η ανάγνωση του προχείρου και η ανάγνωση ενός αρχείου προς τα έξω είναι παρατήρηση και δεν απορρίπτονται.
  • Πού προσγειώνονται οι αποθέσεις: ~/Drops (επιφάνεια εργασίας), ~/drops (τερματικό — δίπλα στο worktree, ποτέ μέσα του, ώστε μια απόθεση να μην εμφανίζεται ποτέ ως μη παρακολουθούμενη αλλαγή), /tmp/cc-drops (περιηγητής). Ο διακομιστής επιλέγει τον κατάλογο· ο καλών δεν μπορεί να τον ονομάσει. Τα υπάρχοντα αρχεία δεν αντικαθίστανται ποτέ — ένα όνομα που συγκρούεται προσγειώνεται ως 2-name.ext.
  • Τι μαθαίνει το φιλοξενούμενο: μια σελίδα περιηγητή λαμβάνει ένα πραγματικό συμβάν απόθεσης στο ζητούμενο σημείο (Input.dispatchDragEvent)· μια επιφάνεια εργασίας παίρνει τα αρχεία μαζί με τα URI τους στο πρόχειρό της, επειδή κανένας ξενιστής δεν μπορεί να συνθέσει σύρσιμο XDND μέσα σε μια αυθαίρετη εργαλειοθήκη χωρίς προνομιούχο δαίμονα μέσα στο φιλοξενούμενο. Η απάντηση δηλώνει ποιο από τα δύο συνέβη.
  • Το σύρσιμο προς τα έξω λειτουργεί μόνο στην επιφάνεια εργασίας και διαβάζει το XdndSelection του φιλοξενούμενου όσο ένα σύρσιμο είναι σε εξέλιξη. Ένα φορτίο πανομοιότυπο με αυτό που κρατούσε ήδη το φιλοξενούμενο όταν άρχισε το πάτημα αντιμετωπίζεται ως παρωχημένη επιλογή από ένα ολοκληρωμένο σύρσιμο, όχι ως νέα — το X δεν έχει βήμα «το σύρσιμο τελείωσε».
  • Απαιτήσεις εικόνας: η εικόνα της επιφάνειας εργασίας πρέπει να είναι πρωτοκόλλου 2 ή νεότερου (κατασκευασμένη αφού προστέθηκε η υποστήριξη προχείρου). Μια παλαιότερη εικόνα απαντά 404 και η εφαρμογή λέει να την ξαναχτίσετε αντί να αναφέρει μια χαλασμένη μηχανή.
  • Το μητρώο ελέγχου καταγράφει το σχήμα, ποτέ το περιεχόμενο: οι εγγραφές των clipboard_read, clipboard_write, drop_files και read_file μεταφέρουν πλήθη, μεγέθη και διαδρομές. Ένα πρόχειρο είναι το μέρος όπου τα διαπιστευτήρια ζουν για λίγα δευτερόλεπτα κάθε φορά, και τίποτα από αυτά δεν γράφεται.
  • Τα εργαλεία σταθμών δηλώνουν την κατηγορία ενεργειών enclosureControl (συν networkEgress και processSpawn στα εργαλεία χρήσης· τα mobile_use και ios_use δηλώνουν επίσης packageInstall). Το rig_close δηλώνει enclosureControl· το rig_list δεν δηλώνει καμία. Επιτρέπεται εξ ορισμού· οι λειτουργίες μόνο για ανάγνωση την αρνούνται στο σύνολό της· ο δείκτης αυτονομίας ανά χώρο μπορεί να την υποβιβάσει σε «ρώτα πρώτα».
  • Γεγονότα τομέα: RigClosedEvent (με την αιτία κλεισίματός του), RigControlChanged (ανάληψη ελέγχου / επιστροφή ελέγχου), RigReaped (συγκομιδή λόγω αδράνειας, TTL ή μνήμης, μαζί με τον πράκτορα που το οδηγούσε). Το άνοιγμα ενός σταθμού δεν είναι γεγονός. Δείτε τα γεγονότα τομέα.
  • Αποθήκευση: rig_sessions και rig_action_log στη βάση δεδομένων κάθε χώρου εργασίας. Το αρχείο καταγραφής ενεργειών καταγράφει κάθε συμβάν εισόδου με την οντότητα που το προκάλεσε και μια μονότονη ακολουθία ανά σταθμό· το κείμενο που πληκτρολογήθηκε αποκρύπτεται σε ένα μήκος και ένα hash πριν γραφτεί.
  • Κατάλογος δεδομένων: rigs/images/ (εισηγμένες εικόνες qcow2), rigs/smolvm/ (κατάσταση χρόνου εκτέλεσης ανά σταθμό), rigs/smolvm-packs/ (προ-εξαγμένα πακέτα μηχανής), rigs/tls/ (η αρχή έκδοσης πιστοποιητικών των domains ανάπτυξης), rigs/run/ (overlay και seeds του QEMU).
  • Διαδρομές: η ζωντανή προβολή είναι μια καρτέλα σε έναν χώρο ή σε μια σελίδα PR· το /settings/server/rigs είναι η οθόνη ρυθμίσεων των Σταθμών.