Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/web/src/lazurio/LazurioEnvironmentBrowser.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,14 @@ describe("the panel's Environment browser frames", () => {
expect(container.textContent).toBe("");
});

it("name their frames in Czech for assistive technology where the browser is Czech", async () => {
vi.spyOn(window.navigator, "language", "get").mockReturnValue("cs-CZ");
withSnapshot(snapshot([{ tabId: id(1) }]));
await showPanel(threadA, [tab(1), foreignTab], tab(1).id);
expect(frameOf(viewOf(1)).title).toBe("Prohlížeč Prostředí");
expect(frameOf(foreignView).title).toBe("Prohlížeč jiného Prostředí");
});

it("make a fresh frame of a tab reloaded through the store, also of one behind the tab in view", async () => {
withSnapshot(snapshot([{ tabId: id(1) }, { tabId: id(2) }]));
await showPanel(threadA, [tab(1), tab(2)], tab(1).id);
Expand Down
13 changes: 9 additions & 4 deletions apps/web/src/lazurio/LazurioEnvironmentBrowser.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ export const ENVIRONMENT_ELEMENT = "lazurio-environment";
/** Another Environment's view, said without naming it: its frame's title, and its name until the
* shell knows that Environment, or where the Environment's Platform predates the element. */
const anotherEnvironment = (czech: boolean) =>
czech ? "Prohlížeč jiného Environmentu" : "Another Environment's browser";
czech ? "Prohlížeč jiného Prostředí" : "Another Environment's browser";

/** Another Environment's name over the notice to sign in there, where its view, whose own bar names
* it, did not come up: the shell's `<lazurio-environment>`, which shows its children until the
Expand Down Expand Up @@ -502,8 +502,13 @@ function LazurioEnvironmentBrowser(props: {
}, [isForeign, view, request, loaded, cameUp]);
const signIn = isForeign && Boolean(view) && late === request && cameUp !== request;
const czech = prefersCzech();
// The frame's name for assistive technology.
const title = foreign === null ? "Environment browser" : anotherEnvironment(czech);
// The frame's name for assistive technology, in the overlay's language.
const title =
foreign === null
? czech
? "Prohlížeč Prostředí"
: "Environment browser"
: anotherEnvironment(czech);

return (
<div className={cn("flex min-h-0 flex-1 flex-col", isForeign && "border-2 border-warning")}>
Expand Down Expand Up @@ -535,7 +540,7 @@ function LazurioEnvironmentBrowser(props: {
<EmptyHeader>
<EmptyTitle>
{czech
? "Přihlaste se do prohlížeče tohoto Environmentu"
? "Přihlaste se do prohlížeče tohoto Prostředí"
: "Sign in to this Environment's browser"}
</EmptyTitle>
<EmptyDescription>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/lazurio/LazurioNewTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ function NewTabView(props: {
<EmptyTitle>{czech ? "Nová karta" : "New tab"}</EmptyTitle>
<EmptyDescription>
{czech
? "Nová karta se ukáže, až Environment nabídne svůj prohlížeč."
? "Nová karta se ukáže, až Prostředí nabídne svůj prohlížeč."
: "New tab shows once the Environment offers its browser."}
</EmptyDescription>
</EmptyHeader>
Expand Down
6 changes: 6 additions & 0 deletions apps/web/src/lazurio/LazurioSignIn.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ describe("a managed Codex account on a Lazurio Environment", () => {
// T3's own sign-in stays closed: only the Getting started page, no way back into it.
expect(container.textContent).not.toMatch(/Continue with ChatGPT|Change account|Reconnect/);
expect(container.querySelector("a")?.getAttribute("href")).toBe(toolsUrl);
// The row says where to sign in and what to do, not how Lazurio shares a sign-in (DEV-6665).
expect(container.textContent).toContain(
"Codex and Claude sign in through Lazurio on the Getting started page.",
);
expect(container.textContent).toContain("Disconnect it and sign Codex in through Lazurio.");
expect(container.textContent).not.toMatch(/the terminal|instance|only T3 Code uses/);

logout.mockResolvedValue({
_tag: "Success",
Expand Down
22 changes: 11 additions & 11 deletions apps/web/src/lazurio/LazurioSignIn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,33 +23,33 @@ export function useLazurioSignIn(environmentId: EnvironmentId | null) {
return lazurioSignInOf(useAtomValue(serverEnvironment.configValueAtom(environmentId)));
}

/** The words, Czech where the person's browser is, as the rest of the overlay (root decision 0199). */
/**
* The words, Czech where the person's browser is, as the rest of the overlay (root decision 0199):
* where Codex and Claude sign in, and what to do with an account only T3 uses. Why the sign-in
* lives in Lazurio is not for the person (DEV-6665, LazurioPlatform F36's addendum of 2026-10-16).
*/
const signInWords = (czech: boolean) =>
czech
? {
title: "Přihlášení přes Lazurio",
page: "Na Environmentu Lazuria se Codex a Claude přihlašují v Lazuriu na stránce Začínáme. Přihlášení pak platí pro T3, terminál i všechny agenty.",
noPage:
"Na Environmentu Lazuria se Codex a Claude přihlašují v Lazuriu. Přihlášení pak platí pro T3, terminál i všechny agenty.",
page: "Codex a Claude se přihlašují v Lazuriu na stránce Začínáme.",
noPage: "Codex a Claude se přihlašují v Lazuriu.",
open: "Otevřít Začínáme",
close: "Zavřít",
t3Account: "Účet ChatGPT v T3 Code",
t3AccountSignedIn:
"Tato instance je ještě přihlášená k účtu ChatGPT, který používá jen T3 Code. Odpojte ho tady; Codex se pak přihlašuje přes Lazurio.",
t3AccountSignedIn: "Odpojte ho a přihlaste Codex přes Lazurio.",
disconnect: "Odpojit",
disconnecting: "Odpojuji…",
disconnectFailed: "Účet ChatGPT se nepodařilo odpojit",
}
: {
title: "Sign in through Lazurio",
page: "On a Lazurio Environment, Codex and Claude sign in through Lazurio on the Getting started page. The sign-in then works for T3, the terminal and every agent.",
noPage:
"On a Lazurio Environment, Codex and Claude sign in through Lazurio. The sign-in then works for T3, the terminal and every agent.",
page: "Codex and Claude sign in through Lazurio on the Getting started page.",
noPage: "Codex and Claude sign in through Lazurio.",
open: "Open Getting started",
close: "Close",
t3Account: "ChatGPT account in T3 Code",
t3AccountSignedIn:
"This instance is still signed in to a ChatGPT account that only T3 Code uses. Disconnect it here; Codex then signs in through Lazurio.",
t3AccountSignedIn: "Disconnect it and sign Codex in through Lazurio.",
disconnect: "Disconnect",
disconnecting: "Disconnecting…",
disconnectFailed: "Could not disconnect the ChatGPT account",
Expand Down
22 changes: 12 additions & 10 deletions apps/web/src/lazurio/ManagedFolderWelcome.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,27 +52,29 @@ export function useManagedFirstRunDecision(upstream: FirstRun): FirstRun {
}

/** The welcome's words: Czech where the person's browser is, with formal address (root decision
* 0199) and "Environment" for the place (root decision 0170), as the rest of the overlay. */
* 0199) and "Prostředí" for the place (root decision 0170 with its addendum of 2026-10-15), as the
* rest of the overlay. They say where a chat starts and what to do, not what the Folder gives an
* agent (DEV-6665, LazurioPlatform F36's addendum of 2026-10-16). */
const welcomeWords = (czech: boolean) =>
czech
? {
title: "Váš pracovní prostor je připravený",
folder:
"Každý nový chat začíná ve vašem Lazurio Folderu, který vašemu agentovi dává kontext tohoto Environmentu a Organizací, se kterými můžete pracovat.",
eyebrow: "Prostředí Lazuria",
title: "Vaše Prostředí je připravené",
folder: "Každý nový chat začíná ve vašem Lazurio Folderu.",
inside: "Vaše projekty a repozitáře jsou v tomto Folderu. Není potřeba nic importovat.",
connectBefore: "Účet agenta připojte v ",
connectLink: "nastavení Environmentu",
connectLink: "nastavení Prostředí",
connectAfter:
" a pak se sem vraťte. Účet, který tam už je připojený, můžete rovnou použít.",
connected: "Použijte účet agenta připojený k tomuto Environmentu.",
connected: "Použijte účet agenta připojený k tomuto Prostředí.",
failed: "Lazurio se nepodařilo otevřít. Zkuste to prosím znovu.",
opening: "Otevírám…",
start: "Začít v Lazuriu",
}
: {
title: "Your workspace is ready",
folder:
"Every new chat starts in your Lazurio Folder. It gives your agent the context for this Environment and the Organizations you can work with.",
eyebrow: "Lazurio Environment",
title: "Your Environment is ready",
folder: "Every new chat starts in your Lazurio Folder.",
inside:
"Your projects and repositories live inside this Folder. There is nothing to import.",
connectBefore: "Connect your agent account in ",
Expand Down Expand Up @@ -105,7 +107,7 @@ export function ManagedFolderWelcome() {
<main className="flex min-h-dvh items-center justify-center bg-background px-6 text-foreground">
<section className="w-full max-w-xl space-y-6 rounded-xl border border-border p-8">
<div>
<p className="text-sm text-muted-foreground">Lazurio Environment</p>
<p className="text-sm text-muted-foreground">{words.eyebrow}</p>
<h1 className="mt-2 text-2xl font-semibold">{words.title}</h1>
</div>
<p>{words.folder}</p>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/lazurio/threadTabs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ describe("closing in the strip and Vrátit", () => {
true,
).description,
).toBe("Dál je v Apps a ve vlákně „Web“.");
expect(closeToastText([shared], true).description).toBe("Zavře se v Environmentu.");
expect(closeToastText([shared], true).description).toBe("Zavře se v Prostředí.");
expect(closeToastText([shared, { ...shared, agent: true }], false)).toEqual({
title: "The tabs left this thread.",
description:
Expand Down
10 changes: 5 additions & 5 deletions apps/web/src/lazurio/threadTabs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ export function closeToastText(
? `Dál je ${placesOf(tab.alsoHeldBy, true)}.`
: `It stays ${placesOf(tab.alsoHeldBy, false)}.`
: czech
? "Zavře se v Environmentu."
? "Zavře se v Prostředí."
: "It closes in the Environment.",
};
}
Expand All @@ -292,10 +292,10 @@ export function closeToastText(
: "They stay open elsewhere or with an agent."
: staying === 0
? czech
? "Zavřou se v Environmentu."
? "Zavřou se v Prostředí."
: "They close in the Environment."
: czech
? "Některé zůstávají otevřené jinde nebo u agenta, ostatní se zavřou v Environmentu."
? "Některé zůstávají otevřené jinde nebo u agenta, ostatní se zavřou v Prostředí."
: "Some stay open elsewhere or with an agent; the others close in the Environment.",
};
}
Expand Down Expand Up @@ -575,7 +575,7 @@ export function leaveDraft(threadRef: ScopedThreadRef): void {
/** The empty panel's line on a draft (Lazurio/t3code#53; the Admin chose it on 2026-10-12). */
export const draftBrowserNote = (czech: boolean) =>
czech
? "Prohlížeč Environmentu bude k dispozici po první zprávě."
? "Prohlížeč Prostředí bude k dispozici po první zprávě."
: "The Environment browser comes with the first message.";

const RETRY_DELAYS_MS = [1_000, 2_000, 4_000, 8_000, 16_000, 30_000];
Expand Down Expand Up @@ -627,7 +627,7 @@ export function holdTab(threadRef: ScopedThreadRef, tabId: string): void {
stackedThreadToast({
type: "warning",
title: czech
? "Vlákno si tuhle záložku neponechá."
? "Vlákno si tuto záložku neponechá."
: "This thread does not keep this tab.",
description:
outcome.status === 409
Expand Down
6 changes: 3 additions & 3 deletions docs/operations/lazurio-overlay.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ T3 žádný prohlížeč nemá, a tak overlay dělá tohle:
404, který EventSource znovu nezkouší, a koncept si po první zprávě nechá
stejný ref vlákna. Proto koncept proud neotevře a jeho prázdný panel zůstane
upstream, jen místo „Only available in the desktop app.“ řekne pod seznamem
i jako důvod u řádku Browser „Prohlížeč Environmentu bude k dispozici po
i jako důvod u řádku Browser „Prohlížeč Prostředí bude k dispozici po
první zprávě.“ Jakmile ho ChatView přestane označovat za koncept, proud se
otevře a panel ukáže Novou kartu. Kde server o jiném vlákně řekl, že
Environment prohlížeč nemá, zůstane upstream řádek. Menu „+“ při jiných
Expand Down Expand Up @@ -220,13 +220,13 @@ T3 žádný prohlížeč nemá, a tak overlay dělá tohle:
`.lazurio.io` (`viewEnvironmentId`, například `vm-01.acme` nebo `jana`).
Vlastní pravidlo pojmenování fork nemá. Dokud shell stránky ten Environment
nezná, a na Platformě bez prvku, ukáže prvek jen „Prohlížeč jiného
Environmentu“. Jazyk volí overlay jako
Prostředí“. Jazyk volí overlay jako
pohled sám, podle jazyka prohlížeče (`cs`). Rám posílá
`referrerPolicy="origin"`, podle kterého pohled jiného Environmentu dovolí
zarámování T3 nebo Launchpadu (změna LazurioPlatform). Když pohled do 4 s od
načtení rámu (15 s, když se nenačte) neohlásí svou záložku, typicky bez
sezení v bráně toho Environmentu, ukáže panel „Přihlaste se do prohlížeče
tohoto Environmentu“ s otevřením pohledu v nové záložce a Reload: přihlašovací
tohoto Prostředí“ s otevřením pohledu v nové záložce a Reload: přihlašovací
stránka Lazuria se v rámu nevykreslí. Pohled otevře v nové záložce i menu záložky.
- **Rámy zůstávají připojené.** Dokud pravý panel ukazuje vlákno, má každá jeho
záložka prohlížeče Environmentu svůj rám připojený, i když je vpředu jiná
Expand Down
Loading