engineering architecture

Arquitetura orientada a traits: como o ZeroClaw torna agentes de IA extensíveis sem plugins

ZeroClaws.io

ZeroClaws.io

@zeroclaws

February 25, 2026

8 min de leitura

Arquitetura orientada a traits: como o ZeroClaw torna agentes de IA extensíveis sem plugins

Quando o ClawHub foi lançado, parecia a forma óbvia de estender um runtime de agente de IA. Um marketplace de skills —instale o que precisar, pule o que não precisar, contribua com os seus. O modelo funcionou para extensões de navegador, para plugins do VS Code, para pacotes npm. Por que não para agentes de IA?

No início de 2026, a resposta estava clara. Pesquisadores de segurança descobriram que 41,7% das skills publicadas no ClawHub continham vulnerabilidades. Centenas eram diretamente maliciosas. O modelo de plugins, descobriu-se, tem um problema fundamental quando aplicado a software que roda com permissões elevadas na sua máquina.

O ZeroClaw foi projetado com esse modo de falha em mente. Em vez de um sistema de plugins, usa traits do Rust.

O que há de errado com sistemas de plugins em tempo de execução

O problema central com sistemas de plugins tradicionais não é a qualidade da implementação —é o modelo em si. Quando você instala um plugin, está baixando código da internet e executando dentro do processo da sua aplicação, com as permissões da sua aplicação. O plugin pode ler seus arquivos, acessar sua rede, ler suas variáveis de ambiente e fazer qualquer outra coisa que sua aplicação pode fazer.

Os modos de falha específicos são previsíveis. Carregamento de código em tempo de execução significa que plugins executam código arbitrário no processo host. Confiança por padrão significa que uma vez instalado um plugin, ele tem as mesmas permissões que a aplicação host. Ataques à cadeia de suprimentos são trivialmente fáceis: publique um pacote com nome similar a um popular, espere os usuários instalarem.

Traits: um modelo diferente

Um trait do Rust é um contrato de interface aplicado pelo compilador. Define quais métodos uma implementação deve fornecer, quais tipos esses métodos aceitam e quais garantias de thread-safety devem cumprir. Aqui está o trait de canal do ZeroClaw, simplificado:

```rust pub trait Channel: Send + Sync + 'static { fn name(&self) -> &str; async fn connect(&mut self) -> Result<()>; async fn receive(&self) -> Result; async fn send(&self, msg: Response) -> Result<()>; async fn disconnect(&self) -> Result<()>; } ```

Cada canal —Telegram, Discord, WhatsApp, Signal, Matrix, IRC— implementa esse trait. O compilador garante segurança de tipos, segurança de threads e completude.

Criticamente: novos canais são compilados no binário, não carregados em tempo de execução. Não há injeção de código, não há carregamento dinâmico, não há decisão de confiança a tomar no momento da instalação.

Adicionando um novo canal

A experiência prática de estender o ZeroClaw é implementar o trait. Aqui está como um adaptador de canal Matrix se parece:

```rust pub struct MatrixChannel { homeserver: String, client: MatrixClient, }

impl Channel for MatrixChannel { fn name(&self) -> &str { "matrix" }

async fn connect(&mut self) -> Result<()> { self.client = MatrixClient::new(&self.homeserver).await?; self.client.login().await?; Ok(()) }

async fn receive(&self) -> Result { let event = self.client.next_message().await?; Ok(Message::from(event)) }

async fn send(&self, msg: Response) -> Result<()> { self.client.send_text(&msg.channel_id, &msg.text).await?; Ok(()) }

async fn disconnect(&self) -> Result<()> { self.client.logout().await } } ```

São cerca de 50 linhas para um adaptador de canal completo. O compilador verifica que a implementação está correta antes do código ser distribuído.

O mesmo padrão para cada ponto de extensão

O ZeroClaw usa traits para cada lugar onde o sistema precisa ser extensível. Provedores de IA implementam um trait `Provider`. Ferramentas implementam um trait `Tool` que requer declarar permissões antecipadamente:

```rust pub trait Tool: Send + Sync { fn name(&self) -> &str; fn description(&self) -> &str; async fn execute(&self, args: Value) -> Result; fn permissions(&self) -> Permissions; } ```

Cada ferramenta declara o que precisa —acesso a arquivos, acesso à rede, caminhos específicos— antes de rodar. O runtime aplica listas de permissões baseadas nessas declarações.

A comparação de segurança

| Aspecto | Sistema de plugins | Sistema de traits | |--------|--------------|-------------| | Origem do código | Baixado em tempo de execução | Compilado em tempo de build | | Verificação | Baseada em confiança | Verificada pelo compilador | | Permissões | Em tempo de execução, frequentemente sem verificação | Declaradas em tipos, aplicadas | | Cadeia de suprimentos | Vulnerável | Sem carregamento de código externo | | Segurança de tipos | Erros em tempo de execução | Erros em tempo de compilação |

A ideia central é simples: você não pode ter um ataque à cadeia de suprimentos se não tem uma cadeia de suprimentos. As extensões do ZeroClaw são compiladas, não baixadas.

O trade-off real

A abordagem de traits significa que você não pode instalar um novo canal baixando um arquivo. Adicionar uma extensão personalizada requer escrever Rust, adicioná-lo ao código-fonte do ZeroClaw e compilar um novo binário. Para a maioria dos usuários, os 30+ canais e ferramentas integrados cobrem tudo que precisam.

Esse trade-off é intencional. Uma superfície de extensão menor e verificada é melhor que uma grande e não verificada. O ClawHub do OpenClaw demonstrou o que acontece quando você otimiza o tamanho do ecossistema sobre segurança. O ZeroClaw otimiza o oposto, e a contagem de CVEs reflete essa escolha.

Fique por Dentro

Receba atualizações sobre novos releases, integrações e infraestrutura de agentes em Rust. Sem spam, cancele quando quiser.