@diegosouzacdv/jev-browser-mcp 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -27
- package/docs/jev-browser-mcp.md +90 -27
- package/mcp_servers/jev-browser-npm/src/flow.mjs +575 -157
- package/mcp_servers/jev-browser-npm/src/server.mjs +146 -92
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ versão em produção, use o número explícito no argumento do pacote:
|
|
|
17
17
|
"mcpServers": {
|
|
18
18
|
"jev-browser": {
|
|
19
19
|
"command": "npx",
|
|
20
|
-
"args": ["--yes", "@diegosouzacdv/jev-browser-mcp@0.7.
|
|
20
|
+
"args": ["--yes", "@diegosouzacdv/jev-browser-mcp@0.7.1"],
|
|
21
21
|
"env": {
|
|
22
22
|
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
|
|
23
23
|
"JEV_BROWSER_MODE": "computer"
|
|
@@ -32,7 +32,7 @@ um secret manager ou pelo ambiente do processo; não grave a chave no arquivo
|
|
|
32
32
|
de configuração. Para instalar no projeto Node do próprio harness:
|
|
33
33
|
|
|
34
34
|
```sh
|
|
35
|
-
npm install @diegosouzacdv/jev-browser-mcp@0.7.
|
|
35
|
+
npm install @diegosouzacdv/jev-browser-mcp@0.7.1
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
Se o harness executa o MCP repetidamente nesta máquina, instale uma versão
|
|
@@ -40,7 +40,7 @@ fixa globalmente para evitar a resolução e o download feitos pelo `npx` em cad
|
|
|
40
40
|
inicialização:
|
|
41
41
|
|
|
42
42
|
```sh
|
|
43
|
-
npm install --global @diegosouzacdv/jev-browser-mcp@0.7.
|
|
43
|
+
npm install --global @diegosouzacdv/jev-browser-mcp@0.7.1
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Depois configure o servidor MCP com `command: "jev-browser-mcp"` e `args: []`.
|
|
@@ -49,7 +49,7 @@ Para atualizar, rode `npm install --global
|
|
|
49
49
|
|
|
50
50
|
O padrão `computer` exige Chrome ou Edge instalado. Se optar por `harness`,
|
|
51
51
|
configure `JEV_BROWSER_MODE=harness` antes de instalar o navegador gerenciado
|
|
52
|
-
pelo Playwright com `npx --yes @diegosouzacdv/jev-browser-mcp@0.7.
|
|
52
|
+
pelo Playwright com `npx --yes @diegosouzacdv/jev-browser-mcp@0.7.1 --install-browser`.
|
|
53
53
|
|
|
54
54
|
O padrão é `computer`: o pacote abre o Chrome/Edge instalado e usa um perfil
|
|
55
55
|
persistente exclusivo por processo MCP em `browser.computer_user_data_dir`. O
|
|
@@ -89,8 +89,10 @@ O executável oferece `browser_health`, `describe_actions`, `choose_next_action`
|
|
|
89
89
|
e `run_browser_flow`, mantém uma sessão do browser por processo e reutiliza
|
|
90
90
|
essa sessão entre chamadas. `browser_health` informa versão, sessão e
|
|
91
91
|
capacidades; `describe_actions` publica o schema atual das ações, opções,
|
|
92
|
-
aliases
|
|
93
|
-
|
|
92
|
+
aliases, placeholders, campos obrigatórios de `flow`/plano e requisitos
|
|
93
|
+
condicionais por ação. `run_browser_flow` agrega campos obrigatórios ausentes
|
|
94
|
+
em todos os planos e etapas antes de abrir o navegador. Consulte essas ferramentas
|
|
95
|
+
antes de construir um plano para evitar nomes de campos desatualizados. O plano
|
|
94
96
|
passado ao Jev continua declarativo: clique, preenchimento, seleção nativa,
|
|
95
97
|
hover, espera, teclas aprovadas, asserções por elemento, upload restrito a uma
|
|
96
98
|
raiz local configurada e reações idempotentes a um comentário único. Também
|
|
@@ -174,12 +176,26 @@ Cada plano pode usar:
|
|
|
174
176
|
- `assert_network` valida resposta HTTP observada (inclusive sucesso 2xx ou erro
|
|
175
177
|
esperado); `wait_for_request` aguarda uma resposta usando `*` como curinga na
|
|
176
178
|
URL e filtros opcionais de método/status; `assert_ws` confere texto, pares
|
|
177
|
-
JSON esperados ou código de fechamento de WebSocket
|
|
179
|
+
JSON esperados ou código de fechamento de WebSocket. `wait_for_request`
|
|
180
|
+
consulta o histórico desde o começo da chamada, inclusive requisições feitas
|
|
181
|
+
durante a navegação inicial e dentro de iframes; URLs cobertas por uma
|
|
182
|
+
asserção ficam retidas mesmo quando a SPA excede o buffer circular;
|
|
178
183
|
- `evaluate` lê somente caminhos de propriedades como `navigator.mediaDevices`,
|
|
179
184
|
`document.readyState` ou `location.pathname`. Não aceita código, chamadas de
|
|
180
185
|
função, armazenamento local ou propriedades de credenciais. Strings e números
|
|
181
186
|
voltam diretamente; objetos e arrays retornam somente tipo, chaves e tamanho,
|
|
182
187
|
sem despejar seus valores;
|
|
188
|
+
- `http_request` executa somente GET com a sessão da página; `inspect_cookies`
|
|
189
|
+
retorna apenas metadados e valores redigidos; `read_angular_state` devolve o
|
|
190
|
+
nome do estado e nomes dos parâmetros, sem valores. As três ações exigem
|
|
191
|
+
`local_only: true` e página em loopback. `http_request` fica restrito à mesma
|
|
192
|
+
origem, não segue redirecionamentos e limita/redige o corpo opcional;
|
|
193
|
+
- `frame: "first"` seleciona o primeiro iframe; `frame: {"url_contains":"..."}`
|
|
194
|
+
localiza um iframe pela URL. Uma string diferente continua buscando o nome ou
|
|
195
|
+
título exato do frame;
|
|
196
|
+
- `navigate_menu` aceita `path` para menus acessíveis ou `screen` para procurar
|
|
197
|
+
código/nome pela tela Acesso Rápido do SAFI. O segundo caminho usa a interface
|
|
198
|
+
do SAFI e preserva as verificações de acesso do próprio aplicativo;
|
|
183
199
|
- `new_tab`, `switch_tab` e `new_context` abrem/selecionam abas e criam contexto
|
|
184
200
|
separado dentro do fluxo; `target_page: "popup"` mantém popups abertos para
|
|
185
201
|
passos posteriores;
|
|
@@ -271,11 +287,22 @@ incluindo respostas 2xx ou erros esperados como 404. Exemplo:
|
|
|
271
287
|
Essa asserção aparece na evidência como `response_status`, separado do campo
|
|
272
288
|
`status` da etapa (`passed` ou `failed`). `message_contains` lê somente resposta
|
|
273
289
|
da mesma origem e respeita o limite configurado para captura de corpos.
|
|
274
|
-
`assert_network
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
290
|
+
`assert_network` consulta respostas desde o marcador da etapa e usa a resposta
|
|
291
|
+
da navegação inicial como fallback quando nenhuma resposta posterior corresponde.
|
|
292
|
+
`wait_for_request` e `expected_outcome.request` consultam desde o início do fluxo.
|
|
293
|
+
URLs cobertas por uma asserção são retidas em um buffer separado limitado por
|
|
294
|
+
`jev_browser_mcp.browser.max_network_history_events` (4096 eventos nesta
|
|
295
|
+
configuração). A captura de página também observa requisições de iframes.
|
|
296
|
+
Um único plano `fast_path` composto apenas por `assert_network` e
|
|
297
|
+
`wait_for_request` não espera um snapshot visual, então endpoints que respondem
|
|
298
|
+
sem HTML também podem ser verificados. `navigation_http_status` registra um
|
|
299
|
+
status HTTP de erro recebido pela navegação inicial; ele não é uma falha de rede.
|
|
300
|
+
|
|
301
|
+
`options.capture_network: "all"` inclui até o limite de diagnóstico eventos
|
|
302
|
+
com URL sem query string, método, status, tipo de recurso, duração e cabeçalhos
|
|
303
|
+
de resposta de uma allowlist. `capture_network_url_contains` filtra as URLs.
|
|
304
|
+
Quando o Chromium informa cookies bloqueados, `blocked_cookies` mostra nome,
|
|
305
|
+
domínio, caminho, flags e motivo, sem revelar valores.
|
|
279
306
|
|
|
280
307
|
Para aguardar a API antes de abrir a interface, passe
|
|
281
308
|
`options.wait_for_http: {"url":"http://localhost:8000/health","timeout_ms":30000}`.
|
|
@@ -312,10 +339,38 @@ controle próximo ao texto visível do rótulo.
|
|
|
312
339
|
`15287210`; `row_containing_exact` continua disponível para texto de célula
|
|
313
340
|
exato. `check` e `uncheck` alteram checkboxes, e `select_option` aceita rótulo
|
|
314
341
|
exato (`option`), valor (`value`) ou rótulo parcial único (`label_contains`).
|
|
315
|
-
`navigate_menu` percorre uma lista de rótulos exatos e abre `#open_btn` quando o
|
|
316
|
-
primeiro item ainda está oculto. Se vários itens visíveis tiverem o mesmo
|
|
317
|
-
rótulo, seleciona a última ocorrência, útil quando o submenu recém-aberto
|
|
318
|
-
repete o nome da categoria pai.
|
|
342
|
+
`navigate_menu` percorre uma lista de rótulos exatos e abre `#open_btn` quando o
|
|
343
|
+
primeiro item ainda está oculto. Se vários itens visíveis tiverem o mesmo
|
|
344
|
+
rótulo, seleciona a última ocorrência, útil quando o submenu recém-aberto
|
|
345
|
+
repete o nome da categoria pai. Para o SAFI, `screen` pesquisa o nome ou código
|
|
346
|
+
na tela Acesso Rápido, exige um resultado único e clica no link oficial da linha;
|
|
347
|
+
por exemplo, `{"action":"navigate_menu","screen":"TCN00022"}`.
|
|
348
|
+
|
|
349
|
+
Em uma instância local do SAFI, `http_request` pode obter a lista de telas pela
|
|
350
|
+
sessão já aberta sem ler o HTML:
|
|
351
|
+
|
|
352
|
+
```json
|
|
353
|
+
{
|
|
354
|
+
"flow": "Consultar telas disponíveis no perfil atual do SAFI",
|
|
355
|
+
"initial_url": "http://localhost:8011/safi/",
|
|
356
|
+
"candidate_plans": {
|
|
357
|
+
"inspect": {
|
|
358
|
+
"description": "Ler a lista de telas do SAFI no ambiente local",
|
|
359
|
+
"steps": [{
|
|
360
|
+
"action": "http_request",
|
|
361
|
+
"url": "/safi/api/menu/telas_menu",
|
|
362
|
+
"include_body": true
|
|
363
|
+
}]
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"options": { "local_only": true, "fast_path": true }
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
O endpoint usa a sessão atual e pode retornar uma lista específica do perfil.
|
|
371
|
+
Os valores de cookies nunca são retornados. O acesso ao menu continua sujeito
|
|
372
|
+
às permissões verificadas pela própria interface; não use esse diagnóstico
|
|
373
|
+
contra produção.
|
|
319
374
|
|
|
320
375
|
```json
|
|
321
376
|
{
|
|
@@ -547,12 +602,17 @@ quando nenhuma dessas condições se aplica; confiança do Jev, sozinha, não
|
|
|
547
602
|
comprova o resultado. `environment_error` identifica falha de
|
|
548
603
|
navegação, autenticação ou sessão do browser; `navigation_error` contém o código
|
|
549
604
|
detectado, como `ERR_CONNECTION_REFUSED`, `AUTHENTICATION_REQUIRED` ou
|
|
550
|
-
`BROWSER_DISCONNECTED`,
|
|
605
|
+
`BROWSER_DISCONNECTED`, `BROWSER_PAGE_NOT_RESTORED` ou
|
|
606
|
+
`BROWSER_PROFILE_IN_USE`, e `reason` orienta a recuperação. Se uma navegação falhar
|
|
551
607
|
e a chamada seguinte tentar reutilizar a página, o MCP informa que a navegação
|
|
552
608
|
anterior não carregou; reinicie a navegação com
|
|
553
609
|
`continue_from_current_page: false` (ou o alias `reuse_page: false`). Uma sessão
|
|
554
|
-
desconectada pode ser reaberta por `browser_health
|
|
555
|
-
|
|
610
|
+
desconectada pode ser reaberta por `browser_health`. `run_browser_flow` também
|
|
611
|
+
tenta reconectar e repetir uma vez quando a desconexão acontece antes da primeira
|
|
612
|
+
etapa; a repetição exige `initial_url`. Sem essa URL, o resultado informa
|
|
613
|
+
`BROWSER_PAGE_NOT_RESTORED`, e chamadas posteriores em `reuse_page` continuam
|
|
614
|
+
recusadas até uma nova navegação explícita. Se qualquer etapa já executou ou
|
|
615
|
+
há token de confirmação de mutação, o MCP não repete o fluxo automaticamente.
|
|
556
616
|
|
|
557
617
|
`current_url` é devolvido para diagnóstico sem query string nem fragmento; IDs
|
|
558
618
|
longos no caminho também podem ser redigidos. `timings_ms.ready_ms` mede a espera
|
|
@@ -584,8 +644,9 @@ continua informada mesmo quando a lista é truncada.
|
|
|
584
644
|
|
|
585
645
|
O `run_browser_flow` aceita `options` com `fast_path`, `snapshot_scope`,
|
|
586
646
|
`block_trackers`, `block_fonts`, `local_only`, `busy_selectors`,
|
|
587
|
-
`auto_angular_idle`, `login_url_contains`, `login_text`, `capture_console_errors`,
|
|
588
|
-
`capture_network_errors`, `capture_network_error_bodies`, `
|
|
647
|
+
`auto_angular_idle`, `login_url_contains`, `login_text`, `capture_console_errors`,
|
|
648
|
+
`capture_network_errors`, `capture_network_error_bodies`, `capture_network`,
|
|
649
|
+
`capture_network_url_contains`, `ready_timeout_seconds`,
|
|
589
650
|
`ready_network_idle`, `ready_stable_ms`, `ready_text`, `ready`, `continue_from_current_page`,
|
|
590
651
|
`reuse_page`, `reuse_page_match`, `step_timeout_seconds`, `max_flow_steps`, `return_snapshot`,
|
|
591
652
|
`screenshot_on_failure`, `screenshot_on_success`, `trace_on_failure`,
|
|
@@ -649,6 +710,8 @@ traz mensagens do console agrupadas por texto e nível (`console_messages` com
|
|
|
649
710
|
`count`), além de `console_errors` para compatibilidade. `network_failures`
|
|
650
711
|
contém eventos limitados em quantidade e tamanho. Mensagens idênticas do console
|
|
651
712
|
são agrupadas em uma entrada com `count`.
|
|
713
|
+
Controles sem nome acessível aparecem em um único aviso com a contagem e alguns
|
|
714
|
+
exemplos, em vez de gerar uma mensagem por controle.
|
|
652
715
|
Respostas HTTP 4xx/5xx e requisições que falham são listadas; query strings,
|
|
653
716
|
fragmentos, valores de formulário e nomes de arquivo são removidos ou
|
|
654
717
|
sanitizados. `capture_network_error_bodies: true` lê somente respostas JSON
|
|
@@ -718,12 +781,12 @@ Chrome/Edge; em outros sistemas, usa o `SingletonLock` do Chromium. O caminho
|
|
|
718
781
|
padrão já separa processos por PID; configure `JEV_BROWSER_PROFILE` para mudar
|
|
719
782
|
a raiz e `JEV_BROWSER_SESSION_ID` para nomear a instância.
|
|
720
783
|
Resultados MCP incluem `server_version`; erros também começam com a versão do
|
|
721
|
-
servidor para facilitar a comparação entre instalações. A ferramenta
|
|
722
|
-
`browser_health` informa se a sessão está ativa e tenta reconectar um browser
|
|
723
|
-
que encerrou desde a chamada anterior. Passe `{"restart":true}` para fechar e
|
|
724
|
-
reiniciar somente o navegador administrado por este processo MCP.
|
|
725
|
-
|
|
726
|
-
|
|
784
|
+
servidor para facilitar a comparação entre instalações. A ferramenta
|
|
785
|
+
`browser_health` informa se a sessão está ativa e tenta reconectar um browser
|
|
786
|
+
que encerrou desde a chamada anterior. Passe `{"restart":true}` para fechar e
|
|
787
|
+
reiniciar somente o navegador administrado por este processo MCP. Perfil ocupado
|
|
788
|
+
é devolvido como `BROWSER_PROFILE_IN_USE` com o PID detectado e não provoca
|
|
789
|
+
encerramento do Chrome/Edge existente.
|
|
727
790
|
|
|
728
791
|
`harness_browser` e `computer_browser` aceitam `chrome` ou `msedge`.
|
|
729
792
|
`computer_user_data_dir` deve ficar fora do repositório e conter `{browser}` e
|
package/docs/jev-browser-mcp.md
CHANGED
|
@@ -17,7 +17,7 @@ versão em produção, use o número explícito no argumento do pacote:
|
|
|
17
17
|
"mcpServers": {
|
|
18
18
|
"jev-browser": {
|
|
19
19
|
"command": "npx",
|
|
20
|
-
"args": ["--yes", "@diegosouzacdv/jev-browser-mcp@0.7.
|
|
20
|
+
"args": ["--yes", "@diegosouzacdv/jev-browser-mcp@0.7.1"],
|
|
21
21
|
"env": {
|
|
22
22
|
"OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
|
|
23
23
|
"JEV_BROWSER_MODE": "computer"
|
|
@@ -32,7 +32,7 @@ um secret manager ou pelo ambiente do processo; não grave a chave no arquivo
|
|
|
32
32
|
de configuração. Para instalar no projeto Node do próprio harness:
|
|
33
33
|
|
|
34
34
|
```sh
|
|
35
|
-
npm install @diegosouzacdv/jev-browser-mcp@0.7.
|
|
35
|
+
npm install @diegosouzacdv/jev-browser-mcp@0.7.1
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
Se o harness executa o MCP repetidamente nesta máquina, instale uma versão
|
|
@@ -40,7 +40,7 @@ fixa globalmente para evitar a resolução e o download feitos pelo `npx` em cad
|
|
|
40
40
|
inicialização:
|
|
41
41
|
|
|
42
42
|
```sh
|
|
43
|
-
npm install --global @diegosouzacdv/jev-browser-mcp@0.7.
|
|
43
|
+
npm install --global @diegosouzacdv/jev-browser-mcp@0.7.1
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
Depois configure o servidor MCP com `command: "jev-browser-mcp"` e `args: []`.
|
|
@@ -49,7 +49,7 @@ Para atualizar, rode `npm install --global
|
|
|
49
49
|
|
|
50
50
|
O padrão `computer` exige Chrome ou Edge instalado. Se optar por `harness`,
|
|
51
51
|
configure `JEV_BROWSER_MODE=harness` antes de instalar o navegador gerenciado
|
|
52
|
-
pelo Playwright com `npx --yes @diegosouzacdv/jev-browser-mcp@0.7.
|
|
52
|
+
pelo Playwright com `npx --yes @diegosouzacdv/jev-browser-mcp@0.7.1 --install-browser`.
|
|
53
53
|
|
|
54
54
|
O padrão é `computer`: o pacote abre o Chrome/Edge instalado e usa um perfil
|
|
55
55
|
persistente exclusivo por processo MCP em `browser.computer_user_data_dir`. O
|
|
@@ -89,8 +89,10 @@ O executável oferece `browser_health`, `describe_actions`, `choose_next_action`
|
|
|
89
89
|
e `run_browser_flow`, mantém uma sessão do browser por processo e reutiliza
|
|
90
90
|
essa sessão entre chamadas. `browser_health` informa versão, sessão e
|
|
91
91
|
capacidades; `describe_actions` publica o schema atual das ações, opções,
|
|
92
|
-
aliases
|
|
93
|
-
|
|
92
|
+
aliases, placeholders, campos obrigatórios de `flow`/plano e requisitos
|
|
93
|
+
condicionais por ação. `run_browser_flow` agrega campos obrigatórios ausentes
|
|
94
|
+
em todos os planos e etapas antes de abrir o navegador. Consulte essas ferramentas
|
|
95
|
+
antes de construir um plano para evitar nomes de campos desatualizados. O plano
|
|
94
96
|
passado ao Jev continua declarativo: clique, preenchimento, seleção nativa,
|
|
95
97
|
hover, espera, teclas aprovadas, asserções por elemento, upload restrito a uma
|
|
96
98
|
raiz local configurada e reações idempotentes a um comentário único. Também
|
|
@@ -174,12 +176,26 @@ Cada plano pode usar:
|
|
|
174
176
|
- `assert_network` valida resposta HTTP observada (inclusive sucesso 2xx ou erro
|
|
175
177
|
esperado); `wait_for_request` aguarda uma resposta usando `*` como curinga na
|
|
176
178
|
URL e filtros opcionais de método/status; `assert_ws` confere texto, pares
|
|
177
|
-
JSON esperados ou código de fechamento de WebSocket
|
|
179
|
+
JSON esperados ou código de fechamento de WebSocket. `wait_for_request`
|
|
180
|
+
consulta o histórico desde o começo da chamada, inclusive requisições feitas
|
|
181
|
+
durante a navegação inicial e dentro de iframes; URLs cobertas por uma
|
|
182
|
+
asserção ficam retidas mesmo quando a SPA excede o buffer circular;
|
|
178
183
|
- `evaluate` lê somente caminhos de propriedades como `navigator.mediaDevices`,
|
|
179
184
|
`document.readyState` ou `location.pathname`. Não aceita código, chamadas de
|
|
180
185
|
função, armazenamento local ou propriedades de credenciais. Strings e números
|
|
181
186
|
voltam diretamente; objetos e arrays retornam somente tipo, chaves e tamanho,
|
|
182
187
|
sem despejar seus valores;
|
|
188
|
+
- `http_request` executa somente GET com a sessão da página; `inspect_cookies`
|
|
189
|
+
retorna apenas metadados e valores redigidos; `read_angular_state` devolve o
|
|
190
|
+
nome do estado e nomes dos parâmetros, sem valores. As três ações exigem
|
|
191
|
+
`local_only: true` e página em loopback. `http_request` fica restrito à mesma
|
|
192
|
+
origem, não segue redirecionamentos e limita/redige o corpo opcional;
|
|
193
|
+
- `frame: "first"` seleciona o primeiro iframe; `frame: {"url_contains":"..."}`
|
|
194
|
+
localiza um iframe pela URL. Uma string diferente continua buscando o nome ou
|
|
195
|
+
título exato do frame;
|
|
196
|
+
- `navigate_menu` aceita `path` para menus acessíveis ou `screen` para procurar
|
|
197
|
+
código/nome pela tela Acesso Rápido do SAFI. O segundo caminho usa a interface
|
|
198
|
+
do SAFI e preserva as verificações de acesso do próprio aplicativo;
|
|
183
199
|
- `new_tab`, `switch_tab` e `new_context` abrem/selecionam abas e criam contexto
|
|
184
200
|
separado dentro do fluxo; `target_page: "popup"` mantém popups abertos para
|
|
185
201
|
passos posteriores;
|
|
@@ -271,11 +287,22 @@ incluindo respostas 2xx ou erros esperados como 404. Exemplo:
|
|
|
271
287
|
Essa asserção aparece na evidência como `response_status`, separado do campo
|
|
272
288
|
`status` da etapa (`passed` ou `failed`). `message_contains` lê somente resposta
|
|
273
289
|
da mesma origem e respeita o limite configurado para captura de corpos.
|
|
274
|
-
`assert_network
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
290
|
+
`assert_network` consulta respostas desde o marcador da etapa e usa a resposta
|
|
291
|
+
da navegação inicial como fallback quando nenhuma resposta posterior corresponde.
|
|
292
|
+
`wait_for_request` e `expected_outcome.request` consultam desde o início do fluxo.
|
|
293
|
+
URLs cobertas por uma asserção são retidas em um buffer separado limitado por
|
|
294
|
+
`jev_browser_mcp.browser.max_network_history_events` (4096 eventos nesta
|
|
295
|
+
configuração). A captura de página também observa requisições de iframes.
|
|
296
|
+
Um único plano `fast_path` composto apenas por `assert_network` e
|
|
297
|
+
`wait_for_request` não espera um snapshot visual, então endpoints que respondem
|
|
298
|
+
sem HTML também podem ser verificados. `navigation_http_status` registra um
|
|
299
|
+
status HTTP de erro recebido pela navegação inicial; ele não é uma falha de rede.
|
|
300
|
+
|
|
301
|
+
`options.capture_network: "all"` inclui até o limite de diagnóstico eventos
|
|
302
|
+
com URL sem query string, método, status, tipo de recurso, duração e cabeçalhos
|
|
303
|
+
de resposta de uma allowlist. `capture_network_url_contains` filtra as URLs.
|
|
304
|
+
Quando o Chromium informa cookies bloqueados, `blocked_cookies` mostra nome,
|
|
305
|
+
domínio, caminho, flags e motivo, sem revelar valores.
|
|
279
306
|
|
|
280
307
|
Para aguardar a API antes de abrir a interface, passe
|
|
281
308
|
`options.wait_for_http: {"url":"http://localhost:8000/health","timeout_ms":30000}`.
|
|
@@ -312,10 +339,38 @@ controle próximo ao texto visível do rótulo.
|
|
|
312
339
|
`15287210`; `row_containing_exact` continua disponível para texto de célula
|
|
313
340
|
exato. `check` e `uncheck` alteram checkboxes, e `select_option` aceita rótulo
|
|
314
341
|
exato (`option`), valor (`value`) ou rótulo parcial único (`label_contains`).
|
|
315
|
-
`navigate_menu` percorre uma lista de rótulos exatos e abre `#open_btn` quando o
|
|
316
|
-
primeiro item ainda está oculto. Se vários itens visíveis tiverem o mesmo
|
|
317
|
-
rótulo, seleciona a última ocorrência, útil quando o submenu recém-aberto
|
|
318
|
-
repete o nome da categoria pai.
|
|
342
|
+
`navigate_menu` percorre uma lista de rótulos exatos e abre `#open_btn` quando o
|
|
343
|
+
primeiro item ainda está oculto. Se vários itens visíveis tiverem o mesmo
|
|
344
|
+
rótulo, seleciona a última ocorrência, útil quando o submenu recém-aberto
|
|
345
|
+
repete o nome da categoria pai. Para o SAFI, `screen` pesquisa o nome ou código
|
|
346
|
+
na tela Acesso Rápido, exige um resultado único e clica no link oficial da linha;
|
|
347
|
+
por exemplo, `{"action":"navigate_menu","screen":"TCN00022"}`.
|
|
348
|
+
|
|
349
|
+
Em uma instância local do SAFI, `http_request` pode obter a lista de telas pela
|
|
350
|
+
sessão já aberta sem ler o HTML:
|
|
351
|
+
|
|
352
|
+
```json
|
|
353
|
+
{
|
|
354
|
+
"flow": "Consultar telas disponíveis no perfil atual do SAFI",
|
|
355
|
+
"initial_url": "http://localhost:8011/safi/",
|
|
356
|
+
"candidate_plans": {
|
|
357
|
+
"inspect": {
|
|
358
|
+
"description": "Ler a lista de telas do SAFI no ambiente local",
|
|
359
|
+
"steps": [{
|
|
360
|
+
"action": "http_request",
|
|
361
|
+
"url": "/safi/api/menu/telas_menu",
|
|
362
|
+
"include_body": true
|
|
363
|
+
}]
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"options": { "local_only": true, "fast_path": true }
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
O endpoint usa a sessão atual e pode retornar uma lista específica do perfil.
|
|
371
|
+
Os valores de cookies nunca são retornados. O acesso ao menu continua sujeito
|
|
372
|
+
às permissões verificadas pela própria interface; não use esse diagnóstico
|
|
373
|
+
contra produção.
|
|
319
374
|
|
|
320
375
|
```json
|
|
321
376
|
{
|
|
@@ -547,12 +602,17 @@ quando nenhuma dessas condições se aplica; confiança do Jev, sozinha, não
|
|
|
547
602
|
comprova o resultado. `environment_error` identifica falha de
|
|
548
603
|
navegação, autenticação ou sessão do browser; `navigation_error` contém o código
|
|
549
604
|
detectado, como `ERR_CONNECTION_REFUSED`, `AUTHENTICATION_REQUIRED` ou
|
|
550
|
-
`BROWSER_DISCONNECTED`,
|
|
605
|
+
`BROWSER_DISCONNECTED`, `BROWSER_PAGE_NOT_RESTORED` ou
|
|
606
|
+
`BROWSER_PROFILE_IN_USE`, e `reason` orienta a recuperação. Se uma navegação falhar
|
|
551
607
|
e a chamada seguinte tentar reutilizar a página, o MCP informa que a navegação
|
|
552
608
|
anterior não carregou; reinicie a navegação com
|
|
553
609
|
`continue_from_current_page: false` (ou o alias `reuse_page: false`). Uma sessão
|
|
554
|
-
desconectada pode ser reaberta por `browser_health
|
|
555
|
-
|
|
610
|
+
desconectada pode ser reaberta por `browser_health`. `run_browser_flow` também
|
|
611
|
+
tenta reconectar e repetir uma vez quando a desconexão acontece antes da primeira
|
|
612
|
+
etapa; a repetição exige `initial_url`. Sem essa URL, o resultado informa
|
|
613
|
+
`BROWSER_PAGE_NOT_RESTORED`, e chamadas posteriores em `reuse_page` continuam
|
|
614
|
+
recusadas até uma nova navegação explícita. Se qualquer etapa já executou ou
|
|
615
|
+
há token de confirmação de mutação, o MCP não repete o fluxo automaticamente.
|
|
556
616
|
|
|
557
617
|
`current_url` é devolvido para diagnóstico sem query string nem fragmento; IDs
|
|
558
618
|
longos no caminho também podem ser redigidos. `timings_ms.ready_ms` mede a espera
|
|
@@ -584,8 +644,9 @@ continua informada mesmo quando a lista é truncada.
|
|
|
584
644
|
|
|
585
645
|
O `run_browser_flow` aceita `options` com `fast_path`, `snapshot_scope`,
|
|
586
646
|
`block_trackers`, `block_fonts`, `local_only`, `busy_selectors`,
|
|
587
|
-
`auto_angular_idle`, `login_url_contains`, `login_text`, `capture_console_errors`,
|
|
588
|
-
`capture_network_errors`, `capture_network_error_bodies`, `
|
|
647
|
+
`auto_angular_idle`, `login_url_contains`, `login_text`, `capture_console_errors`,
|
|
648
|
+
`capture_network_errors`, `capture_network_error_bodies`, `capture_network`,
|
|
649
|
+
`capture_network_url_contains`, `ready_timeout_seconds`,
|
|
589
650
|
`ready_network_idle`, `ready_stable_ms`, `ready_text`, `ready`, `continue_from_current_page`,
|
|
590
651
|
`reuse_page`, `reuse_page_match`, `step_timeout_seconds`, `max_flow_steps`, `return_snapshot`,
|
|
591
652
|
`screenshot_on_failure`, `screenshot_on_success`, `trace_on_failure`,
|
|
@@ -649,6 +710,8 @@ traz mensagens do console agrupadas por texto e nível (`console_messages` com
|
|
|
649
710
|
`count`), além de `console_errors` para compatibilidade. `network_failures`
|
|
650
711
|
contém eventos limitados em quantidade e tamanho. Mensagens idênticas do console
|
|
651
712
|
são agrupadas em uma entrada com `count`.
|
|
713
|
+
Controles sem nome acessível aparecem em um único aviso com a contagem e alguns
|
|
714
|
+
exemplos, em vez de gerar uma mensagem por controle.
|
|
652
715
|
Respostas HTTP 4xx/5xx e requisições que falham são listadas; query strings,
|
|
653
716
|
fragmentos, valores de formulário e nomes de arquivo são removidos ou
|
|
654
717
|
sanitizados. `capture_network_error_bodies: true` lê somente respostas JSON
|
|
@@ -718,12 +781,12 @@ Chrome/Edge; em outros sistemas, usa o `SingletonLock` do Chromium. O caminho
|
|
|
718
781
|
padrão já separa processos por PID; configure `JEV_BROWSER_PROFILE` para mudar
|
|
719
782
|
a raiz e `JEV_BROWSER_SESSION_ID` para nomear a instância.
|
|
720
783
|
Resultados MCP incluem `server_version`; erros também começam com a versão do
|
|
721
|
-
servidor para facilitar a comparação entre instalações. A ferramenta
|
|
722
|
-
`browser_health` informa se a sessão está ativa e tenta reconectar um browser
|
|
723
|
-
que encerrou desde a chamada anterior. Passe `{"restart":true}` para fechar e
|
|
724
|
-
reiniciar somente o navegador administrado por este processo MCP.
|
|
725
|
-
|
|
726
|
-
|
|
784
|
+
servidor para facilitar a comparação entre instalações. A ferramenta
|
|
785
|
+
`browser_health` informa se a sessão está ativa e tenta reconectar um browser
|
|
786
|
+
que encerrou desde a chamada anterior. Passe `{"restart":true}` para fechar e
|
|
787
|
+
reiniciar somente o navegador administrado por este processo MCP. Perfil ocupado
|
|
788
|
+
é devolvido como `BROWSER_PROFILE_IN_USE` com o PID detectado e não provoca
|
|
789
|
+
encerramento do Chrome/Edge existente.
|
|
727
790
|
|
|
728
791
|
`harness_browser` e `computer_browser` aceitam `chrome` ou `msedge`.
|
|
729
792
|
`computer_user_data_dir` deve ficar fora do repositório e conter `{browser}` e
|