Skip to content

Commit 0f7e205

Browse files
committed
fix(browser): Chrome or Chromium before Edge on Linux
Edge is the rarer one on Linux, and on the Ubuntu runner it took seconds to open the first tab of each new profile, past the 5 s the daemon waits, where Chrome took under one. CI no longer starts Edge before the tests.
1 parent 39dd330 commit 0f7e205

3 files changed

Lines changed: 9 additions & 17 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,6 @@ jobs:
6464
sudo chmod 4755 "$helper"
6565
fi
6666
done
67-
# Edge's first start on a fresh runner took over 20 s, and the next
68-
# ones under one. Starting it once keeps the tests off that wait.
69-
- name: Start Edge once
70-
if: runner.os == 'Linux'
71-
run: |
72-
dir=$(mktemp -d)
73-
microsoft-edge-stable --headless=new --remote-debugging-port=0 --no-first-run \
74-
--user-data-dir="$dir" about:blank > /dev/null 2>&1 &
75-
for i in $(seq 1 120); do [ -f "$dir/DevToolsActivePort" ] && break; sleep 0.5; done
76-
kill $! || true
7767
- run: cargo test
7868

7969
app:

‎crates/botloftd/src/browser/program.rs‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Which browser a bot runs (spec 21.2): the one in the config, else the
22
//! Edge that comes with Windows, or the first Edge, Chrome or Chromium
3-
//! installed on Linux and macOS.
3+
//! installed on macOS (Chrome or Chromium first on Linux).
44
55
use std::path::PathBuf;
66

@@ -55,17 +55,19 @@ fn installed() -> Vec<PathBuf> {
5555
.collect()
5656
}
5757

58-
/// The commands the Edge, Chrome and Chromium packages install, on the
59-
/// owner's `PATH`.
58+
/// The commands the Chrome, Chromium and Edge packages install, on the
59+
/// owner's `PATH`. Edge comes last: it is the rarer one on Linux, and on
60+
/// the Ubuntu runner its first start with each new profile took seconds
61+
/// where Chrome took under one.
6062
#[cfg(all(unix, not(target_os = "macos")))]
6163
fn installed() -> Vec<PathBuf> {
6264
const COMMANDS: &[&str] = &[
63-
"microsoft-edge-stable",
64-
"microsoft-edge",
6565
"google-chrome-stable",
6666
"google-chrome",
6767
"chromium",
6868
"chromium-browser",
69+
"microsoft-edge-stable",
70+
"microsoft-edge",
6971
];
7072
let path = crate::platform::user_environment()
7173
.ok()

‎docs/spec.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,9 +1185,9 @@ Cada bot tem um navegador próprio para pesquisar e usar sites: um Microsoft Edg
11851185
### 21.2 Processo
11861186

11871187
- Sobe na primeira tool `browser_*` do bot e fica aberto enquanto ele o usa. Um processo por bot.
1188-
- Comando: `msedge.exe --headless=new --remote-debugging-port=0 --user-data-dir=<home>\browsers\<bot_id> --no-first-run --no-default-browser-check --mute-audio --disable-extensions --disable-sync about:blank`. Sem `--disable-extensions`, um perfil novo recebe as extensões instaladas para todo o computador, e elas abrem abas próprias no navegador do bot (visto com o Edge 154). Com a porta 0, o Edge escolhe uma porta livre em 127.0.0.1 e a escreve com o caminho do WebSocket em `DevToolsActivePort`, na pasta do perfil (visto com o Edge 154); o daemon apaga o arquivo antigo antes de subir e espera o novo por até 30 s. Costuma levar menos de 1 s, mas a primeira abertura do Edge num Linux novo (o runner Ubuntu do CI) passou de 20 s. Se o navegador fecha ou não fica pronto, o erro traz a linha do stderr dele que melhor explica (uma falha de sandbox ou de namespace, senão a primeira fatal, senão a última); o stderr não vai para o log.
1188+
- Comando: `msedge.exe --headless=new --remote-debugging-port=0 --user-data-dir=<home>\browsers\<bot_id> --no-first-run --no-default-browser-check --mute-audio --disable-extensions --disable-sync about:blank`. Sem `--disable-extensions`, um perfil novo recebe as extensões instaladas para todo o computador, e elas abrem abas próprias no navegador do bot (visto com o Edge 154). Com a porta 0, o Edge escolhe uma porta livre em 127.0.0.1 e a escreve com o caminho do WebSocket em `DevToolsActivePort`, na pasta do perfil (visto com o Edge 154); o daemon apaga o arquivo antigo antes de subir e espera o novo por até 30 s. Costuma levar menos de 1 s, mas a primeira abertura do Edge no runner Ubuntu do CI passou de 20 s. Se o navegador fecha ou não fica pronto, o erro traz a linha do stderr dele que melhor explica (uma falha de sandbox ou de namespace, senão a primeira fatal, senão a última); o stderr não vai para o log.
11891189
- Como o `claude.exe`: sem janela (`CREATE_NO_WINDOW`), num Job Object próprio com `KILL_ON_JOB_CLOSE` (morre junto com o daemon) e com o ambiente padrão do usuário (7.4).
1190-
- Achar o Edge: `[browser] path`, senão `msedge.exe` em `%ProgramFiles(x86)%` e `%ProgramFiles%` (`Microsoft\Edge\Application`) e em `%LOCALAPPDATA%`. No macOS, Edge, Chrome ou Chromium em `/Applications` e em `~/Applications`; no Linux, o primeiro de `microsoft-edge-stable`, `microsoft-edge`, `google-chrome-stable`, `google-chrome`, `chromium` e `chromium-browser` no `PATH` do ambiente do dono (14.1). Fora do Windows, o grupo de processos faz o papel do Job Object (14.1). Sem navegador, a tool responde ao bot que ele não está disponível, e o painel diz o mesmo.
1190+
- Achar o Edge: `[browser] path`, senão `msedge.exe` em `%ProgramFiles(x86)%` e `%ProgramFiles%` (`Microsoft\Edge\Application`) e em `%LOCALAPPDATA%`. No macOS, Edge, Chrome ou Chromium em `/Applications` e em `~/Applications`; no Linux, o primeiro de `google-chrome-stable`, `google-chrome`, `chromium`, `chromium-browser`, `microsoft-edge-stable` e `microsoft-edge` no `PATH` do ambiente do dono (14.1). O Edge vem por último no Linux: é o menos comum lá, e no runner Ubuntu do CI ele levou segundos para abrir a primeira aba de cada perfil novo (passando dos 5 s de espera da primeira aba), onde o Chrome levou menos de 1. Fora do Windows, o grupo de processos faz o papel do Job Object (14.1). Sem navegador, a tool responde ao bot que ele não está disponível, e o painel diz o mesmo.
11911191
- **Perfil:** `<home>\browsers\<bot_id>\`, fora da pasta do bot e em `%LOCALAPPDATA%` (5): cookies e sessões são do navegador, não dos arquivos que o bot faz. O perfil fica entre aberturas, então um login feito continua valendo. Arquivar ou excluir o bot fecha o navegador e apaga o perfil.
11921192
- **Descansar:** um navegador aberto que ninguém usa não deve gastar o computador. Assim que o turno do bot termina (o estado dele deixa de ser `busy` ou `needs_approval`, 7.1), o daemon põe o navegador para descansar: tira um quadro da aba ativa, para o painel ter o que mostrar, e minimiza a janela do Edge (`Browser.setWindowBounds` com `windowState: "minimized"`; a janela já não aparecia, mas para o Edge ela existe). As páginas passam a valer como as de uma janela minimizada: `visibilityState` vira `hidden`, os timers caem para um por segundo ou menos, animações e quadros param. Medido com o Edge 154, uma página que gastava 90% de um núcleo fica abaixo de 1% (19). Nada se perde: abas, formulários e sessões continuam como estavam. Não descansa no meio de uma tool nem nas mãos do dono (21.10).
11931193
- **Acordar:** na hora, com a janela de volta a `normal`, na próxima tool `browser_*` do bot, quando o dono assume o controle e quando ele recarrega a página. Depois de algo que o dono fez com o bot fora de um turno, o navegador volta a descansar sozinho: 20 s sem uso, conferido a cada 30 s.

0 commit comments

Comments
 (0)