@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 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.0"],
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.0
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.0
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.0 --install-browser`.
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 e placeholders. Consulte essas ferramentas antes de construir um plano
93
- para evitar nomes de campos desatualizados. O plano
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`, `wait_for_request` e `expected_outcome.request` consultam o
275
- histórico limitado de respostas depois do marcador da etapa ou do início do
276
- fluxo. O limite vem de `jev_browser_mcp.browser.max_network_history_events` e
277
- está em 4096 eventos nesta configuração; assim, chamadas anteriores ao marcador
278
- não satisfazem a asserção.
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`, e `reason` orienta a recuperação. Se uma navegação falhar
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`; o fluxo só é repetido
555
- automaticamente uma vez se nenhuma etapa mutável tiver sido executada.
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`, `ready_timeout_seconds`,
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. Um fluxo pode
725
- ser repetido automaticamente uma vez após `BROWSER_DISCONNECTED` quando nenhuma
726
- etapa mutável foi executada.
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
@@ -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.0"],
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.0
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.0
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.0 --install-browser`.
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 e placeholders. Consulte essas ferramentas antes de construir um plano
93
- para evitar nomes de campos desatualizados. O plano
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`, `wait_for_request` e `expected_outcome.request` consultam o
275
- histórico limitado de respostas depois do marcador da etapa ou do início do
276
- fluxo. O limite vem de `jev_browser_mcp.browser.max_network_history_events` e
277
- está em 4096 eventos nesta configuração; assim, chamadas anteriores ao marcador
278
- não satisfazem a asserção.
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`, e `reason` orienta a recuperação. Se uma navegação falhar
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`; o fluxo só é repetido
555
- automaticamente uma vez se nenhuma etapa mutável tiver sido executada.
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`, `ready_timeout_seconds`,
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. Um fluxo pode
725
- ser repetido automaticamente uma vez após `BROWSER_DISCONNECTED` quando nenhuma
726
- etapa mutável foi executada.
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