ริก
ข้อเท็จจริงเท่านั้น สำหรับโมเดลที่อยู่เบื้องหลังสิ่งเหล่านี้ อ่าน ริกและเอนโคลเจอร์ ส่วนการเปิดเครื่อง ทำตาม คู่มือวิธีทำ
พื้นผิวและแบ็กเอนด์
หัวข้อที่มีชื่อว่า “พื้นผิวและแบ็กเอนด์”| พื้นผิว | ขับเคลื่อน | แบ็กเอนด์ | ค่า | เอเกรสที่ถูกกักไว้ |
|---|---|---|---|---|
| เทอร์มินัล (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 ฝั่งเกสต์แทนตัวที่มันเรียกไป
คำกริยาการกระทำ
หัวข้อที่มีชื่อว่า “คำกริยาการกระทำ”การกระทำทุกอย่างถูกพาร์สแบบเบ็ดเสร็จ: เพย์โหลดที่ผิดรูปแบบจะคืนข้อความที่ระบุ ชื่อฟิลด์ ไม่ใช่ข้อยกเว้น คำกริยาการสังเกต (ทำเครื่องหมาย ○) ยังคงได้รับอนุญาต ขณะที่มนุษย์ถือการควบคุมอยู่ ส่วนคำกริยาที่เปลี่ยนแปลงสถานะจะถูกปฏิเสธ
computer_use
หัวข้อที่มีชื่อว่า “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 วินาที), 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 — รูปภาพและไฟล์เดินทางบนเลนไฟล์ เพราะอาร์กิวเมนต์ของการกระทำถูกบันทึก
ลงบันทึกการตรวจสอบ และไบต์ของรูปภาพไม่ควรอยู่ที่นั่น เนื้อหาคลิปบอร์ดถูกส่ง
กลับมาพร้อมล้อมกรอบเป็นข้อมูลที่ไม่น่าเชื่อถือ
browser_use
หัวข้อที่มีชื่อว่า “browser_use”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 ในกรณีนั้น ซึ่งแทรกที่เคอร์เซอร์โดยไม่ผ่าน
คลิปบอร์ด
mobile_use
หัวข้อที่มีชื่อว่า “mobile_use”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 มีเพียงแอปที่โฟกัสอยู่
เท่านั้นที่อ่านคลิปบอร์ดได้
ios_use
หัวข้อที่มีชื่อว่า “ios_use”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คือหน้าจอการตั้งค่าริก