---
title: Bloqueios de Recursos
slug: studio/bloqueios-de-recursos
docTags: 
createdAt: 2026-04-28T18:37:54.693Z
---

# <font color="#DA8D35">1 - Visão geral </font>

O sistema Resource Lock oferece proteção colaborativa de edição ao impedir que múltiplos usuários editem simultaneamente a mesma tela ou composição. Isso garante a integridade dos dados e previne conflitos em ambientes multiusuário.

<font color="#DA8D35">**Principais Recursos** </font>

- <font color="#DA8D35">**Gerenciamento Automático de Bloqueios**\: </font>Recursos são automaticamente bloqueados quando abertos para edição&#x20;
- <font color="#DA8D35">**Indicadores Visuais**\:</font> Feedback claro da interface mostrando quem está editando o quê&#x20;
- <font color="#DA8D35">**Proteção contra Tempo Morto**\:</font> Bloqueios expiram automaticamente após 5 minutos de inatividade&#x20;
- <font color="#DA8D35">**Mecanismo de Batimentos Cardíacos**\:</font> Sessões de edição ativa renovam automaticamente os bloqueios&#x20;
- <font color="#DA8D35">**Liberação forçada**\:</font> Administradores podem liberar bloqueios à força quando necessário&#x20;
- <font color="#DA8D35">**Atualizações em tempo real**\:</font> Atualizações de status do bloqueio via mecanismo de polling&#x20;
- <font color="#DA8D35">**Desabilitação Abrangente**\:</font> Todas as superfícies de edição são desativadas quando bloqueadas por outro usuário&#x20;

<font color="#DA8D35">**Recursos** </font>

- <font color="#DA8D35">**Screens**\:</font> Screens individuais de aplicação&#x20;
- <font color="#DA8D35">**Composições**\: </font>Composições componentes reutilizáveis&#x20;

***

# <font color="#DA8D35">2 - Como Funciona </font>

<font color="#DA8D35">**Ciclo de Vida da Trava**</font>

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/M5xEUkk4eGsi5kmwK7--J_image.png)

<font color="#DA8D35">**Fluxo de Aquisição de Locks** </font>

1. <font color="#DA8D35">**Usuário Abre Recurso**\: </font>O usuário navega até uma tela ou composição&#x20;
2. <font color="#DA8D35">**Solicitação de Bloqueio**\:</font> A interface envia a solicitaçãoPOST /api/locks/acquire&#x20;
3. <font color="#DA8D35">**Verificação de Bloqueio**\:</font> O backend verifica se o recurso já está bloqueado&#x20;
4. <font color="#DA8D35">**Conceda ou negue**\: </font>
   - Se desbloqueado: O bloqueio é concedido e armazenado no banco de dados
   - Se bloqueado pelo mesmo usuário: O bloqueio é concedido (reentrada permitida)
   - Se bloqueado por outro usuário: Solicitação negada com detalhes do bloqueio
5. <font color="#DA8D35">**Batimentos cardíacos iniciados**\: </font>O frontend começa a enviar batimentos cardíacos a cada 4 segundos&#x20;
6. <font color="#DA8D35">**Atualizações da interface**\:</font> O estado travado é refletido em todos os componentes da interface&#x20;

<font color="#DA8D35">**Mecanismo do Batimento Cardíaco** </font>

O mecanismo do batimento cardíaco mantém as travas ativas durante a edição ativa:

- <font color="#DA8D35">**Intervalo**\: </font>A cada 4 segundos&#x20;
- <font color="#DA8D35">**Ponto final**\: </font>`POST /api/locks/renew`&#x20;
- <font color="#DA8D35">**Propósito**\:</font> Estende o tempo de expiração do bloqueio&#x20;
- <font color="#DA8D35">**Automático**\:</font> Executa em segundo plano enquanto o recurso está aberto&#x20;
- <font color="#DA8D35">**Limpeza**\:</font> Para quando o usuário navega para fora ou fecha o recurso&#x20;

<font color="#DA8D35">**Expiração da Fechadura** </font>

Fechaduras expiram automaticamente após 5 minutos sem batimentos cardíacos:

- <font color="#DA8D35">**Tempo\:** </font>300 segundos (5 minutos)&#x20;
- <font color="#DA8D35">**Propósito**\:</font> Evitar que travas obsoletas bloqueiem recursos&#x20;
- <font color="#DA8D35">**Limpeza Automática**\: </font>O backend remove automaticamente fechaduras vencidas&#x20;
- <font color="#DA8D35">**Período de Carência**\:</font> Garante que bloqueios não persistam caso o usuário feche o navegador inesperadamente&#x20;

***

# <font color="#DA8D35">3 - Implementação Backend </font>

<font color="#DA8D35">**Esquema de Banco de Dados** </font>

```javascript
CREATE TABLE lowcode_studio.resource_locks (
  id TEXT PRIMARY KEY,
  resource_type TEXT NOT NULL,  -- 'screen' or 'composition'
  resource_id TEXT NOT NULL,
  locked_by TEXT NOT NULL,      -- User ID
  locked_at BIGINT NOT NULL,    -- Unix timestamp in milliseconds
  expires_at BIGINT NOT NULL,   -- Unix timestamp in milliseconds
  UNIQUE(resource_type, resource_id)
);

CREATE INDEX idx_resource_locks_resource
ON lowcode_studio.resource_locks(resource_type, resource_id);

CREATE INDEX idx_resource_locks_expires
ON lowcode_studio.resource_locks(expires_at);
```

<font color="#DA8D35">**API Endpoints** </font>

Adquirir Lock&#x20;

```javascript
POST /api/locks/acquire
Content-Type: application/json

{
  "resourceType": "screen",
  "resourceId": "uuid-here",
  "userId": "user-id-here"
}
```

<font color="#DA8D35">**Resposta (Sucesso - 200)\:**</font>

```javascript
{
  "success": true,
  "lock": {
    "id": "lock-id",
    "resourceType": "screen",
    "resourceId": "uuid-here",
    "lockedBy": "user-id-here",
    "lockedByUser": {
      "id": "user-id-here",
      "firstName": "John",
      "lastName": "Doe"
    },
    "lockedAt": 1737648000000,
    "expiresAt": 1737648300000
  }
}
```

<font color="#DA8D35">**Resposta (Já Bloqueada - 409)\:**</font>

```javascript
{
  "success": false,
  "error": "Resource is locked by another user",
  "lock": {
    "id": "lock-id",
    "resourceType": "screen",
    "resourceId": "uuid-here",
    "lockedBy": "other-user-id",
    "lockedByUser": {
      "id": "other-user-id",
      "firstName": "Jane",
      "lastName": "Smith"
    },
    "lockedAt": 1737647900000,
    "expiresAt": 1737648200000
  }
}
```

<font color="#DA8D35">**Renovar Trava** </font>

```javascript
POST /api/locks/renew
Content-Type: application/json

{
  "resourceType": "screen",
  "resourceId": "uuid-here",
  "userId": "user-id-here"
}
```

<font color="#DA8D35">**Resposta (200)\:**</font>

```javascript
{
  "success": true,
  "expiresAt": 1737648600000
}
```

<font color="#DA8D35">**Trava de Liberação** </font>

```javascript
POST /api/locks/release
Content-Type: application/json

{
  "resourceType": "screen",
  "resourceId": "uuid-here",
  "userId": "user-id-here"
}
```

<font color="#DA8D35">**Resposta (200)\:**</font>

```javascript
{
  "success": true
}
```

****<font color="#DA8D35">**Trava de Liberação Forçada** </font>****

```javascript
POST /api/locks/force
Content-Type: application/json

{
  "resourceType": "screen",
  "resourceId": "uuid-here"
}
```

<font color="#DA8D35">**Resposta (200)\:**</font>

```javascript
{
  "success": true
}
```

<font color="#DA8D35">**Conseguir Fechaduras por Recurso** </font>

```javascript
GET /api/locks?resourceType=screen&resourceId=uuid-here
```

<font color="#DA8D35">**Resposta (200)\:**</font>

```javascript
{
  "locks": [
    {
      "id": "lock-id",
      "resourceType": "screen",
      "resourceId": "uuid-here",
      "lockedBy": "user-id",
      "lockedByUser": {
        "id": "user-id",
        "firstName": "John",
        "lastName": "Doe"
      },
      "lockedAt": 1737648000000,
      "expiresAt": 1737648300000
    }
  ]
}
```

***

# <font color="#DA8D35">4 - Implementação Frontend </font>

### <font color="#DA8D35">**Arquitetura de Loja** </font>

O sistema de bloqueio utiliza sinais Preact para gerenciamento de estado reativo:

<font color="#DA8D35">**Arquivo**\:</font> `client/src/features/project/stores/resource-locks.ts`

```javascript
// Global signals
export const resourceLocks = signal<Map<string, ResourceLock>>(new Map());
export const lockHeartbeats = signal<Map<string, number>>(new Map());

// Computed signal for editing state
export const isEditingDisabled = computed(() => {
  const currentActive = editMode.value === "composition"
    ? activeComposition.value
    : activeScreen.value;

  if (!currentActive) return false;

  const lockStatus = getResourceLockStatus(
    editMode.value === "composition" ? "composition" : "screen",
    currentActive.uuid,
    userProfile.value?.id || ""
  );

  return lockStatus.isLocked && !lockStatus.isOwnedByCurrentUser;
});
```

### <font color="#DA8D35">**Funções de Trava**</font>

**adquireResourceLock&#x20;**

Tentativas de obter um bloqueio em um recurso:

```javascript
const result = await acquireResourceLock('screen', screenUuid, userId);
if (result.success) {
  // Lock acquired, start heartbeat
} else {
  // Lock denied, show notification
}
```

**renewResourceLock&#x20;**

Renova uma fechadura existente (chamada por batimentos cardíacos):

```javascript
await renewResourceLock('screen', screenUuid, userId);
```

**releaseResourceLock&#x20;**

Libera um bloqueio quando o usuário termina de editar:

```javascript
await releaseResourceLock('screen', screenUuid, userId);
```

**getResourceLockStatus&#x20;**

Verifica o status atual do bloqueio de um recurso:

```javascript
const status = getResourceLockStatus('screen', screenUuid, userId);
// Returns: { isLocked, isOwnedByCurrentUser, lock }
```

### <font color="#DA8D35">**Componentes da interface** </font>



<font color="#DA8D35">**Notificações do Canvas** </font>

<font color="#DA8D35">**Arquivo**\: </font>`client/src/features/project/details/components/layout/canvas-notifications.tsx`

Exibe notificações de bloqueio e composições órfãs no topo da tela:

- <font color="#DA8D35">**Notificação de Bloqueio**\: </font>Mostra quem está editando o recurso&#x20;
- <font color="#DA8D35">**Avatar do Usuário**\:</font> Avatar codificado por cores com base no ID do usuário&#x20;
- <font color="#DA8D35">**Exibição de Horas**\: </font>Mostra quando a fechadura foi adquirida&#x20;
- <font color="#DA8D35">**Ícone de Cadeado**\:</font> Indicador visual no final do banner&#x20;



<font color="#DA8D35">**Lista de Tela** </font>

<font color="#DA8D35">**Arquivo**\: </font>`client/src/features/project/details/components/left-panel/screen-list.tsx`

Mostra indicadores de bloqueio ao lado das telas bloqueadas:

- <font color="#DA8D35">**Ícone de Cadeado**\: </font>Ícone pequeno de cadeado ao lado do nome de usuário&#x20;
- <font color="#DA8D35">**Avatar do Usuário**\:</font> Avatar minúsculo mostrando quem está com o bloqueio&#x20;
- <font color="#DA8D35">**Dica de ferramenta**\:</font> Passe o mouse para ver o nome completo do usuário&#x20;



<font color="#DA8D35">**Árvore de Elementos** </font>

<font color="#DA8D35">**Arquivo**\: </font>`client/src/features/project/details/components/left-panel/elements-tree/`

Desativa manipulação de elementos quando bloqueado:

- <font color="#DA8D35">**Botão de Adicionar**\:</font> Oculto quando bloqueado&#x20;
- <font color="#DA8D35">**Arrastar e Soltar**\:</font> Desativado quando bloqueado&#x20;
- <font color="#DA8D35">**Menu de Contexto**\: </font>Vazio quando bloqueado&#x20;
- <font color="#DA8D35">**Reordenamento**\:</font> Impedido quando travado&#x20;

****

<font color="#DA8D35">**Painel Direito** </font>

<font color="#DA8D35">**Arquivo**</font>: `client/src/features/project/details/components/right-panel/index.tsx`

Torna as abas legíveis, mas o conteúdo não editável:

- <font color="#DA8D35">**Abas** \: </font>Permanecam clicáveis para navegação&#x20;
- <font color="#DA8D35">**Conteúdo**\:</font> Desativado com pointer-events-none opacity-60&#x20;
- <font color="#DA8D35">**Todos os Painéis**\: </font>Propriedades, Estilos, Encadernações, Documentação, Configurações&#x20;

****

<font color="#DA8D35">**Ações de Tela** </font>

<font color="#DA8D35">**Arquivo**\: </font>`client/src/features/project/details/components/renderer/index.tsx`

Ocultar botões de ação de elemento quando bloqueados:

- <font color="#DA8D35">**Mover-se para cima/baixo**\:</font> Oculto&#x20;
- <font color="#DA8D35">**Excluir**\:</font> Oculto&#x20;
- <font color="#DA8D35">**Cópia**\:</font> Oculta&#x20;
- <font color="#DA8D35">**Largura do Rótulo**\:</font> Definido para 0 quando bloqueado&#x20;

****

<font color="#DA8D35">**Estratégia de Pesquisa** </font>

O sistema utiliza polling adaptativo para verificar o status do bloqueio:

```javascript
// With active locks: Poll every 5 seconds
// Without locks: Poll every 30 seconds
const refetchInterval = hasActiveLocks ? 5000 : 30000;

useQuery({
  queryKey: ['resource-locks', projectId],
  queryFn: () => fetchResourceLocks(projectId),
  refetchInterval,
  staleTime: 0,
});
```

***

# <font color="#DA8D35">5 - Experiência do Usuário </font>

### <font color="#DA8D35">Ao abrir um recurso bloqueado </font>

1. <font color="#DA8D35">**Navegação**\: </font>Usuário clica em uma tela/composição bloqueada&#x20;
2. <font color="#DA8D35">**Checagem de Bloqueio**\: </font>Sistema verifica se o recurso está bloqueado&#x20;
3. <font color="#DA8D35">**Notificação**\: </font>Banner aparece no topo da tela&#x20;
4. <font color="#DA8D35">**UI desativada**\:</font> Todos os controles de edição estão desativados&#x20;
5. <font color="#DA8D35">**Modo Somente Leitura**\:</font> O usuário pode visualizar, mas não editar&#x20;

### <font color="#DA8D35">**Indicadores Visuais** </font>

<font color="#DA8D35">**Faixa de Fechadura (Tela)** </font>

:::BlockQuote
┌─────────────────────────────────────────────────────────┐
│ John Doe is editing this screen (2 minutes ago)         │
└─────────────────────────────────────────────────────────┘
:::

Características: \* Fundo vermelho () \* Avatar do usuário com fundo codificado por cores \* Exibição do nome completo \* Tempo desde que a fechadura foi adquirida \* Ícone de cadeado no final `bg-red-50 border-red-200`

****

<font color="#DA8D35">**Indicador de Lista de Tela** </font>

:::BlockQuote
Home Screen        \[JD]
Profile Screen
Settings Screen    \[JS]
:::

Características: \* Ícone pequeno de cadeado ao lado do nome \* Avatar de usuário pequeno (8px) \* Dica de ferramenta ao passar o mouse mostrando o nome completo

****

<font color="#DA8D35">**Quando outro usuário adquire o bloqueio** </font>

1. <font color="#DA8D35">**Detecção de Polling**\: </font>Frontend detecta novo lock via polling&#x20;
2. <font color="#DA8D35">**Atualização da interface**\:</font> Indicadores de trava aparecem imediatamente&#x20;
3. <font color="#DA8D35">**Edição desativada**\: </font>Todos os controles se tornam não interativos&#x20;
4. <font color="#DA8D35">**Edições Atuais**\:</font> As alterações locais do usuário permanecem, mas não podem ser salvas&#x20;
5. <font color="#DA8D35">**Notificação**\: </font>Notificação opcional de toast (não implementada atualmente)&#x20;

****

<font color="#DA8D35">**Quando a Tranca é Liberada** </font>

1. <font color="#DA8D35">**Detecção de Liberação**\:</font> O sondamento detecta remoção de trava&#x20;
2. <font color="#DA8D35">**Remoção de notificações**\:</font> Banner de bloqueio desaparece&#x20;
3. <font color="#DA8D35">**UI Ativada**\: </font>Todos os controles de edição ficam ativos&#x20;
4. <font color="#DA8D35">**Auto-Travamento**\:</font> Se o usuário ainda estiver no recurso, ele pode adquirir o bloqueio&#x20;

***

# <font color="#DA8D35">6 - Configuração</font>

<font color="#DA8D35">**Tempo de Espera do Bloqueio** </font>

Altere o tempo de validade da fechadura:

<font color="#DA8D35">**Backend** </font>():`server/src/routes/locks/handlers.ts`

```javascript
const LOCK_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
```

<font color="#DA8D35">**Intervalo de Batimentos cardíacos** </font>

Altere a frequência com que os cadeados são renovados:

<font color="#DA8D35">**Frontend** </font>():`client/src/features/project/stores/resource-locks.ts`

```javascript
const HEARTBEAT_INTERVAL = 4000; // 4 seconds
```

<font color="#DA8D35">**Intervalo de votação** </font>

Alterem a frequência de pesquisa de status do bloqueio:

<font color="#DA8D35">**Frontend** </font>():`client/src/features/project/queries/resource-locks.ts`

```javascript
const WITH_LOCKS_INTERVAL = 5000;   // 5 seconds
const WITHOUT_LOCKS_INTERVAL = 30000; // 30 seconds
```

***

# <font color="#DA8D35">7 - Solução de problemas</font>

<font color="#DA8D35">**Trava não soltando** </font>

<font color="#DA8D35">**Sintomas**\:</font> Usuário fechou o navegador, mas o bloqueio persiste

<font color="#DA8D35">**Solução**\:</font> Espere 5 minutos pela expiração automática ou use liberação forçada:

```javascript
curl -X POST http://localhost:8000/api/locks/force \
  -H "Content-Type: application/json" \
  -d '{
    "resourceType": "screen",
    "resourceId": "uuid-here"
  }'
```

****

<font color="#DA8D35">**Múltiplos usuários veem diferentes estados de bloqueio** </font>

<font color="#DA8D35">**Sintomas**\: </font>Usuários veem informações conflitantes sobre bloqueios

<font color="#DA8D35">**Causa**\: </font>Intervalo de pesquisa muito longo ou problemas de rede

<font color="#DA8D35">**Soluções**\:</font>

1. Reduzir o intervalo de votação na produção.
2. Verifique a conectividade da rede.
3. Verificar se o backend está respondendo.
4. Verifique a conexão com o banco de dados.

****

<font color="#DA8D35">**Bloqueio adquirido, mas interface não atualizando** </font>

<font color="#DA8D35">**Sintomas**\:</font> O bloqueio existe no banco de dados, mas a interface mostra desbloqueada

<font color="#DA8D35">**Causa**\:</font> Problema com o cache de React Query ou sinal que não está sendo atualizado

<font color="#DA8D35">**Soluções**\: </font>

1. Verifique o console do navegador para erros.
2. Verificar é chamado em componentes.
3. Limpar o cache de Consultas React.
4. Atualizar a página `useSignals()`



<font color="#DA8D35">**Batimentos cardíacos não enviando** </font>

<font color="#DA8D35">**Sintomas**\:</font> O bloqueio expira enquanto o usuário está editando ativamente

<font color="#DA8D35">**Causa**\: </font>Intervalo de batimentos cardíacos parou ou problemas na rede

<font color="#DA8D35">**Soluções**\: </font>

1. Verifique o console do navegador para erros de rede.
2. Verificar se o usuário ainda está autenticado.
3. Verifique se o intervalo está sendo liberado incorretamente.
4. Verificar se o endpoint backend está funcionando `/api/locks/renew`



<font color="#DA8D35">**As cores dos avatares são idênticas** </font>

<font color="#DA8D35">**Sintomas**\:</font> Usuários diferentes têm a mesma cor de avatar

<font color="#DA8D35">**Causa**\:</font> Colisão de hash no algoritmo de geração de cor

<font color="#DA8D35">**Solução**\:</font> Isso foi corrigido com o hash rolante polinomial. Se ainda ocorrer:&#x20;

1. Verificar se o código mais recente foi implantado&#x20;
2. Função de verificação&#x20;
3. Garantir que está sendo passado para o componente `generateAvatarColor()userIdUserAvatar`

***

# <font color="#DA8D35">8. Melhores Práticas</font>

### <font color="#DA8D35">**Para desenvolvedores** </font>

1. <font color="#DA8D35">**Sempre Limpe**\: </font>Garanta que as travas sejam liberadas quando o componente for desmontado&#x20;
2. <font color="#DA8D35">**Erros de Manipulação**\:</font> Gerencie com elegância falhas de aquisição de travas&#x20;
3. <font color="#DA8D35">**Use Sinal Calculado**\:</font> Referência em vez de recalcularisEditingDisabled&#x20;
4. <font color="#DA8D35">**Teste de Concorrência**\:</font> Teste com múltiplos usuários editando simultaneamente&#x20;
5. <font color="#DA8D35">**Monitore o desempenho\:** </font>Fique atento a excesso de polling ou chamadas API&#x20;

****

### <font color="#DA8D35">**Para usuários** </font>

1. <font color="#DA8D35">**Fechar Trancas de Liberação**\:</font> Feche recursos ao terminar a edição&#x20;
2. <font color="#DA8D35">**Não force o fechamento**\: </font>Use a navegação adequada para garantir a limpeza&#x20;
3. <font color="#DA8D35">**Aguarde a expiração**\: </font>Se a trava estiver presa, espere 5 minutos&#x20;
4. <font color="#DA8D35">**Comunique\:**</font> Coordena com a equipe quem edita o quê&#x20;
5. <font color="#DA8D35">**Atualize se necessário**\:</font> Se a interface parecer travada, atualize a página&#x20;



### <font color="#DA8D35">Para Administradores </font>

1. <font color="#DA8D35">**Fechaduras de monitor**\:</font> Verifique periodicamente se estão desgastadas&#x20;
2. <font color="#DA8D35">**Definir Tempos Razoáveis**\: </font>Equilíbrio entre usabilidade e disponibilidade de recursos&#x20;
3. <font color="#DA8D35">**Liberação Forçada com Parcimónia**\:</font> Use apenas quando necessário&#x20;
4. <font color="#DA8D35">**Manutenção do Banco de Dados**\: </font>Limpeza regular de registros de fechaduras vencidas&#x20;
5. <font color="#DA8D35">**Análise de Log**\:</font> Monitorar padrões de aquisição de bloqueios para detectar problemas&#x20;

***

# <font color="#DA8D35">9 - Melhorias Futuras</font>

### <font color="#DA8D35">Características Planejadas </font>

- <font color="#DA8D35">**Suporte a WebSocket**\: </font>Notificações de bloqueio em tempo real em vez de sondagem&#x20;
- <font color="#DA8D35">**Roubo de Fechaduras**\: </font>Permitir que administradores forcem a aquisição de travas&#x20;
- <font color="#DA8D35">**Histórico de Bloqueios**\:</font> Rastreie quem travou recursos e quando&#x20;
- <font color="#DA8D35">**Análise de Fechaduras**\:</font> Monitore os padrões de uso das fechaduras&#x20;
- <font color="#DA8D35">**Cursores Colaborativos**\:</font> Mostre onde outros usuários estão trabalhando&#x20;
- <font color="#DA8D35">**Resolução de Conflitos**\: </font>Mesclar mudanças conflitantes quando múltiplos usuários editam&#x20;
- <font color="#DA8D35">**Solicitações de Trava**\: </font>Solicita liberação do bloqueio do atual detentor&#x20;
- <font color="#DA8D35">**Fila de Bloqueio**\: </font>Usuários em fila aguardando um recurso travado&#x20;



### <font color="#DA8D35">Otimizações de desempenho </font>

- <font color="#DA8D35">**Redis Cache**\: </font>Armazene bloqueios no Redis para acesso mais rápido&#x20;
- <font color="#DA8D35">**Assinaturas GraphQL**\: </font>Atualizações em tempo real via assinaturas&#x20;
- <font color="#DA8D35">**Bloqueio Otimista**\:</font> Permitir edição com detecção de conflitos&#x20;
- <font color="#DA8D35">**Pool de Bloqueios**\: </font>Agrupar múltiplos recursos sob um único bloqueio&#x20;
- <font color="#DA8D35">**Pesquisa Inteligente**\: </font>Ajuste a frequência das pesquisas com base na atividade&#x20;

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/-4_SDcjt_aznvASbRyZ46-20260601-191750.gif)

