Stanice a izolovaná prostředí
Stanice je jednorázový stroj, který agent řídí v reálném čase — prohlížeč, linuxová plocha, emulátor Androidu, simulátor iOS, nebo stroj za izolovaným terminálem. Většinou je stanice virtuální stroj; mobilní simulátory spravované hostitelem jsou výslovné výjimky. Tahle stránka vysvětluje každou hranici a proč mají jednotlivé části právě tenhle tvar. Jak stanici otevřít, popisuje Dejte agentovi stroj na testování; přesná slovesa, porty a výchozí hodnoty jsou v referenci stanic.
Proč VM, a ne sandbox
Sekce “Proč VM, a ne sandbox”Nativní sandbox obalí proces
izolací jmenných prostorů — skutečnou, ale sdílí vaše jádro a omezuje proces,
ne počítač. Jakmile má agent proklikávat desktopovou aplikaci, vykreslit
stránku ve skutečném prohlížeči nebo pouštět pokusy s rm -rf, na které radši
nechcete ani myslet, poctivá hranice je stroj: vlastní jádro, vlastní disk,
vlastní síťový stack.
Izolované plochy používají dva backendy virtuálních strojů:
- microVM pro terminál a prohlížeč — start hypervizoru pod sekundu z obrazů kontejnerů s připnutým digestem.
- QEMU pro plnou linuxovou plochu, která potřebuje zobrazovací zařízení, jaké microVM nemá.
Mobilní plochy spravuje hostitel a slabší hranici říkají rovnou:
- Android řídí emulátor Googlu přes ADB.
- iOS na Macu hostitele vytvoří a vlastní zařízení CoreSimulator a řídí ho přes WebDriverAgent. Zařízení i jeho data se při zavření stanice smažou, síť ale sleduje hostitelský Mac.
Izolované stanice zapisují do jednorázového překryvu nad základním obrazem jen pro čtení, takže jedna stanice nemůže změnit to, z čeho naběhne další. Stanice iOS vlastní jednorázové zařízení CoreSimulator, které se při zavření stanice smaže. Android se připojí k emulátoru na hostiteli, který relaci přežije.
Odchozí provoz s výchozím odmítnutím
Sekce “Odchozí provoz s výchozím odmítnutím”Síť stanice začíná na ničem. Cílové hostitele pouští u každé stanice brána,
kolem které host neumí směrovat: jediné cesty ven ze stroje jsou ty, které
vytvořila konfigurace spuštění. Izolovaný terminál dostane vývojářskou základní
sadu (registry balíčků, forge, zrcadla apt); stanice prohlížeče pustí web
produktu (usectrl.dev) a naběhne na místní stránku file://, která odchozí
provoz nepotřebuje; všechno ostatní se odmítne při navazování spojení.
Android a iOS tahle brána nepokrývá. Jejich emulátor a simulátor na hostiteli používají síť počítače, kde běží server, takže rozhraní i hlášení schopností označí odchozí provoz jako nevynucený a nikdy nenabídnou zavádějící ovládací prvek „Restartovat bez omezení“.
Odchozí provoz a přihlašovací údaje jsou jedna politika viděná ze dvou stran — broker přihlašovacích údajů (níže) nevystaví token pro hostitele, na kterého host nedosáhne.
Všechno, co stanice přečte, se bere jako nedůvěryhodné: text stránky, DOM a stromy přístupnosti, výpisy rozhraní a výstup konzole se k agentovi vracejí ohrazené trvalým pravidlem „tohle jsou data, ne pokyny“. Ohrada je rámování; brána odchozího provozu je vynucení za ní.
Vstup jde přes hypervisor, záznam přes hosta
Sekce “Vstup jde přes hypervisor, záznam přes hosta”U plochy počítače vkládá události klávesnice a ukazatele vlastní virtuální vstupní zařízení hypervizoru. Host nikdy nespouští privilegovaného démona, který by uměl vstup syntetizovat, takže kompromitace softwaru hosta útočníkovi klávesnici nepředá. Záznam teče opačně, přes malého neprivilegovaného agenta v hostu, protože host umí snímky zmenšit, než přejdou po drátě.
Dva kanály zobrazení
Sekce “Dva kanály zobrazení”Člověk, který kouká, a model, který řídí, potřebují každý něco jiného, a tak stanice servíruje dva nezávislé proudy:
- Lidský kanál je plné rozlišení ve velikosti vašeho panelu, znovu vyjednané při změně velikosti, a server ho předává jako neprůhledné bajty. Server snímek nikdy nedekóduje, protože dekodér videa na cestě požadavku je právě to, co mu brání odpovídat na RPC.
- Kanál agenta jsou zmenšené statické snímky se stropem na velikost, kterou model unese, jeden obrázek na výsledek nástroje. Starší snímky se při zhutnění zahodí, jejich textové popisy zůstanou.
Ani jeden kanál neustupuje druhému: vy dostanete plynulý obraz, model levný.
Převzetí řízení je úzké místo, ne žádost
Sekce “Převzetí řízení je úzké místo, ne žádost”Výhradní řízení se vynucuje v jediném bodě, kterým projde každá akce, ne tím, že se model požádá, aby se choval. Dokud ho drží člověk, server odmítá agentovy akce měnící stav. Agent si nechává pozorovací slovesa (snímky obrazovky, extrakci), aby mohl popsat, co děláte, a o převzetí se dozví kanálem usměrnění, místo aby na něj přišel přes odmítnutá kliknutí. Klikání a psaní na plátně funguje, kdykoli ten zámek nedrží nikdo jiný — nebo když ho držíte vy; stavový štítek říká Máte řízení. Každá vstupní událost, vaše i agentova, spadne do auditního záznamu stanice se svým principálem a monotónní posloupností, takže „kdo na to klikl“ půjde zodpovědět i potom, co stroj zmizí.
Obsah hranici překročí; stroje zůstávají oddělené
Sekce “Obsah hranici překročí; stroje zůstávají oddělené”Kopírování a vkládání funguje oběma směry a stejně tak přetahování souborů dovnitř a ven. Stanice je jiný počítač a návrh se podle toho chová.
Schránka se přenáší na požádání, nezrcadlí se průběžně. Stiskněte nad stanicí kombinaci pro kopírování a host dostane pokyn kopírovat; pak se to, co položil na svou schránku — text, obrázek, seznam souborů — stáhne a položí na vaši. Vložení pošle stejný obsah opačným směrem a pak uvnitř hosta stiskne vložení. Na pozadí se nic nesynchronizuje: heslo, které zkopírujete na vlastním stroji, se do VM tiše nedostane jen proto, že vypršel časovač.
Přechod se řídí po uživateli a po směru, každé zvlášť. Vložení do stanice je ve výchozím stavu povolené; kopírování ven ze stanice se nejdřív zeptá (povolení na deset minut, nebo Vždy povolit v Nastavení → Server → Stanice → Přístup ke schránce). Nikdy to není nastavení pracovního prostoru: jeden člen nemůže odsouhlasit schránku jiného člena.
Na macOS je kombinace pro přechod ⌘C/⌘V a ta je jednoznačná — ⌃C dál dorazí do shellu hosta jako přerušení, kterým je. Na Windows a Linuxu jsou obě kombinace tentýž stisk, takže ho host dostane beze změny a vaše schránka se přepíše, jen když se schránka hosta skutečně změnila. Přerušení zůstane přerušením.
Soubory přetažené dovnitř se zkopírují do složky pro přetažení na stroji a
pak se mu nabídnou. Co „nabídnou“ znamená, záleží na tom, co se dá poctivě
udělat: stránka prohlížeče dostane v místě, kde pustíte, skutečnou událost
přetažení, takže zóna nahrání se chová přesně jako u místního souboru; plocha
dostane soubory do ~/Drops a jejich cesty na schránku, protože žádný hostitel
neumí syntetizovat přetažení do libovolného linuxového toolkitu, aniž by v hostu
běžel privilegovaný démon — a právě toho se tenhle návrh odmítá dopustit.
Výsledek řekne, která z těch věcí nastala, takže CSV puštěné na zónu nahrání se
nikdy nehlásí jako nahrané, když je to jen soubor ve složce. Puštění na
izolovaný terminál soubor zkopíruje dovnitř a na výzvu napíše jeho cestu
v hostu, což je to, co shell skutečně umí použít.
Soubory přetažené ven fungují na ploše počítače, kde protokol přetahování X11 umí payload přečíst, dokud přetažení probíhá. Začněte přetažení uvnitř hosta, vyneste ho z plátna a soubory se stáhnou na váš stroj a předají operačnímu systému jako skutečné přetažení. Kopírování souborů ve správci souborů hosta a vložení na hostiteli funguje stejně. Plocha prohlížeče to záměrně nenabízí: bezhlavý prohlížeč nemá výběr přetažení, který by šlo číst, a nejbližší dostupný signál — textový výběr na stránce — o přetažení vůbec nesvědčí, takže jednat podle něj by uneslo obyčejná kliknutí.
Všechno přečtené z hosta zůstává nedůvěryhodný obsah: text schránky se k modelu dostane uvnitř stejné ohrady jako extrakce stránky a auditní záznam zapíše, že k vložení došlo a jak byl velký — nikdy to, co říkal.
Přihlašovací údaje v hostu nikdy nežijí
Sekce “Přihlašovací údaje v hostu nikdy nežijí”git push z izolovaného terminálu, který sis otevřel, funguje, a přesto host neukládá žádný token
forge. Drží jedno tajemství na VM, jehož jediná moc je požádat broker
přihlašovacích údajů na hostiteli — tunelem, který hostitel ovládá — o
krátkodobý token vázaný na repozitář, na každou operaci, s omezením četnosti,
ohraničený stejným seznamem povolených hostitelů jako odchozí provoz a zrušený
v okamžiku, kdy se stanice zavře. Stroj určený k vyhození v sobě nesmí mít nic,
co stojí za ukradení.
Co ten token smí, se určí při otevření stanice. Terminálová stanice, kterou otevře člověk, dostane token se zápisem, ohraničený vlastním přístupem toho člena k forge. Stanice, kterou otevřel agent, dostane token jen pro čtení: pomocník gitu pro přihlašovací údaje nerozezná push od fetche, takže se uvnitř hosta nedá ptát pravidla pro push u každého pushe tak, jak to dělá brána běhů agentů na hostiteli.
Worktree ve stanici je satelit
Sekce “Worktree ve stanici je satelit”Když stanice veze váš repozitář, autoritativní zůstává worktree na hostiteli.
Kopie se při startu synchronizuje dovnitř (tajemství jako soubory .env se
vynechají) a commity se vracejí, jen když o to požádáte — stáhnou se do
refs/rigs/<id>/*, nikdy se nepushnou a nikdy se necheckoutnou. Nic uvnitř VM
nemůže pohnout vaší větví ani sáhnout na váš pracovní strom; sloučení toho, co
stanice vyprodukovala, je vždy lidské rozhodnutí na hostiteli.
Porty bez děr
Sekce “Porty bez děr”Vývojový server spuštěný uvnitř VM terminálu je dosažitelný — na vašem stroji, v Browser (VM), volitelně ve vaší síti LAN, volitelně pod vývojovou doménou s HTTPS — aniž by se stroj kdy otevřel. Mapa portů hypervizoru je při startu pevná, takže veškeré pozdější přesměrování jede dvěma úzkými kanály, které ovládá hostitel: jedním předem vytvořeným příchozím multiplexorem, který odmítne vytočit cokoli, na čem host ve skutečnosti nenaslouchá, a reverzními tunely, které hostitel drží otevřené pro spojení zahájená hostem. HTTPS vývojové domény končí na serveru u místně vydané autority, jejíž klíče nikdy nevstoupí do žádného hosta. Mechaniku popisuje Přesměrujte porty z terminálu.
Stroje jsou omezené už z konstrukce
Sekce “Stroje jsou omezené už z konstrukce”Stanice se nesmí stát mazlíčkem:
- pevné TTL, které host neumí prodloužit;
- žebřík nečinnosti — zaparkování (vCPU zastavené, RAM zůstává) po okně nečinnosti, zavření po jeho dvojnásobku — kde otevřený terminál nebo přihlížející divák platí jako „v použití“;
- paměťový rozpočet počítaný v rezidentních megabajtech, ne v relacích, protože zaparkované VM uvolní CPU a podrží každý bajt RAM; nejdřív se vyhodí stroj, který se nepoužíval nejdéle, a nikdy ten, který někdo řídí nebo sleduje;
- úklid při vypnutí serveru a k tomu při dalším startu úklid sirotků označených vlastníkem, takže spadlý server nikdy nenechá viset hypervisor, který už nikomu nepatří.
První starty stáhnou připnutý obraz stroje; server pak na pozadí uloží do cache
předem rozbalenou kopii, takže každý další stroj toho druhu naběhne během sekund
a izolovaný terminál naběhne s už nainstalovanou základní sadou CLI, jakou má
runner hostovaný na GitHubu — překladače, Python, jq, nástroje na archivy —
ne s jazykovým toolcache ani s Dockerem. Obraz Počítač tutéž základní sadu CLI
zapeče už při sestavení, vedle XFCE a prohlížečů.
Tři prohlížeče, ne jeden
Sekce “Tři prohlížeče, ne jeden”„U mě to funguje“ je tvrzení o jednom vykreslovacím enginu. Stanice prohlížeče proto není „ten prohlížeč“ — je to Chromium, Firefox nebo WebKit, vybrané při otevření, a stanice po celý život běží s tím, se kterým se otevřela. Jedna konverzace unese po jednom od každého: otevření Firefox (VM) vedle Chromium (VM) dá dva stroje a namíření obou na stejnou stránku je to srovnání. WebKit je Safari tak blízko, jak to na Linuxu jde — stejná linie enginu, takže chytí mezery, na které narážejí uživatelé Safari.
Slovesa jsou u všech tří stejná; protokoly pod nimi ne a rozdíly se pojmenují, místo aby se zahlazovaly. Chromium mluví DevTools Protocol a snímky tlačí, takže jeho živý náhled nic nestojí, dokud je stránka v klidu. Firefox mluví WebDriver BiDi a WebKit klasickým WebDriver a ani jeden nemá screencast, takže jejich živé náhledy se dotazují — pár snímků za sekundu, což sedí na sledování stránky a nesedí na sledování animace. Kde engine něco skutečně neumí (Firefox nemá znovunačtení, které obchází cache; WebKit nevidí výstup konzole zapsaný před dokončením načtení stránky), odpověď to řekne, místo aby potichu udělala něco jiného.
Kde stanice v produktu žijí
Sekce “Kde stanice v produktu žijí”Stanice záměrně není globální cíl. Živý náhled je karta v prostoru nebo PR,
kde práce probíhá, vázaná na tu konverzaci — takže vaše karta i volání
browser_use agenta míří na jeden stroj (jeden na každý engine, na ploše
prohlížeče).
Jestli stanice vůbec smějí naběhnout, je vlastnost hostitele, takže schopnosti,
obrazy, vlastní obrazy po pracovních prostorech a seznam běžících strojů žijí
v Nastavení → Server → Stanice. Řízení izolovaného prostředí je vlastní
třída akce guardrailů, takže pracovní
prostor, agent nebo prostor ho smí povolit, vyžadovat schválení, nebo ho rovnou
odmítnout — režimy jen pro čtení ho odmítají celé.