ข้ามไปยังเนื้อหา

ริก

ข้อเท็จจริงเท่านั้น สำหรับโมเดลที่อยู่เบื้องหลังสิ่งเหล่านี้ อ่าน ริกและเอนโคลเจอร์ ส่วนการเปิดเครื่อง ทำตาม คู่มือวิธีทำ

พื้นผิว ขับเคลื่อน แบ็กเอนด์ ค่า เอเกรสที่ถูกกักไว้
เทอร์มินัล (exec) เชลล์บนช่องทาง exec ของ VM microVM smolvm ใช่
เบราว์เซอร์ 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 Simulator ผ่าน WebDriverAgent CoreSimulator ios-simulator ไม่ — เครือข่ายตามโฮสต์ Mac

เทอร์มินัลและพื้นผิว computer_use ใช้ค่า computer ร่วมกัน พื้นผิวเทอร์มินัล แยกแยะได้ด้วยมาร์กเกอร์อิมเมจ exec ของมัน และไม่เคยถูกนำกลับมาใช้เป็นเดสก์ท็อป ที่ขับเคลื่อนได้ (หรือในทางกลับกัน) การสนทนาหนึ่งรายการใช้เครื่องเทอร์มินัล เครื่องเดิมซ้ำ

เอ็นจิน ค่า โปรโตคอล มุมมองสด ภาพนิ่ง
Chromium chromium (ค่าเริ่มต้น) Chrome DevTools Protocol สกรีนแคสต์ — เบราว์เซอร์พุชเฟรมเมื่อหน้าเว็บวาดใหม่ JPEG
Firefox firefox WebDriver BiDi ภาพนิ่งแบบดึงเป็นระยะ (BiDi ไม่มีสกรีนแคสต์) จำกัดที่ 6 fps JPEG
WebKit webkit W3C WebDriver (แบบดั้งเดิม) ภาพนิ่งแบบดึงเป็นระยะ ทรานสโคดโดย ffmpeg ของโฮสต์ PNG

ริกหนึ่งตัวรันเอ็นจิน เดียว ตลอดอายุของมัน การสนทนาหนึ่งรายการถือริกได้ หนึ่งตัวต่อเอ็นจิน ซึ่งเป็นสิ่งที่ทำให้การเปรียบเทียบแบบเคียงข้างกันเป็นไปได้: การเปิด “Firefox (VM)” ข้าง ๆ “Chromium (VM)” คือสองเครื่อง และการปิด เครื่องหนึ่งจะเหลืออีกเครื่องรันอยู่

ส่ง engine ให้ rig.open หรือเครื่องมือ browser_use ชื่อที่ไม่รู้จักจะถูก ปฏิเสธแทนที่จะใช้ค่าเริ่มต้น — การขอเบราว์เซอร์ตัวหนึ่งแล้วได้อีกตัวหนึ่งอย่าง เงียบ ๆ เท่ากับตอบคำถามเรื่องความเข้ากันได้ด้วยคำตอบที่ผิด

ขีดจำกัดเฉพาะเอ็นจิน ที่ระบุไว้ตรง ๆ แทนที่จะหาทางเลี่ยง:

  • Firefox ไม่มีการโหลดซ้ำที่ข้ามแคช (มันปฏิเสธ ignoreCache ของ BiDi ไปเลย) การโหลดซ้ำแบบ hard จึงเป็นการโหลดซ้ำปกติ
  • WebKit ก็ไม่มีการโหลดซ้ำที่ข้ามแคชเช่นกัน ไม่มีฟีดคอนโซล (เอาต์พุตถูกจับ โดยการฮุก console.* หลังการนำทางแต่ละครั้ง สิ่งใดก็ตามที่บันทึกระหว่างโหลด จึงถูกมองข้าม — การสกัดคอนโซลทุกครั้งบอกไว้เช่นนั้น) และต้องมี ffmpeg บนโฮสต์สำหรับมุมมองสดของมัน
  • ทั้งคู่ ไม่เปิดเผยทรีการเข้าถึงของแพลตฟอร์มผ่านโปรโตคอลของตัวเอง extract (a11y) จึงคืนค่าประมาณที่ได้มาจาก DOM พร้อมติดป้ายกำกับไว้เช่นนั้น
  • ทั้งคู่ รับการดรอปไฟล์จริงไม่ได้ แต่อินพุตไฟล์ยังชี้ไปที่พาธภายในเครื่องได้
พื้นผิว อิมเมจ ดึงเมื่อ
เทอร์มินัล ubuntu:24.04 ปักหมุดด้วยไดเจสต์ อัตโนมัติเมื่อบูตครั้งแรก ผ่านเครือข่ายที่ถูกกักของเครื่องเอง
เบราว์เซอร์ (Chromium, Firefox, WebKit) debian:trixie-slim ปักหมุดด้วยไดเจสต์ บวกแพ็กเกจของเอ็นจินเอง อัตโนมัติเมื่อบูตครั้งแรก จากนั้นแคชเป็นแพ็กที่อุ่นไว้
คอมพิวเตอร์ อิมเมจเดสก์ท็อป qcow2 ที่มี Chromium, Firefox, WebKit และพื้นฐาน CLI แบบรันเนอร์ที่โฮสต์บน GitHub ชุดเดียวกับที่เทอร์มินัลอุ่นไว้ นำเข้า ที่ การตั้งค่า → เซิร์ฟเวอร์ → ริก (ดาวน์โหลดที่ปักหมุดด้วยเช็กซัมเมื่อมีการเผยแพร่)
Android อิมเมจระบบของ Google ผ่าน Android SDK
iOS รันไทม์ของ Xcode Simulator บวก WebDriverAgent ที่ปักหมุดด้วยเช็กซัม รันไทม์ผ่าน Xcode; บริดจ์ระบบอัตโนมัติจาก การตั้งค่า → เซิร์ฟเวอร์ → ริก

หลังการบูตครั้งแรกของ microVM แต่ละชนิด เซิร์ฟเวอร์จะแคชสำเนาที่แตกไฟล์ไว้ ล่วงหน้าไว้ใต้ไดเรกทอรีข้อมูล แล้วบูตเครื่องถัด ๆ ไปทั้งหมดจากสำเนานั้น — รวมถึง อิมเมจที่อุ่นไว้ล่วงหน้าซึ่งมีแพ็กเกจติดตั้งอยู่แล้ว เทอร์มินัลจะอุ่นชุดเครื่องมือ CLI แบบรันเนอร์ที่โฮสต์บน GitHub (git, gcc, python3, jq, rsync เครื่องมือจัดการไฟล์เก็บถาวร และพื้นฐาน apt ที่เหลือ; ไม่ใช่ Docker หรือแคช เครื่องมือภาษา) อิมเมจ 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 อิมเมจของ Terminal (VM)
rigs.smolvm.browserImage อิมเมจของ Chromium Browser (VM)

เขียนผ่านที่เก็บการตั้งค่าเวิร์กสเปซที่กั้นด้วยสิทธิ์ผู้ดูแล (การตั้งค่า → เซิร์ฟเวอร์ → ริก → อิมเมจที่กำหนดเอง (เวิร์กสเปซนี้)) ค่าต้องเป็นเรฟเฟอเรนซ์ ของรีจิสทรี — พาธภายในเครื่อง ไฟล์เก็บถาวร และสตริงที่คล้ายแฟล็กจะถูกปฏิเสธ ทั้งที่ฟิลด์และอีกครั้งตอนบูต ค่าที่จัดเก็บไว้ไม่ถูกต้องจะถูกละเว้นอย่างเปิดเผย และค่าเริ่มต้นจะบูตแทน รีจิสทรีของอิมเมจเอง (บวกคู่หู blob-CDN ที่รู้จักสำหรับ Docker Hub, GHCR, Quay, GitLab และ GCR) จะถูกอนุญาตผ่านประตูเอเกรสสำหรับการดึง

สัญญาของอิมเมจเทอร์มินัล — มี bash; ติดตั้ง git, curl, socat มาแล้ว หรือ มีฐาน apt ของ Debian/Ubuntu (เอนโคลเจอร์จะติดตั้งสามตัวนั้นบวกชุด เครื่องมือ CLI แบบรันเนอร์ที่โฮสต์บน GitHub ตอนเริ่มครั้งแรก: คอมไพเลอร์, Python 3, jq, เครื่องมือจัดการไฟล์เก็บถาวร, rsync ไม่มีการติดตั้งแคช เครื่องมือภาษาและ Docker)

สัญญาของอิมเมจเบราว์เซอร์ — ฐาน apt ของ Debian/Ubuntu (หรือแพ็กเกจที่ ติดตั้งอยู่แล้ว) ที่มี bash และ socat บวกไบนารี chromium ที่เซิร์ฟเวอร์ เรียกเองเป็น chromium --headless=new โดยมี DevTools บนลูปแบ็กของเกสต์ 9223 ส่งต่อไปยังพอร์ตเกสต์ 9222 ติดตั้ง PulseAudio และ ffmpeg ตอนเริ่มครั้งแรก สำหรับเลนเสียง อย่าบิลด์ FROM chromedp/headless-shell: headless.gn ต้นน้ำ คอมไพล์ทั้ง ALSA และ PulseAudio ออกไป ไบนารีนั้นจึงส่งเสียงไม่ได้ การแทนที่นี้ ใช้กับ ริก Chromium เท่านั้น — คำสั่งเวิร์กโหลดที่มันบูตเป็นของ Chromium และการส่งมันให้ Firefox หรือ WebKit จะเรียกไบนารีที่ไม่มีอยู่ ริก Firefox หรือ WebKit จะละเว้นมันอย่างเปิดเผยและบูตอิมเมจที่ปักหมุดของตัวเอง

พอร์ตระบบอัตโนมัติ — เครื่องเบราว์เซอร์ทุกเครื่องส่งต่อพอร์ตลูปแบ็กของโฮสต์ หนึ่งพอร์ตพอดีไปยังเกสต์ 9222 เบื้องหลังมัน: DevTools ของ Chromium และ รีโมตเอเจนต์ของ Firefox อยู่บนลูปแบ็กของเกสต์ 9223 โดยมีรีเลย์ socat อยู่ข้างหน้า (ทั้งคู่ผูกกับลูปแบ็กโดยไม่มีเงื่อนไข) ส่วนไดรเวอร์ของ WebKit รับ --host และผูกกับ NIC ของเกสต์เอง 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 วินาที), type, wait○ (0–60 วินาที), set_display, clipboard_read○, clipboard_write

พิกัดเป็นพิกเซลของเกสต์ในโหมดปัจจุบันของเกสต์ ภาพหน้าจอทุกภาพระบุขนาด จอแสดงผล คีย์ผสมใช้การสะกดแบบ X11 (ctrl+s, alt+Tab, Return)

clipboard_read รับ selection: clipboard (สิ่งที่ ctrl+C เติม ค่าเริ่มต้น), primary (เลือกเพื่อคัดลอกของ X11) หรือ xdnd (การลากที่กำลังดำเนินอยู่) ผลลัพธ์ว่างเปล่าเป็นคำตอบปกติสำหรับทั้งสามแบบ clipboard_write รับเฉพาะ text — รูปภาพและไฟล์เดินทางบนเลนไฟล์ เพราะอาร์กิวเมนต์ของการกระทำถูกบันทึก ลงบันทึกการตรวจสอบ และไบต์ของรูปภาพไม่ควรอยู่ที่นั่น เนื้อหาคลิปบอร์ดถูกส่ง กลับมาพร้อมล้อมกรอบเป็นข้อมูลที่ไม่น่าเชื่อถือ

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 วินาที), clipboard_read○, clipboard_write

เนื้อหาหน้าเว็บที่สกัดได้จะถูกส่งกลับมาพร้อมล้อมกรอบเป็นข้อมูลที่ไม่น่าเชื่อถือ

เบราว์เซอร์มีคลิปบอร์ดเพียงอันเดียว clipboard_read จึงไม่รับ selection คำกริยาคลิปบอร์ดทั้งสองต้องมี บริบทที่ปลอดภัย: หน้าที่ให้บริการผ่าน http:// ธรรมดาไม่มี Clipboard API เลย และคำกริยาจะบอกเช่นนั้นแทนที่จะ รายงานว่าว่างเปล่า — ใช้ type ในกรณีนั้น ซึ่งแทรกที่เคอร์เซอร์โดยไม่ผ่าน คลิปบอร์ด

tap, swipe (50–5000 มิลลิวินาที), 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 มิลลิวินาที), 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; มันไม่เคยเรียกเชลล์ของโฮสต์

พิกัดเป็น พอยต์ ของหน้าจอ iOS ไม่ใช่พิกเซลของภาพหน้าจอ สตรีมสดคงขนาดคงที่ ของโปรแกรมจำลองและใส่แถบดำรอบ ๆ แทนที่จะปรับขนาดอุปกรณ์ การถ่ายโอนคลิปบอร์ด ข้อความจากโฮสต์ไปยังโปรแกรมจำลองและจากโปรแกรมจำลองไปยังโฮสต์ใช้นโยบาย การอนุญาตรายผู้ใช้ รายทิศทางเดียวกับริกอื่น ๆ ไฟล์และรูปภาพไม่ได้รับการยอมรับ โดยเลนเพสต์บอร์ดของ iOS

ริกแต่ละตัวสร้างอุปกรณ์ CoreSimulator และเซสชัน WebDriverAgent ที่เป็นเจ้าของเอง การปิดมันจะหยุด WebDriverAgent ปิดและลบอุปกรณ์นั้น และลบรายการในรีจิสทรีของมัน ริก iOS รันได้เฉพาะบนเซิร์ฟเวอร์ macOS ที่มี Xcode รันไทม์ iOS ที่ติดตั้งแล้ว และบริดจ์ระบบอัตโนมัติที่ปักหมุดไว้ พวกมันไม่ให้การรับประกันเรื่องเสียง ไมโครโฟน การดรอปไฟล์ เชลล์ของโฮสต์ หรือเครือข่ายแบบปิดล้อม

เครื่องมือ คำอธิบาย
rig_list แสดงรายการริกของเวิร์กสเปซพร้อมพื้นผิว สถานะ จอแสดงผล และผู้ควบคุม
rig_close ทำลายริกและทิ้งดิสก์ของมัน
เฟส ความหมาย
provisioning กำลังบูต; รายละเอียดสถานะบอกขั้นตอนปัจจุบันตามจริง
ready เข้าถึงได้และรับการกระทำ
parked จอดเพราะว่าง: หยุด vCPU แต่ RAM ยังอยู่ในหน่วยความจำ; การกระทำถัดไปจะปลุกมัน
closing กำลังปิด
closed จากไปแล้ว; แถวยังคงอยู่เพื่อบันทึกการตรวจสอบ
failed ตายหรือไม่เคยขึ้นมา; แยกแยะได้เพื่อให้ UI เสนอการลองใหม่
เหตุผลการปิด เกิดขึ้นเมื่อ
requested มีคนหรือเอเจนต์ขอ
idleTimeout ว่างเกิน 2 เท่าของช่วงเวลาว่าง หรือถูกขับออกเพราะหน่วยความจำ
ttlExpired อายุการใช้งานแบบตายตัวหมดลง
conversationEnded การสนทนาที่เป็นเจ้าของสิ้นสุดลง
workspaceGone เวิร์กสเปซถูกลบหรือสูญเสียสมาชิกภาพ
serverShutdown เซิร์ฟเวอร์กำลังหยุด
backendFailure ไฮเปอร์ไวเซอร์ที่อยู่ข้างใต้ตายลง
ค่า เทอร์มินัล เบราว์เซอร์ คอมพิวเตอร์ มือถือ
หน่วยความจำ 512 MB 2048 MB (Chromium); 2560 MB (Firefox, WebKit) 4096 MB 4096 MB
vCPU 2 2 4 4
TTL แบบตายตัว 8 ชั่วโมง 2 ชั่วโมง 2 ชั่วโมง 2 ชั่วโมง
ช่วงเวลาว่าง 45 นาที 15 นาที 15 นาที 15 นาที
จอแสดงผลตอนบูต — 1280×800 1280×800 1080×1920
  • ภาพนิ่งของเลนเอเจนต์ถูกจำกัดที่ 1280×800; เลนมนุษย์เจรจาได้ถึง 2560×1600
  • งบหน่วยความจำที่อยู่ในหน่วยความจำของโฮสต์สำหรับริกทั้งหมดมีค่าเริ่มต้นที่ 12 GB นับเป็นเมกะไบต์ที่อยู่ในหน่วยความจำ (VM ที่จอดไว้ยังคงถือ RAM ของมันไว้) การขับออกใช้หลักใช้ล่าสุดน้อยที่สุด และไม่เคยเอาเครื่องที่มีคนขับอยู่ กำลังดูอยู่ หรือมีเทอร์มินัลเปิดค้างอยู่ในนั้น
  • เทอร์มินัลที่เปิดอยู่หรือเลนเฝ้าดูจะตรึงริกไว้ไม่ให้ถูกจอดและไม่ให้ถูกเก็บกวาด เพราะว่าง; TTL แบบตายตัวยังคงมีผล
พอร์ต ที่ไหน สงวนไว้สำหรับ
7911 เกสต์เทอร์มินัล มัลติเพล็กเซอร์พอร์ตที่การส่งต่อทุกครั้งวิ่งอยู่บนนั้น
9222, 9223 เกสต์เบราว์เซอร์ รีเลย์และเอนด์พอยต์ของระบบอัตโนมัติ (WebKit ผูก 9222 โดยตรงและไม่ใช้รีเลย์)
80, 443 ลูปแบ็กของเกสต์เบราว์เซอร์ เลน HTTP/HTTPS ของโดเมนสำหรับพัฒนา
  • การค้นหาจะโพลพอร์ต TCP ที่รอรับการเชื่อมต่อของเกสต์เทอร์มินัลทุก ~4 วินาที ฝั่งเซิร์ฟเวอร์
  • ส่งต่อพอร์ตอัตโนมัติได้ไม่เกิน 16 พอร์ตต่อริก; พอร์ตที่มากกว่านั้นจะถูก แสดงในบันทึกแต่ไม่ถูกส่งต่อ
  • การส่งต่อฝั่งโฮสต์ผูกกับลูปแบ็ก โดยเลือกใช้หมายเลขพอร์ตของเกสต์เองก่อน; แชร์บนเครือข่ายภายใน จะเพิ่มพอร์ต LAN ที่ OS กำหนดให้
  • โดเมนสำหรับพัฒนาต้องตรงกับ name.test หรือ name.localhost (ตัวพิมพ์เล็ก ป้ายชื่อยาวไม่เกิน 63 อักขระ) หนึ่งโดเมนแมปกับหนึ่งพอร์ต
  • HTTPS ของโดเมนสำหรับพัฒนาใช้ CA ที่อยู่ในเครื่องเซิร์ฟเวอร์ (EC P-256 ใต้ <dataDir>/rigs/tls/ กุญแจ 0600 และไม่เคยอยู่ในเกสต์) โดยมีใบรับรองปลายทาง แบบไวลด์การ์ดหนึ่งใบสำหรับ *.test / *.localhost หากโฮสต์ไม่มี openssl ก็จะไม่มีเลน HTTPS; HTTP ธรรมดายังคงกำหนดเส้นทางได้
พื้นผิว รายการที่อนุญาตตามค่าเริ่มต้น
เทอร์มินัล พื้นฐานสำหรับนักพัฒนาในแซนด์บ็อกซ์ (โฮสต์โค้ด รีจิสทรีแพ็กเกจ ผู้ให้บริการโมเดล) + มิเรอร์ apt ของ Ubuntu + โฮสต์โค้ดของ worktree เอง
เบราว์เซอร์ usectrl.dev (ไซต์ของผลิตภัณฑ์) — บวกไฟล์เก็บถาวรของ Debian ตอนบูตครั้งแรกของเอ็นจินทุกตัว ขณะติดตั้งแพ็กเกจของมัน หน้าแรกเป็นเอกสาร file:// ภายในเครื่องและไม่ต้องใช้เอเกรส
คอมพิวเตอร์ ว่างเปล่า — ปฏิเสธทุกอย่าง — จนกว่าผู้เรียกจะอนุญาตโฮสต์
มือถือ ไม่ได้บังคับใช้ (เครือข่ายที่โปรแกรมจำลองจัดการ)

microVM ทุกตัวยังได้รับโฮสต์ของรีจิสทรีอิมเมจของมันเพิ่มเติม สำหรับการดึงเท่านั้น ชุดโฮสต์ที่อนุญาตของโบรกเกอร์ข้อมูลรับรองมาจากรายการที่อนุญาตชุดเดียวกัน: จะไม่มีการออกโทเค็นให้โฮสต์ที่เกสต์ไปไม่ถึง

การคัดลอก/วางทั้งสองทิศทาง และการลากไฟล์เข้า–ออก ใช้ได้สำหรับคนที่ขับริกอยู่; เอเจนต์ได้คลิปบอร์ดผ่านคำกริยาข้างต้นและไม่ได้การถ่ายโอนไฟล์เลย (มันมีเชลล์อยู่ ในเอนโคลเจอร์อยู่แล้ว)

การข้ามขอบเขตของคลิปบอร์ดเป็นรายผู้ใช้และรายทิศทาง การวางจากโฮสต์เข้าริก ได้รับอนุญาตโดยค่าเริ่มต้น; การคัดลอกจากริกออกไปยังโฮสต์จะถามก่อน (ให้สิทธิ์ สิบนาที หรืออนุญาตเสมอที่ การตั้งค่า → เซิร์ฟเวอร์ → ริก → การเข้าถึงคลิปบอร์ด) ตัวเลือกทั้งสองเป็นอิสระต่อกันและไม่เคยเป็นการตั้งค่าระดับเวิร์กสเปซ

เลน เส้นทาง สิ่งที่บรรทุก
คลิปบอร์ด GET/POST /rig/clipboard/<rigId> ข้อความ รูป PNG/JPEG หนึ่งรูป (≤16 MB) และพาธในเกสต์ของไฟล์บนคลิปบอร์ด
ไฟล์ POST /rig/files/<rigId> ไฟล์ได้ถึง 64 ไฟล์ ไฟล์ละ ≤256 MB และไม่เกิน 512 MB ต่อการดรอป พร้อมจุดดรอปแบบพิกเซลของเกสต์ที่ไม่บังคับ
ไฟล์ GET /rig/files/<rigId>?p=<base64url path> ไบต์ของไฟล์หนึ่งไฟล์ ดึงกลับออกมา
  • HTTP ไม่ใช่ RPC ซ็อกเก็ต RPC จะปิดการเชื่อมต่อเมื่อมีเฟรมขาเข้าที่เกิน 256 KB — ด่านกัน DoS ที่เหมาะกับคำสั่ง JSON แต่เป็นอันตรายถึงตายสำหรับ ภาพหน้าจอที่วางมา ไบต์วิ่งบนเส้นทางชนิดเดียวกับที่เฟรมริกและเสียงการประชุม ใช้อยู่แล้ว
  • การยืนยันตัวตน ใช้ทาร์เก็ตที่ลงนามแล้ว 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 บนเครื่องมือ use; mobile_use และ ios_use ยังประกาศ packageInstall ด้วย) rig_close ประกาศ enclosureControl; rig_list ไม่ประกาศเลย อนุญาตโดยค่าเริ่มต้น; โหมดอ่านอย่างเดียวปฏิเสธทั้งหมด; ปุ่มปรับความเป็นอิสระต่อสเปซสามารถลดระดับให้เป็นถามก่อนได้
  • เหตุการณ์โดเมน: RigClosedEvent (พร้อมเหตุผลการปิด), RigControlChanged (เข้าควบคุม / คืนการควบคุม), RigReaped (การเก็บกวาดเพราะว่าง TTL หรือ หน่วยความจำ พร้อมเอเจนต์ที่ขับอยู่) การเปิดริกไม่ใช่เหตุการณ์ ดูเหตุการณ์โดเมน
  • ที่จัดเก็บ: rig_sessions และ rig_action_log ในฐานข้อมูลของแต่ละเวิร์กสเปซ บันทึกการกระทำบันทึกเหตุการณ์อินพุตทุกครั้งพร้อมผู้กระทำและลำดับต่อริกที่ เพิ่มขึ้นเรื่อย ๆ; ข้อความที่พิมพ์จะถูกปิดบังเหลือเพียงความยาวและแฮชก่อน ถูกบันทึก
  • ไดเรกทอรีข้อมูล: rigs/images/ (อิมเมจ qcow2 ที่นำเข้า), rigs/smolvm/ (สถานะรันไทม์ต่อริก), rigs/smolvm-packs/ (แพ็กเครื่องที่แตกไฟล์ไว้ล่วงหน้า), rigs/tls/ (CA ของโดเมนสำหรับพัฒนา), rigs/run/ (โอเวอร์เลย์และซีดของ QEMU)
  • เส้นทาง: มุมมองสดเป็นแท็บในหน้าสเปซหรือ PR; /settings/server/rigs คือหน้าจอการตั้งค่าริก