From 4b1e3132fc394eeb51401666d00d644ffef25ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Such=C3=A1nek?= Date: Mon, 12 Oct 2026 20:35:50 +0200 Subject: [PATCH 1/2] Folder: the browser section explains how a page reaches the Operator, and the agent chooses the way (F38 addendum, base-instructions-44) A page reaches the Operator as a plain link (their own browser, on their computer), as a link to a tab of the Environment (the Environment browser, with its sign-ins and network), or in web T3 Code's right panel, and every client does something else with each. Rules for which way to take missed combinations, such as a plain address the Operator opens in ChatGPT Desktop's own browser while the agent is to work in that page. The section now explains the ways client by client (web T3 Code, its desktop app, ChatGPT Desktop, the Launchpad), says that people mostly like the pages an agent works with beside the chat, and leaves the choice to the agent. The boundaries stay: the Environment's browser for browser work, sign-ins only by the Operator, new pages in new tabs, a window let go of. Template revision base-instructions-44: Folders refresh to it after the release. Co-Authored-By: Claude Opus 5.5 --- docs/decisions.md | 25 +++++++++ src/folder/manual.ts | 53 ++++++++++++++---- src/folder/render.ts | 2 +- .../__snapshots__/folder-manual.test.ts.snap | 56 +++++++++---------- .../__snapshots__/folder-render.test.ts.snap | 28 +++++----- tests/environment-browser.test.ts | 53 ++++++++++++++++++ tests/folder-template-revision.test.ts | 4 +- tests/folder-tools.test.ts | 4 +- 8 files changed, 167 insertions(+), 58 deletions(-) diff --git a/docs/decisions.md b/docs/decisions.md index 1d43e188..68938c7c 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -5739,6 +5739,31 @@ from there: The "A personal browser" point now points to this one instead of repeating it. Template revision `base-instructions-42`. +**Addendum 2026-10-12, asked for by the Organization Admin: the Folder explains how a page +reaches the Operator, and the agent chooses the way.** A page reaches the Operator in +several ways: +- a plain link opens it in their own browser on their computer; +- a link to a tab of the Environment shows that tab of the Environment browser, with the + Environment's sign-ins and network; +- web T3 Code shows the thread's window in its right panel by itself. + +Each client does something else with each of them: ChatGPT Desktop's built-in browser and +the right panel of the T3 Code desktop app run on the Operator's computer. Rules for which +way to take would miss combinations, such as a plain address the Operator opens in ChatGPT +Desktop's browser while the agent is to work in that page. So the Folder manual's browser +section now explains the ways and what each client does with them, and leaves the choice +to the agent. The aim is that the Operator sees the page as simply as possible and the +same way in every client. The section also says that people mostly like to see the pages +an agent works with beside the chat, even without asking, and close what they do not want. + +The boundaries stay: +- browser work happens in the Environment's browser; +- only the Operator signs in; +- a new page opens in a new tab; +- a window is let go of, never closed for everyone. + +Template revision `base-instructions-44`. + ## F39 — The people's view of the Environment browser: one tab of a person is one remote tab **Decided by Matěj 2026-10-06 after the pilot (root decision 0191 points 11–18, plan diff --git a/src/folder/manual.ts b/src/folder/manual.ts index 113fc78b..f1ee14c2 100644 --- a/src/folder/manual.ts +++ b/src/folder/manual.ts @@ -1945,20 +1945,55 @@ function operatorClient( // shared Chromium per Environment, a window per thread through `lazurio // browser window`, worked in with agent-browser, and the people's view the // gateway routes, where the Operator works in the same tab at the same time. -// Rendered only where the recorded entry has the view. +// How a page reaches the Operator is explained, client by client, and the way +// is the agent's choice (F38 addendum of 2026-10-12). Rendered only where the +// recorded entry has the view. function environmentBrowser(preset: PresetName): readonly Text[] { const team = preset === "hosted-organization-team"; const personal = workspacePreset(preset).personalspace === "present"; return [ t("## Prohlížeč Environmentu", "## The Environment browser"), t( - `Tenhle Environment má jeden sdílený prohlížeč: Chromium na virtuální obrazovce \`:1\` s jedním trvalým profilem (decision 0191). Přihlášení v něm patří Environmentu: sdílí je všechna vlákna, agenti a boti${team ? " a celý Team" : ""}. Pro práci v prohlížeči používej tenhle prohlížeč, ne vlastní: Operátor tě v něm vidí a pracuje s tebou ve stejné záložce.`, - `This Environment has one shared browser: Chromium on the virtual screen \`:1\` with one persistent profile (decision 0191). Its sign-ins belong to the Environment: every thread, agent and bot${team ? " and the whole Team" : ""} share them. Use this browser for browser work, not one of your own: the Operator sees you in it and works with you in the same tab.`, + `Tenhle Environment má jeden sdílený prohlížeč: Chromium na virtuální obrazovce \`:1\` s jedním trvalým profilem (decision 0191). Přihlášení v něm patří Environmentu a sdílí je všechna vlákna, agenti a boti${team ? " a celý Team" : ""}. Když pracuješ v prohlížeči, pracuj v tomhle, ne ve vlastním: má přihlášení a síť Environmentu a Operátor tě v něm vidí a může s tebou pracovat ve stejné záložce.`, + `This Environment has one shared browser: Chromium on the virtual screen \`:1\` with one persistent profile (decision 0191). Its sign-ins belong to the Environment, and every thread, agent and bot${team ? " and the whole Team" : ""} share them. When you work in a browser, work in this one, not one of your own: it has the Environment's sign-ins and network, and the Operator sees you in it and can work with you in the same tab.`, ), blank, + t("### Jak Operátor stránku uvidí", "### How the Operator sees a page"), t( - "- **„Otevřený prohlížeč“ je tenhle.** Když Operátor mluví o prohlížeči, který má otevřený, nebo se ptá, co v něm je, myslí prohlížeč Environmentu: ten vidí v pravém panelu webového T3 Code, v pravém panelu Launchpadu i z tvého odkazu. V T3 Code tohoto Environmentu ovládají nástroje náhledu (`preview_*`) právě tenhle prohlížeč: každá jejich záložka je okno prohlížeče Environmentu a pravý panel webového T3 ukazuje záložku vlákna. Vestavěný prohlížeč desktopových aplikací, třeba ChatGPT Desktopu, běží na Operátorově počítači, ne tady. Co je v oknech Environmentu otevřené, vypíše `curl -s http://127.0.0.1:9222/json/list` (adresa a titulek každé stránky).", - "- **\"The open browser\" is this one.** When the Operator talks about the browser they have open, or asks what is in it, they mean the Environment browser: they see it in web T3 Code's right panel, in the Launchpad's right panel and from your link. In this Environment's T3 Code, the preview tools (`preview_*`) drive this browser: each of their tabs is a window of the Environment browser, and web T3's right panel shows the thread's tab. The built-in browser of desktop apps, ChatGPT Desktop say, runs on the Operator's computer, not here. `curl -s http://127.0.0.1:9222/json/list` lists what the Environment's windows have open (each page's address and title).", + "Stránku můžeš Operátorovi ukázat několika cestami. Která je nejlepší, záleží na stránce i na tom, kde Operátor zrovna je. Cíl je, aby stránku viděl co nejjednodušeji a aby to fungovalo stejně v T3 Code, v ChatGPT Desktopu i v Launchpadu, ať se v tom neztrácí. Tady je, jak jednotlivé cesty fungují; vyber tu, která mu dává největší smysl.", + "You can show the Operator a page in several ways. Which one is best depends on the page and on where the Operator is. The aim is that they see it as simply as possible, and that it works the same in T3 Code, in ChatGPT Desktop and in the Launchpad, so they never get lost. Here is how each way works; choose the one that makes the most sense to them.", + ), + blank, + t( + "- **Obyčejný odkaz** (adresa stránky) se otevře v Operátorově vlastním prohlížeči na jeho počítači, s jeho přihlášeními a jeho sítí. Hodí se na veřejnou stránku, kterou si stačí přečíst nebo prohlédnout, třeba článek, dokumentaci nebo obrázek.", + "- **A plain link** (the page's address) opens in the Operator's own browser on their computer, with their sign-ins and their network. It suits a public page they only need to read or look at, an article, documentation or a picture say.", + ), + t( + "- **Odkaz na záložku Environmentu** (`https://browser.…/t/`) ukáže přesně tu záložku prohlížeče Environmentu, s toutéž stránkou, přihlášeními a sítí, jaké máš ty. Pracujete v ní oba současně a ovládání se nepředává. Okno, které stránka otevře jako pop-up (třeba přihlášení přes Google), Operátor uvidí ve stejné záložce a novou záložku, kterou stránka otevře, mu pohled nabídne. Hodí se, když stránka potřebuje Environment (jeho přihlášení, síť Organizace nebo `localhost` tohoto Environmentu), když v ní pracuješ a Operátor má vidět, co děláš, nebo když v ní má něco dokončit, třeba formulář nebo přihlášení. Holou adresu `https://browser.…/` neposílej, ta vždy založí novou prázdnou záložku.", + "- **A link to a tab of the Environment** (`https://browser.…/t/`) shows exactly that tab of the Environment browser, with the same page, sign-ins and network as you have. You both work in it at the same time, and control is never handed over. A window the page opens as a pop-up (Sign in with Google, say) shows in the same tab, and the view offers the Operator a new tab the page opens. It suits a page that needs the Environment (its sign-ins, the Organization's network or this Environment's `localhost`), a page you work in while the Operator should see what you do, and a page where they are to finish something, a form or a sign-in say. Never send the bare address `https://browser.…/`, which always starts a new blank tab.", + ), + t( + "- **Webové T3 Code** tohoto Environmentu má prohlížeč Environmentu v pravém panelu a jeho nástroje náhledu (`preview_*`) ovládají právě ten: každá jejich záložka je okno prohlížeče Environmentu. Okno tvého vlákna se v panelu ukáže samo: jakmile v prohlížeči začneš pracovat (`lazurio browser window`, `preview_open`), panel se na něm otevře. Na úzké obrazovce, kde panel zakrývá chat, se sám neotevře a záložka v něm na Operátora počká. Klik na odkaz na záložku Environmentu ve vlákně ji otevře jako další záložku panelu, klik na obyčejný odkaz otevře nový tab Operátorova prohlížeče. Desktopová aplikace T3 Code má zatím v pravém panelu prohlížeč počítače, na kterém běží: prohlížeč Environmentu v ní Operátor uvidí přes odkaz na záložku Environmentu.", + "- **Web T3 Code** of this Environment has the Environment browser in its right panel, and its preview tools (`preview_*`) drive that browser: each of their tabs is a window of the Environment browser. Your thread's window shows in the panel by itself: as soon as you start browser work (`lazurio browser window`, `preview_open`), the panel opens on it. On a narrow screen, where the panel covers the chat, it does not open by itself, and the tab waits in it for the Operator. A click on a link to a tab of the Environment in the thread opens it as another tab of the panel; a click on a plain link opens a new tab of the Operator's browser. For now, the right panel of the T3 Code desktop app shows the browser of the computer it runs on: there the Operator sees the Environment browser through a link to a tab of the Environment.", + ), + t( + "- **ChatGPT Desktop** (dřív Codex Desktop), ze kterého sem pracuješ přes SSH, má vestavěný prohlížeč na Operátorově počítači, ne tady. Odkaz na záložku Environmentu v něm ukáže prohlížeč Environmentu, obyčejný odkaz načte stránku na Operátorově počítači. Když si tam Operátor sám otevře záložku s obyčejnou adresou, stránka běží mimo Environment: nevidíš ji a nemá přihlášení ani síť Environmentu. Máš-li v ní pracovat, nebo stránka Environment potřebuje, otevři ji ve svém okně (`lazurio browser window --url `) a pošli mu odkaz na tu záložku, ať ji v ChatGPT Desktopu otevře místo své.", + "- **ChatGPT Desktop** (formerly Codex Desktop), from which you work here over SSH, has its built-in browser on the Operator's computer, not here. A link to a tab of the Environment shows the Environment browser in it; a plain link loads the page on the Operator's computer. When the Operator opens a tab there with a plain address themselves, the page runs outside the Environment: you do not see it, and it has neither the Environment's sign-ins nor its network. When you are to work in it, or the page needs the Environment, open it in your window (`lazurio browser window --url
`) and send them the link to that tab, to open in ChatGPT Desktop instead of theirs.", + ), + t( + "- **Launchpad** ukazuje v Nové kartě (Přehled) všechny záložky Environmentu, tu tvoji taky, a Operátor si ji odtud vezme do své lišty. Odkaz na záložku Environmentu otevře i v běžném tabu nebo na telefonu, všude, kde se do tohoto Environmentu přihlásí.", + "- **The Launchpad** shows every tab of the Environment in New tab (Overview), yours too, and the Operator takes it into their strip from there. They also open a link to a tab of the Environment in an ordinary tab or on a phone, anywhere they sign in to this Environment.", + ), + blank, + t( + "Lidi stránky, se kterými pracuješ nebo které jim ukazuješ, většinou rádi vidí rovnou vedle chatu, i když o to výslovně nepožádají. Když je nechtějí, zavřou si je.", + "People mostly like to see the pages you work with, or show them, right beside the chat, even without asking for it. When they do not want them, they close them.", + ), + blank, + t("### Práce v prohlížeči", "### Working in the browser"), + t( + "- **„Otevřený prohlížeč“.** Když Operátor mluví o prohlížeči, který má otevřený, nebo se ptá, co v něm je, myslí většinou prohlížeč Environmentu: pravý panel T3 Code nebo Launchpadu, případně tvůj odkaz. V ChatGPT Desktopu to ale může být i záložka jeho vestavěného prohlížeče s obyčejnou adresou, která běží na jeho počítači. Co je v oknech Environmentu otevřené, vypíše `curl -s http://127.0.0.1:9222/json/list` (adresa a titulek každé stránky).", + "- **\"The open browser\".** When the Operator talks about the browser they have open, or asks what is in it, they mostly mean the Environment browser: the right panel of T3 Code or of the Launchpad, or your link. In ChatGPT Desktop it can also be a tab of its built-in browser with a plain address, which runs on their computer. `curl -s http://127.0.0.1:9222/json/list` lists what the Environment's windows have open (each page's address and title).", ), t( "- **Tvoje okno.** Na začátku práce s prohlížečem spusť `lazurio browser window` (případně `--url `). Otevře okno tvého vlákna, nebo najde to, které už máš, a vypíše jméno sezení, odkaz na tvou záložku v pohledu (`https://browser.…/t/`) a příkaz, kterým v okně pracuješ. Jméno sezení plyne z vlákna (`AGENT_BROWSER_SESSION`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`); jinak ho zadej `--session `.", @@ -1986,12 +2021,8 @@ function environmentBrowser(preset: PresetName): readonly Text[] { ), ]), t( - "- **Pohled pro Operátora.** Když začneš, pošli Operátorovi odkaz na svou záložku, který vypíše `lazurio browser window`. Otevře ho v pravém panelu ChatGPT Desktopu (dřív Codex Desktop), v pravém panelu webového T3 Code, v pravém panelu Launchpadu, v tabu nebo na telefonu připojeném do tailnetu: jedna jeho záložka je přesně tvoje záložka a pracujete v ní současně, ovládání se nepředává. Holou adresu `https://browser.…/` neposílej, ta vždy otevře novou prázdnou záložku. Okno, které stránka otevře jako pop-up (třeba přihlášení přes Google), Operátor uvidí ve stejné záložce; novou záložku, kterou stránka otevře, mu pohled nabídne. Ve webovém T3 Code se pravý panel na záložce tvého vlákna otevře sám, jakmile začneš s prohlížečem pracovat.", - "- **The Operator's view.** When you start, send the Operator the link to your tab that `lazurio browser window` prints. They open it in ChatGPT Desktop's right panel (formerly Codex Desktop), in web T3 Code's right panel, in the Launchpad's right panel, in a tab or on a phone on the tailnet: one tab of theirs is exactly your tab, and you both work in it at the same time; control is never handed over. Never send the bare address `https://browser.…/`, which always opens a new blank tab. A window the page opens as a pop-up (Sign in with Google, say) shows in the same tab of the Operator; a new tab the page opens is offered to them by the view. In web T3 Code the right panel opens on your thread's tab by itself as soon as you start browser work.", - ), - t( - "- **Nová záložka.** Novou stránku, kterou má Operátor vidět, otevři v nové záložce. Záložku, kterou má otevřenou, jinam nepřeváděj, ať mu zůstane rozepsaný e-mail, formulář nebo přihlášení. V T3 Code zavolej `preview_open` s `reuseExistingTab: false` a `url`: otevře nové okno prohlížeče a vrátí jeho `tabId`, přes které se k té záložce vracíš. Operátorovi pak pošli odkaz na ni, `https://browser.…/t/` (začátek adresy vypíše `lazurio browser link`); klik ve vlákně ji otevře jako další záložku pravého panelu. Mimo T3 spusť `lazurio browser link --url `: otevře stránku v nové záložce, kterou nikdo nedrží, a vypíše odkaz na ni, který pošleš Operátorovi; záložka skončí 30 s poté, co ji zavře. Když v té stránce máš pracovat i ty, otevři ji místo toho v dalším svém okně, `lazurio browser window --session -2 --url ` (každé jméno sezení má vlastní okno), a pošli odkaz, který vypíše. Stávající záložku (`preview_navigate`, `agent-browser … open`) převeď jinam, jen když v ní pokračuješ v téže práci, nebo když o to Operátor požádá.", - "- **A new tab.** Open a new page the Operator should see in a new tab. Do not move a tab they have open elsewhere, so their half-written email, form or sign-in stays. In T3 Code call `preview_open` with `reuseExistingTab: false` and the `url`: it opens a new window of the browser and returns its `tabId`, which brings you back to that tab. Then send the Operator its link, `https://browser.…/t/` (`lazurio browser link` prints the start of the address); a click in the thread opens it as another tab of the right panel. Outside T3 run `lazurio browser link --url
`: it opens the page in a new tab that nobody holds and prints its link, which you send the Operator; the tab ends 30 s after they close it. When you are to work in that page too, open it in another window of yours instead, `lazurio browser window --session -2 --url
` (each session name has its own window), and send the link it prints. Move an existing tab elsewhere (`preview_navigate`, `agent-browser … open`) only to continue the same work in it, or when the Operator asks.", + "- **Nová záložka.** Novou stránku otevírej v nové záložce: v té, kterou má Operátor otevřenou, mu tak zůstane rozepsaný e-mail, formulář nebo přihlášení. Stávající záložku (`preview_navigate`, `agent-browser … open`) převeď jinam, jen když v ní pokračuješ v téže práci, nebo když o to Operátor požádá. V T3 Code otevře novou záložku `preview_open` s `reuseExistingTab: false` a `url`: vrátí její `tabId`, přes které se k ní vracíš, a odkaz na ni je `https://browser.…/t/` (začátek adresy vypíše `lazurio browser link`). Mimo T3 vypíše `lazurio browser link --url ` odkaz na novou záložku, kterou nikdo nedrží; skončí 30 s poté, co ji Operátor zavře. Máš-li v té stránce pracovat i ty, otevři ji v dalším svém okně, `lazurio browser window --session -2 --url ` (každé jméno sezení má vlastní okno).", + "- **A new tab.** Open a new page in a new tab: the tab the Operator has open keeps their half-written email, form or sign-in that way. Move an existing tab elsewhere (`preview_navigate`, `agent-browser … open`) only to continue the same work in it, or when the Operator asks. In T3 Code, `preview_open` with `reuseExistingTab: false` and the `url` opens a new tab: it returns its `tabId`, which brings you back to it, and its link is `https://browser.…/t/` (`lazurio browser link` prints the start of the address). Outside T3, `lazurio browser link --url
` prints the link to a new tab that nobody holds; it ends 30 s after the Operator closes it. When you are to work in that page too, open it in another window of yours, `lazurio browser window --session -2 --url
` (each session name has its own window).", ), t( "- **Přihlášení a ověření.** Na přihlašovací stránce, 2FA nebo CAPTCHA se zastav, pošli Operátorovi odkaz na svou záložku, požádej ho, ať přihlášení v ní dokončí, a počkej na jeho odpověď. Hesla ani kódy nevyplňuj sám a nežádej o ně v chatu. Dokud se Operátor přihlašuje, nepiš do stejných polí a záložku nefoť. Přihlášení pak platí pro celý Environment: neodhlašuj se a nemaž cookies ani data prohlížeče. Passkey zatím prohlížeč odmítá, dokud nebude mít Environment svůj Bitwarden; zvol jinou cestu přihlášení.", diff --git a/src/folder/render.ts b/src/folder/render.ts index d2089556..43168492 100644 --- a/src/folder/render.ts +++ b/src/folder/render.ts @@ -41,7 +41,7 @@ import { ownDataValue, stateFields } from "./state-fields"; // future persisted preference schemas. Every change of the generated bytes // moves it to the next number; tests/folder-template-revision.test.ts pins the // rendered digest of the current one (decision F14, addendum 2026-10-03). -export const instructionTemplateRevision = "base-instructions-43"; +export const instructionTemplateRevision = "base-instructions-44"; // Template revisions are ordered by their number. A Folder rendered by an // older revision is re-rendered by the next change of the generated Folder diff --git a/tests/__snapshots__/folder-manual.test.ts.snap b/tests/__snapshots__/folder-manual.test.ts.snap index cfc4cfd7..c73802ba 100644 --- a/tests/__snapshots__/folder-manual.test.ts.snap +++ b/tests/__snapshots__/folder-manual.test.ts.snap @@ -2,7 +2,7 @@ exports[`a personal VM names reachable peers neutrally from the record and requires the Operator's confirmation 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`example\` (personal-vm). - Owner: the person with GitHub login \`example\` (id 12345). @@ -87,7 +87,7 @@ Peers this Environment may reach over SSH, exactly as the handover records them: exports[`a personal VM names reachable peers neutrally from the record and requires the Operator's confirmation 2`] = ` "# Tenhle Environment - + ## Identita podle zaznamenaného handoveru - Název: \`example\` (personal-vm). - Owner: člověk s GitHub loginem \`example\` (id 12345). @@ -172,7 +172,7 @@ Peers, na které odsud smíš přes SSH, přesně jak je zaznamenal handover: exports[`rendered manual/this-machine.md snapshot: local 1`] = ` "# This Environment - + ## Identity, from the recorded handover - The Operator's own workstation. No handover was recorded; the signed-in user is both Owner and Operator. @@ -210,7 +210,7 @@ The Integrations (connected apps) and custom MCP servers of this Environment are exports[`rendered manual/this-machine.md snapshot: hosted-personal 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`example\` (personal-vm). - Owner: the person with GitHub login \`example\` (id 12345). @@ -287,7 +287,7 @@ The handover records no peer this Environment may reach over SSH; do not look fo exports[`rendered manual/this-machine.md snapshot: hosted-organization-personal 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`workspace\` (workspace-vm). - Owner: Organization \`example\`. @@ -358,7 +358,7 @@ The Integrations (connected apps) and custom MCP servers of this Environment are exports[`rendered manual/this-machine.md snapshot: hosted-organization-team 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`workspace\` (workspace-vm). - Owner: Organization \`example\`, Team \`sample-team\`. @@ -431,7 +431,7 @@ The Integrations (connected apps) and custom MCP servers of this Environment are exports[`rendered manual/this-machine.md snapshot: hosted-organization-steward 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`workspace\` (workspace-vm). - Owner: Organization \`example\`. @@ -520,7 +520,7 @@ The Integrations (connected apps) and custom MCP servers of this Environment are exports[`rendered manual/lazurio.md snapshot 1`] = ` "# Lazurio - + ## What Lazurio is Lazurio is the shared framework in which people and machines work together on the work of companies (Organizations, Teams and modules) and on a person's own affairs (Personalspace and the optional Buddy). Lazurio is the product's only current name; earlier names remain only in historical records (decision 0128). @@ -579,7 +579,7 @@ These layers are not copied into each other automatically; a chat is a cache. exports[`rendered manual/lazurio.md snapshot 2`] = ` "# Lazurio - + ## Co je Lazurio Lazurio je sdílený rámec, ve kterém lidé a stroje společně pracují na práci firem (Organizace, Teamy a moduly) i na osobních záležitostech člověka (Personalspace a volitelný Buddy). Lazurio je jediný aktuální název produktu; dřívější názvy zůstávají jen v historických záznamech (decision 0128). @@ -638,7 +638,7 @@ Tyhle vrstvy se do sebe automaticky nekopírují; chat je jen cache. exports[`rendered manual/working-here.md snapshot 1`] = ` "# Working here - + ## Draft, Publication, Release - **Draft** is your work: a revertible and, above all, editable piece of work, a change in a worktree, a drafted e-mail, an open pull request. - **Publication** is the act that makes a Draft hard to revert or visible outside: a merge, sending, deploying; in data applications already the commit and push of the “Publish changes” button. Publication belongs to the Operator: you perform it only on their explicit instruction, which holds in the current thread and does not carry over. Whether the Operator may approve it is decided by their live rights to the exact operation. @@ -788,7 +788,7 @@ Do the work so that they have it: understandable, reversible, with room to adjus exports[`rendered manual/working-here.md snapshot 2`] = ` "# Jak se tu pracuje - + ## Draft, Publikace, Release - **Draft** je tvoje práce: vratný a hlavně editovatelný kus práce, změna ve worktree, rozepsaný e-mail, otevřený pull request. - **Publikace** je akt, kterým se Draft stává těžko vratným nebo viditelným navenek: merge, odeslání, nasazení; v datových aplikacích už commit a push tlačítkem „Publikovat změny“. Publikace patří Operátorovi: provedeš ji jen na jeho explicitní pokyn, který platí v aktuálním threadu a nepřenáší se dál. Jestli ji Operátor smí schválit, rozhodují jeho živá práva k přesné operaci. @@ -938,7 +938,7 @@ Odveď práci tak, aby ho měl: srozumitelně, vratně, s prostorem k úpravě. exports[`rendered manual/roles.md snapshot 1`] = ` "# Roles - + Names authorize nothing. In every role below, what a person may do is decided by their live rights at the providers, above all on GitHub (decisions 0102/0103). ## Operator (Operátor) @@ -974,7 +974,7 @@ The term “AI Kolega”, an AI with its own seat and authority like a person, i exports[`rendered manual/roles.md snapshot 2`] = ` "# Role - + Názvy nic neautorizují. U každé role níže rozhodují o tom, co člověk smí, jeho živá práva u providerů, především na GitHubu (decisions 0102/0103). ## Operátor @@ -1010,7 +1010,7 @@ Pojem „AI Kolega“, tedy AI s vlastním seatem a pravomocemi jako člověk, j exports[`rendered manual/glossary.md snapshot 1`] = ` "# Glossary - + English terms first; the Czech term the product and its people use is in parentheses. | Term | Meaning | @@ -1064,7 +1064,7 @@ English terms first; the Czech term the product and its people use is in parenth exports[`rendered manual/glossary.md snapshot 2`] = ` "# Slovník - + Nejdřív český pojem, v závorce anglický, který používají produkt a technické identifikátory. | Pojem | Význam | @@ -1118,7 +1118,7 @@ Nejdřív český pojem, v závorce anglický, který používají produkt a tec exports[`rendered manual/troubleshooting.md snapshot 1`] = ` "# Installation, updates and troubleshooting - + ## Lazurio in this Environment Lazurio is installed here: the product in \`~/.local/share/lazurio/\` with the command \`lazurio\`, and this Folder with its generated files \`AGENTS.md\`, \`manual/\` and \`.lazurio/\`. It is installed only by its installer and updated with \`lazurio update\`. @@ -1198,7 +1198,7 @@ An open technical problem belongs in a GitHub Issue of the exact owning reposito exports[`rendered manual/troubleshooting.md snapshot 2`] = ` "# Instalace, aktualizace a řešení problémů - + ## Lazurio na tomhle Environmentu Lazurio je tu nainstalované: produkt v \`~/.local/share/lazurio/\` s příkazem \`lazurio\` a tenhle Folder s generovanými soubory \`AGENTS.md\`, \`manual/\` a \`.lazurio/\`. Instaluje se jen svým instalátorem a aktualizuje příkazem \`lazurio update\`. @@ -1278,7 +1278,7 @@ Otevřený technický problém patří do GitHub Issue v přesném owning repozi exports[`rendered manual/troubleshooting.md snapshot: hosted-personal / cs 1`] = ` "# Instalace, aktualizace a řešení problémů - + ## Lazurio na tomhle Environmentu Lazurio je tu nainstalované a spravované: produkt v \`~/.local/share/lazurio/\` s příkazem \`~/.local/bin/lazurio\` a tenhle Folder s generovanými soubory \`AGENTS.md\`, \`manual/\` a \`.lazurio/\`. Když tě Operátor požádá „nainstaluj Lazurio“, ověř stav (\`lazurio doctor\`) a doplň jen to, co chybí, postupy níže. @@ -1351,7 +1351,7 @@ Otevřený technický problém patří do GitHub Issue v přesném owning repozi exports[`rendered manual/troubleshooting.md snapshot: hosted-personal / en 1`] = ` "# Installation, updates and troubleshooting - + ## Lazurio in this Environment Lazurio is installed and managed here: the product in \`~/.local/share/lazurio/\` with the command \`~/.local/bin/lazurio\`, and this Folder with its generated files \`AGENTS.md\`, \`manual/\` and \`.lazurio/\`. When the Operator asks you to “install Lazurio”, check the state (\`lazurio doctor\`) and complete only what is missing, with the procedures below. @@ -1424,7 +1424,7 @@ An open technical problem belongs in a GitHub Issue of the exact owning reposito exports[`rendered manual/troubleshooting.md snapshot: hosted-organization-personal / cs 1`] = ` "# Instalace, aktualizace a řešení problémů - + ## Lazurio na tomhle Environmentu Lazurio je tu nainstalované a spravované: produkt v \`~/.local/share/lazurio/\` s příkazem \`~/.local/bin/lazurio\` a tenhle Folder s generovanými soubory \`AGENTS.md\`, \`manual/\` a \`.lazurio/\`. Když tě Operátor požádá „nainstaluj Lazurio“, ověř stav (\`lazurio doctor\`) a doplň jen to, co chybí, postupy níže. @@ -1513,7 +1513,7 @@ Otevřený technický problém patří do GitHub Issue v přesném owning repozi exports[`rendered manual/troubleshooting.md snapshot: hosted-organization-personal / en 1`] = ` "# Installation, updates and troubleshooting - + ## Lazurio in this Environment Lazurio is installed and managed here: the product in \`~/.local/share/lazurio/\` with the command \`~/.local/bin/lazurio\`, and this Folder with its generated files \`AGENTS.md\`, \`manual/\` and \`.lazurio/\`. When the Operator asks you to “install Lazurio”, check the state (\`lazurio doctor\`) and complete only what is missing, with the procedures below. @@ -1602,7 +1602,7 @@ An open technical problem belongs in a GitHub Issue of the exact owning reposito exports[`rendered manual/troubleshooting.md snapshot: hosted-organization-team / cs 1`] = ` "# Instalace, aktualizace a řešení problémů - + ## Lazurio na tomhle Environmentu Lazurio je tu nainstalované a spravované: produkt v \`~/.local/share/lazurio/\` s příkazem \`~/.local/bin/lazurio\` a tenhle Folder s generovanými soubory \`AGENTS.md\`, \`manual/\` a \`.lazurio/\`. Když tě Operátor požádá „nainstaluj Lazurio“, ověř stav (\`lazurio doctor\`) a doplň jen to, co chybí, postupy níže. @@ -1692,7 +1692,7 @@ Otevřený technický problém patří do GitHub Issue v přesném owning repozi exports[`rendered manual/troubleshooting.md snapshot: hosted-organization-team / en 1`] = ` "# Installation, updates and troubleshooting - + ## Lazurio in this Environment Lazurio is installed and managed here: the product in \`~/.local/share/lazurio/\` with the command \`~/.local/bin/lazurio\`, and this Folder with its generated files \`AGENTS.md\`, \`manual/\` and \`.lazurio/\`. When the Operator asks you to “install Lazurio”, check the state (\`lazurio doctor\`) and complete only what is missing, with the procedures below. @@ -1782,7 +1782,7 @@ An open technical problem belongs in a GitHub Issue of the exact owning reposito exports[`rendered manual/troubleshooting.md snapshot: hosted-organization-steward / cs 1`] = ` "# Instalace, aktualizace a řešení problémů - + ## Lazurio na tomhle Environmentu Lazurio je tu nainstalované a spravované: produkt v \`~/.local/share/lazurio/\` s příkazem \`~/.local/bin/lazurio\` a tenhle Folder s generovanými soubory \`AGENTS.md\`, \`manual/\` a \`.lazurio/\`. Když tě Operátor požádá „nainstaluj Lazurio“, ověř stav (\`lazurio doctor\`) a doplň jen to, co chybí, postupy níže. @@ -1871,7 +1871,7 @@ Otevřený technický problém patří do GitHub Issue v přesném owning repozi exports[`rendered manual/troubleshooting.md snapshot: hosted-organization-steward / en 1`] = ` "# Installation, updates and troubleshooting - + ## Lazurio in this Environment Lazurio is installed and managed here: the product in \`~/.local/share/lazurio/\` with the command \`~/.local/bin/lazurio\`, and this Folder with its generated files \`AGENTS.md\`, \`manual/\` and \`.lazurio/\`. When the Operator asks you to “install Lazurio”, check the state (\`lazurio doctor\`) and complete only what is missing, with the procedures below. @@ -1960,7 +1960,7 @@ An open technical problem belongs in a GitHub Issue of the exact owning reposito exports[`this-machine.md renders relationships only when the binding carries them 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`workspace\` (workspace-vm). - Owner: Organization \`example\`. @@ -2038,7 +2038,7 @@ Lazurio enforces none of this: the Headscale policy of the Conglomerate Host doe exports[`this-machine.md renders the assignment exactly as the handover carries it 1`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`workspace\` (workspace-vm). - Owner: Organization \`example\`. @@ -2110,7 +2110,7 @@ The Integrations (connected apps) and custom MCP servers of this Environment are exports[`this-machine.md renders the assignment exactly as the handover carries it 2`] = ` "# This Environment - + ## Identity, from the recorded handover - Name: \`workspace\` (workspace-vm). - Owner: Organization \`example\`, Team \`sample-team\`. diff --git a/tests/__snapshots__/folder-render.test.ts.snap b/tests/__snapshots__/folder-render.test.ts.snap index a9ed17b3..e8c5c48f 100644 --- a/tests/__snapshots__/folder-render.test.ts.snap +++ b/tests/__snapshots__/folder-render.test.ts.snap @@ -2,7 +2,7 @@ exports[`rendered AGENTS.md snapshot: local / cs 1`] = ` "# Lazurio - + ## Tenhle Environment - Preset: \`local\` (verze 1). - Pracovní stanice Operátora bez handoveru; Owner i Operátor je přihlášený uživatel. @@ -51,7 +51,7 @@ Používej nejdřív tahle CLI z katalogu Lazuria, jak je popisuje \`manual/this exports[`rendered AGENTS.md snapshot: local / en 1`] = ` "# Lazurio - + ## This Environment - Preset: \`local\` (version 1). - The Operator's own workstation, no handover; the signed-in user is both Owner and Operator. @@ -100,7 +100,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`rendered AGENTS.md snapshot: hosted-personal / cs 1`] = ` "# Lazurio - + ## Tenhle Environment - Preset: \`hosted-personal\` (verze 1). - Název: \`example\` (personal-vm). @@ -156,7 +156,7 @@ Používej nejdřív tahle CLI z katalogu Lazuria, jak je popisuje \`manual/this exports[`rendered AGENTS.md snapshot: hosted-personal / en 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-personal\` (version 1). - Name: \`example\` (personal-vm). @@ -212,7 +212,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`rendered AGENTS.md snapshot: hosted-organization-personal / cs 1`] = ` "# Lazurio - + ## Tenhle Environment - Preset: \`hosted-organization-personal\` (verze 1). - Název: \`workspace\` (workspace-vm). @@ -268,7 +268,7 @@ Používej nejdřív tahle CLI z katalogu Lazuria, jak je popisuje \`manual/this exports[`rendered AGENTS.md snapshot: hosted-organization-personal / en 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-organization-personal\` (version 1). - Name: \`workspace\` (workspace-vm). @@ -324,7 +324,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`rendered AGENTS.md snapshot: hosted-organization-team / cs 1`] = ` "# Lazurio - + ## Tenhle Environment - Preset: \`hosted-organization-team\` (verze 1). - Název: \`workspace\` (workspace-vm). @@ -381,7 +381,7 @@ Používej nejdřív tahle CLI z katalogu Lazuria, jak je popisuje \`manual/this exports[`rendered AGENTS.md snapshot: hosted-organization-team / en 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-organization-team\` (version 1). - Name: \`workspace\` (workspace-vm). @@ -438,7 +438,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`rendered AGENTS.md snapshot: hosted-organization-steward / cs 1`] = ` "# Lazurio - + ## Tenhle Environment - Preset: \`hosted-organization-steward\` (verze 1). - Název: \`workspace\` (workspace-vm). @@ -499,7 +499,7 @@ Používej nejdřív tahle CLI z katalogu Lazuria, jak je popisuje \`manual/this exports[`rendered AGENTS.md snapshot: hosted-organization-steward / en 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-organization-steward\` (version 1). - Name: \`workspace\` (workspace-vm). @@ -560,7 +560,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`relationships render only when the recorded binding carries them, one line per peer 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-personal\` (version 1). - Name: \`example\` (personal-vm). @@ -620,7 +620,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`the Assignment line renders the handover's owner.assignment and nothing else 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-organization-personal\` (version 1). - Name: \`workspace\` (workspace-vm). @@ -677,7 +677,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`the Assignment line renders the handover's owner.assignment and nothing else 2`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-organization-team\` (version 1). - Name: \`workspace\` (workspace-vm). @@ -735,7 +735,7 @@ The complete agent manual for this Environment is in \`manual/\` (generated by t exports[`the Owner line names the Team only under hosted-organization-team 1`] = ` "# Lazurio - + ## This Environment - Preset: \`hosted-organization-personal\` (version 1). - Name: \`workspace\` (workspace-vm). diff --git a/tests/environment-browser.test.ts b/tests/environment-browser.test.ts index bb8d973f..c82e19e9 100644 --- a/tests/environment-browser.test.ts +++ b/tests/environment-browser.test.ts @@ -878,6 +878,59 @@ test("the Folder opens a new page in a new tab and names T3 Code's preview tools } }); +// How a page reaches the Operator is explained, not prescribed (F38 addendum of +// 2026-10-12): a plain link, a link to a tab of the Environment, and what each +// client does with them, with ChatGPT Desktop's own browser on the Operator's +// computer, so the agent chooses the way. +test("the Folder explains how a page reaches the Operator in each client and leaves the way to the agent", () => { + for (const locale of ["cs", "en"] as const) { + const text = renderManual({ + preset: "hosted-organization-personal", + machine: bindings.organizationBrowser, + profile: presetProfile("hosted-organization-personal", "linux", { + locale, + }), + })["manual/this-machine.md"]; + const section = text.slice( + text.indexOf( + locale === "cs" + ? "### Jak Operátor stránku uvidí" + : "### How the Operator sees a page", + ), + text.indexOf( + locale === "cs" + ? "### Práce v prohlížeči" + : "### Working in the browser", + ), + ); + const ways = + locale === "cs" + ? [ + "**Obyčejný odkaz**", + "**Odkaz na záložku Environmentu**", + "**Webové T3 Code**", + "**ChatGPT Desktop**", + "**Launchpad**", + "vyber tu, která mu dává největší smysl", + "rádi vidí rovnou vedle chatu", + ] + : [ + "**A plain link**", + "**A link to a tab of the Environment**", + "**Web T3 Code**", + "**ChatGPT Desktop**", + "**The Launchpad**", + "choose the one that makes the most sense to them", + "right beside the chat", + ]; + for (const way of ways) expect(section).toContain(way); + // A plain address the Operator opens in ChatGPT Desktop runs on their + // computer; the agent takes it into its window and sends that tab's link. + expect(section).toContain("`lazurio browser window --url <"); + expect(text).not.toMatch(/Pohled pro Operátora|The Operator's view\.\*\*/); + } +}); + // Root decision 0191 point 28: an agent lets go of its window when its work // there is done, and the hub ends the tab once nothing holds or views it. It // never closes the tab for everyone with agent-browser's `tab close`. diff --git a/tests/folder-template-revision.test.ts b/tests/folder-template-revision.test.ts index 61febe13..b614a375 100644 --- a/tests/folder-template-revision.test.ts +++ b/tests/folder-template-revision.test.ts @@ -21,8 +21,8 @@ import { bindings } from "./fixtures/machine-bindings"; // `bun test -u` does not touch it. The fixtures in `tests/fixtures` feed the // compositions too. const pinned = { - revision: "base-instructions-43", - digest: "459a4c22e46ca232fa8687c00797ec74970d9d3e2d65b714cf97847316fdaae9", + revision: "base-instructions-44", + digest: "22cb7d35de2e3fa256472f5896d290d723ecb81d8efaaf122685985311c48a96", } as const; const optionalTools = activatableTools() diff --git a/tests/folder-tools.test.ts b/tests/folder-tools.test.ts index 7bb1ce8f..acbe51bd 100644 --- a/tests/folder-tools.test.ts +++ b/tests/folder-tools.test.ts @@ -719,7 +719,7 @@ test("a profile change and a handover refresh carry the enabled tools forward", }); test("a Folder rendered by an older template revision is upgraded by a tools change", async () => { - expect(instructionTemplateRevision).toBe("base-instructions-43"); + expect(instructionTemplateRevision).toBe("base-instructions-44"); const { preferences, manifest } = await planned(); const older = { ...manifest, @@ -742,7 +742,7 @@ test("a Folder rendered by an older template revision is upgraded by a tools cha recorded, ); if (upgrade.kind !== "profile-change") throw new Error("Expected upgrade"); - expect(upgrade.manifest.templateRevision).toBe("base-instructions-43"); + expect(upgrade.manifest.templateRevision).toBe("base-instructions-44"); expect(upgrade.previous).toEqual(older.outputs); expect(enabledTools(upgrade.preferences)).toEqual(tools); expect(upgrade.files).toEqual( From 01a489bb208b3dcde1bb0222ba819d307b74654c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Such=C3=A1nek?= Date: Mon, 12 Oct 2026 20:54:50 +0200 Subject: [PATCH 2/2] Folder: web T3 opens the panel by itself only for a thread in view, and --url never moves a window (Pablo's review of #353) Two claims of the new browser section did not match the clients: - `lazurio browser window --url` keeps a window the session already has and ignores the address, so the ChatGPT Desktop point now sends the agent to the new-tab point (a new tab of the Environment browser, or another window of its own), and "Your window" says that `--url` applies only to a new window. The window test pins that an address never moves the open window. - Web T3 Code opens the panel by itself only for a new reveal while the thread is in view on a wide screen; a thread the Operator comes to later, or a narrow screen, keeps the agent's tab waiting in the panel's strip. The F38 addendum says the same. base-instructions-44 is not released yet, so its digest is pinned again under the same revision. Co-Authored-By: Claude Opus 5.5 --- docs/decisions.md | 4 ++- src/folder/manual.ts | 12 ++++----- tests/environment-browser.test.ts | 37 ++++++++++++++++++++++++-- tests/folder-template-revision.test.ts | 2 +- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/docs/decisions.md b/docs/decisions.md index 68938c7c..8f320802 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -5745,7 +5745,9 @@ several ways: - a plain link opens it in their own browser on their computer; - a link to a tab of the Environment shows that tab of the Environment browser, with the Environment's sign-ins and network; -- web T3 Code shows the thread's window in its right panel by itself. +- web T3 Code puts the thread's window in its right panel's strip by itself, and opens the + panel on it while the thread is in view on a wide screen; otherwise the tab waits in the + strip. Each client does something else with each of them: ChatGPT Desktop's built-in browser and the right panel of the T3 Code desktop app run on the Operator's computer. Rules for which diff --git a/src/folder/manual.ts b/src/folder/manual.ts index f1ee14c2..67deceee 100644 --- a/src/folder/manual.ts +++ b/src/folder/manual.ts @@ -1973,12 +1973,12 @@ function environmentBrowser(preset: PresetName): readonly Text[] { "- **A link to a tab of the Environment** (`https://browser.…/t/`) shows exactly that tab of the Environment browser, with the same page, sign-ins and network as you have. You both work in it at the same time, and control is never handed over. A window the page opens as a pop-up (Sign in with Google, say) shows in the same tab, and the view offers the Operator a new tab the page opens. It suits a page that needs the Environment (its sign-ins, the Organization's network or this Environment's `localhost`), a page you work in while the Operator should see what you do, and a page where they are to finish something, a form or a sign-in say. Never send the bare address `https://browser.…/`, which always starts a new blank tab.", ), t( - "- **Webové T3 Code** tohoto Environmentu má prohlížeč Environmentu v pravém panelu a jeho nástroje náhledu (`preview_*`) ovládají právě ten: každá jejich záložka je okno prohlížeče Environmentu. Okno tvého vlákna se v panelu ukáže samo: jakmile v prohlížeči začneš pracovat (`lazurio browser window`, `preview_open`), panel se na něm otevře. Na úzké obrazovce, kde panel zakrývá chat, se sám neotevře a záložka v něm na Operátora počká. Klik na odkaz na záložku Environmentu ve vlákně ji otevře jako další záložku panelu, klik na obyčejný odkaz otevře nový tab Operátorova prohlížeče. Desktopová aplikace T3 Code má zatím v pravém panelu prohlížeč počítače, na kterém běží: prohlížeč Environmentu v ní Operátor uvidí přes odkaz na záložku Environmentu.", - "- **Web T3 Code** of this Environment has the Environment browser in its right panel, and its preview tools (`preview_*`) drive that browser: each of their tabs is a window of the Environment browser. Your thread's window shows in the panel by itself: as soon as you start browser work (`lazurio browser window`, `preview_open`), the panel opens on it. On a narrow screen, where the panel covers the chat, it does not open by itself, and the tab waits in it for the Operator. A click on a link to a tab of the Environment in the thread opens it as another tab of the panel; a click on a plain link opens a new tab of the Operator's browser. For now, the right panel of the T3 Code desktop app shows the browser of the computer it runs on: there the Operator sees the Environment browser through a link to a tab of the Environment.", + "- **Webové T3 Code** tohoto Environmentu má prohlížeč Environmentu v pravém panelu a jeho nástroje náhledu (`preview_*`) ovládají právě ten: každá jejich záložka je okno prohlížeče Environmentu. Okno tvého vlákna se v liště panelu objeví samo. Když má Operátor vlákno otevřené na široké obrazovce, panel se na tvém okně otevře sám, jakmile v prohlížeči začneš pracovat (`lazurio browser window`, `preview_open`). Když do vlákna přijde až potom, nebo má úzkou obrazovku, kde panel zakrývá chat, panel se sám neotevře a záložka na něj počká v liště panelu. Klik na odkaz na záložku Environmentu ve vlákně ji otevře jako další záložku panelu, klik na obyčejný odkaz otevře nový tab Operátorova prohlížeče. Desktopová aplikace T3 Code má zatím v pravém panelu prohlížeč počítače, na kterém běží: prohlížeč Environmentu v ní Operátor uvidí přes odkaz na záložku Environmentu.", + "- **Web T3 Code** of this Environment has the Environment browser in its right panel, and its preview tools (`preview_*`) drive that browser: each of their tabs is a window of the Environment browser. Your thread's window appears in the panel's strip by itself. When the Operator has the thread open on a wide screen, the panel opens on your window by itself as soon as you start browser work (`lazurio browser window`, `preview_open`). When they come to the thread only later, or have a narrow screen where the panel covers the chat, the panel does not open by itself, and the tab waits for them in the panel's strip. A click on a link to a tab of the Environment in the thread opens it as another tab of the panel; a click on a plain link opens a new tab of the Operator's browser. For now, the right panel of the T3 Code desktop app shows the browser of the computer it runs on: there the Operator sees the Environment browser through a link to a tab of the Environment.", ), t( - "- **ChatGPT Desktop** (dřív Codex Desktop), ze kterého sem pracuješ přes SSH, má vestavěný prohlížeč na Operátorově počítači, ne tady. Odkaz na záložku Environmentu v něm ukáže prohlížeč Environmentu, obyčejný odkaz načte stránku na Operátorově počítači. Když si tam Operátor sám otevře záložku s obyčejnou adresou, stránka běží mimo Environment: nevidíš ji a nemá přihlášení ani síť Environmentu. Máš-li v ní pracovat, nebo stránka Environment potřebuje, otevři ji ve svém okně (`lazurio browser window --url `) a pošli mu odkaz na tu záložku, ať ji v ChatGPT Desktopu otevře místo své.", - "- **ChatGPT Desktop** (formerly Codex Desktop), from which you work here over SSH, has its built-in browser on the Operator's computer, not here. A link to a tab of the Environment shows the Environment browser in it; a plain link loads the page on the Operator's computer. When the Operator opens a tab there with a plain address themselves, the page runs outside the Environment: you do not see it, and it has neither the Environment's sign-ins nor its network. When you are to work in it, or the page needs the Environment, open it in your window (`lazurio browser window --url
`) and send them the link to that tab, to open in ChatGPT Desktop instead of theirs.", + "- **ChatGPT Desktop** (dřív Codex Desktop), ze kterého sem pracuješ přes SSH, má vestavěný prohlížeč na Operátorově počítači, ne tady. Odkaz na záložku Environmentu v něm ukáže prohlížeč Environmentu, obyčejný odkaz načte stránku na Operátorově počítači. Když si tam Operátor sám otevře záložku s obyčejnou adresou, stránka běží mimo Environment: nevidíš ji a nemá přihlášení ani síť Environmentu. Máš-li v ní pracovat, nebo stránka Environment potřebuje, otevři ji v nové záložce prohlížeče Environmentu (bod Nová záložka níž) a pošli mu odkaz na ni, ať ji v ChatGPT Desktopu otevře místo své.", + "- **ChatGPT Desktop** (formerly Codex Desktop), from which you work here over SSH, has its built-in browser on the Operator's computer, not here. A link to a tab of the Environment shows the Environment browser in it; a plain link loads the page on the Operator's computer. When the Operator opens a tab there with a plain address themselves, the page runs outside the Environment: you do not see it, and it has neither the Environment's sign-ins nor its network. When you are to work in it, or the page needs the Environment, open it in a new tab of the Environment browser (the point A new tab below) and send them its link, to open in ChatGPT Desktop instead of theirs.", ), t( "- **Launchpad** ukazuje v Nové kartě (Přehled) všechny záložky Environmentu, tu tvoji taky, a Operátor si ji odtud vezme do své lišty. Odkaz na záložku Environmentu otevře i v běžném tabu nebo na telefonu, všude, kde se do tohoto Environmentu přihlásí.", @@ -1996,8 +1996,8 @@ function environmentBrowser(preset: PresetName): readonly Text[] { "- **\"The open browser\".** When the Operator talks about the browser they have open, or asks what is in it, they mostly mean the Environment browser: the right panel of T3 Code or of the Launchpad, or your link. In ChatGPT Desktop it can also be a tab of its built-in browser with a plain address, which runs on their computer. `curl -s http://127.0.0.1:9222/json/list` lists what the Environment's windows have open (each page's address and title).", ), t( - "- **Tvoje okno.** Na začátku práce s prohlížečem spusť `lazurio browser window` (případně `--url `). Otevře okno tvého vlákna, nebo najde to, které už máš, a vypíše jméno sezení, odkaz na tvou záložku v pohledu (`https://browser.…/t/`) a příkaz, kterým v okně pracuješ. Jméno sezení plyne z vlákna (`AGENT_BROWSER_SESSION`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`); jinak ho zadej `--session `.", - "- **Your window.** When you start browser work, run `lazurio browser window` (optionally `--url
`). It opens your thread's window, or finds the one you have, and prints the session name, the link to your tab in the people's view (`https://browser.…/t/`) and the command to work in the window with. The session name follows from the thread (`AGENT_BROWSER_SESSION`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`); otherwise give it with `--session `.", + "- **Tvoje okno.** Na začátku práce s prohlížečem spusť `lazurio browser window` (případně `--url `). Otevře okno tvého vlákna, nebo najde to, které už máš, a vypíše jméno sezení, odkaz na tvou záložku v pohledu (`https://browser.…/t/`) a příkaz, kterým v okně pracuješ. Adresa z `--url` platí jen pro nové okno: okno, které už máš, nikam nepřevede. Jméno sezení plyne z vlákna (`AGENT_BROWSER_SESSION`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`); jinak ho zadej `--session `.", + "- **Your window.** When you start browser work, run `lazurio browser window` (optionally `--url
`). It opens your thread's window, or finds the one you have, and prints the session name, the link to your tab in the people's view (`https://browser.…/t/`) and the command to work in the window with. `--url` applies only to a new window: it never moves the window you already have. The session name follows from the thread (`AGENT_BROWSER_SESSION`, `CODEX_THREAD_ID`, `CLAUDE_CODE_SESSION_ID`); otherwise give it with `--session `.", ), t( '- **Práce v okně.** `agent-browser --cdp 9222 --session `: například `open `, `snapshot -i`, `click @e1`, `fill @e2 "text"`, `screenshot `, `get url`. Vždy s `--cdp 9222` a svým `--session`: bez `--cdp` by agent-browser spustil vlastní prohlížeč bez přihlášení Environmentu a Operátor by ho neviděl. Nepoužívej `window new` (otevře izolované okno bez přihlášení), `--profile`, `--headed`, `set device` ani `set viewport`: velikost stránky určuje pohled Operátora.', diff --git a/tests/environment-browser.test.ts b/tests/environment-browser.test.ts index c82e19e9..76529bf9 100644 --- a/tests/environment-browser.test.ts +++ b/tests/environment-browser.test.ts @@ -661,6 +661,10 @@ test("a thread's window: the bound one while it is open, otherwise a new window targetId: "OPEN", created: false, }); + // An address never moves the open window (the Folder manual says so). + expect( + await ensureThreadWindow("codex-a", "https://example.org", reused.seams), + ).toEqual({ session: "codex-a", targetId: "OPEN", created: false }); expect(reused.calls).toEqual([]); // Bound but closed, or never bound: a new window in the default context @@ -924,9 +928,38 @@ test("the Folder explains how a page reaches the Operator in each client and lea "right beside the chat", ]; for (const way of ways) expect(section).toContain(way); + const bullet = (lead: string) => + section.split("\n").find((line) => line.startsWith(`- **${lead}`)) ?? ""; // A plain address the Operator opens in ChatGPT Desktop runs on their - // computer; the agent takes it into its window and sends that tab's link. - expect(section).toContain("`lazurio browser window --url <"); + // computer: the agent opens it in a new tab of the Environment browser, + // never with `lazurio browser window --url`, which keeps a window it has. + const desktop = bullet("ChatGPT Desktop"); + expect(desktop).toContain( + locale === "cs" ? "bod Nová záložka" : "the point A new tab", + ); + expect(desktop).not.toContain("lazurio browser window"); + // Web T3 opens the panel by itself only for a thread in view on a wide + // screen; otherwise the agent's tab waits in the strip. + expect( + bullet(locale === "cs" ? "Webové T3 Code" : "Web T3 Code"), + ).toContain( + locale === "cs" + ? "počká v liště panelu" + : "waits for them in the panel's strip", + ); + const yourWindow = + text + .split("\n") + .find((line) => + line.startsWith( + locale === "cs" ? "- **Tvoje okno.**" : "- **Your window.**", + ), + ) ?? ""; + expect(yourWindow).toContain( + locale === "cs" + ? "Adresa z `--url` platí jen pro nové okno" + : "`--url` applies only to a new window", + ); expect(text).not.toMatch(/Pohled pro Operátora|The Operator's view\.\*\*/); } }); diff --git a/tests/folder-template-revision.test.ts b/tests/folder-template-revision.test.ts index b614a375..7b32a3d8 100644 --- a/tests/folder-template-revision.test.ts +++ b/tests/folder-template-revision.test.ts @@ -22,7 +22,7 @@ import { bindings } from "./fixtures/machine-bindings"; // compositions too. const pinned = { revision: "base-instructions-44", - digest: "22cb7d35de2e3fa256472f5896d290d723ecb81d8efaaf122685985311c48a96", + digest: "baba44d2bc9d107005c03a4bee7d73c012553eb5ec351c469dc7cd4aa35b35f0", } as const; const optionalTools = activatableTools()