# PoCo Agent (Proof-of-Concept Agent) Este diretório contém a implementação principal do **Agente PoCo**, uma arquitetura autônoma baseada no framework **LangGraph**, desenvolvida para atuar como um auditor de segurança e desenvolvedor de exploits (Proof of Concepts) em Smart Contracts. ## 1. Visão Geral O Agente recebe como entrada um relatório de vulnerabilidade (escrito por um auditor humano) e o código-fonte do contrato afetado. O objetivo do agente é explorar iterativamente o ambiente local usando o framework **Foundry** até conseguir escrever um arquivo `Exploit.t.sol` que prove matematicamente que a vulnerabilidade descrita é explorável (roubando fundos, burlando acessos, etc). Diferente de scripts sequenciais convencionais, este agente emprega um **Loop ReAct** (Raciocínio e Ação) iterativo: 1. **Lê e entende** o contexto. 2. **Planeja** uma estratégia de ataque em múltiplos passos. 3. **Escreve** o código no disco. 4. **Compila e testa** localmente via terminal. 5. **Analisa o erro** de compilação ou de lógica e auto-corrige o exploit na próxima iteração. ## 2. Componentes da Arquitetura O sistema é orquestrado através de uma Máquina de Estados Finita (Graph) no `graph.ts`, composta por 5 nós fundamentais: * **`contextNode`**: Nó de entrada. Carrega o relatório original do auditor e injeta no estado global do agente. * **`routerNode`**: Formata as restrições do ambiente e monta o `System Prompt` que define a persona do LLM. * **`pocoAgentNode`**: O motor cognitivo. Utiliza o modelo de linguagem avançado (ex: Claude 3.5 Sonnet) para raciocinar sobre as falhas e escolher qual ferramenta invocar. * **`pocoToolsNode`**: O executor mecânico das ferramentas. Acessa o FileSystem (`read_file`, `write_file`) e o terminal (`smart_contract_test`, `smart_contract_compile`). * **`trackToolCallsNode`**: Intercepta a saída do teste. Se o teste passar (`Test Passed Successfully!`), ele interrompe o grafo prematuramente definindo o status de `success`. Se falhar, devolve o feedback de erro para o `pocoAgentNode` tentar novamente, até o limite de 30 iterações. ## 3. Estrutura de Diretórios ```text src/agents/tester/ ├── index.ts # Entrypoint da biblioteca, orquestra e dispara o grafo LangGraph. ├── agent.ts # Definição e wrapper do agente para integração externa. ├── graph.ts # A topologia da rede ReAct (nodes e edges). ├── state.ts # Interface de Estado global que trafega entre os nós do grafo. ├── types.ts # Tipagens TypeScript (Report, Vulnerability, etc). ├── tools/ # (Depreciado) Ferramentas antigas de suporte. ├── utils/ # Scripts utilitários e stubs de dependências. └── nodes/ ├── context.ts # Setup inicial e parser do contexto. ├── router.ts # Montagem do prompt base. └── pocoAgent.ts # Chamada direta à API do LLM com as Tools associadas. ``` ## 4. Como Executar O agente não é chamado isoladamente pelo usuário, mas sim invocado pelo orquestrador principal de Benchmark ou pela CLI da ferramenta. Para avaliar a eficácia do agente, recomenda-se executar os scripts do Benchmark na raiz do projeto: ```bash # Executa a avaliação em cima do dataset Hard (Proof-of-Patch) DEBUG_CONTEXT=true FORCE_RERUN=true npx tsx src/benchmark/runTesterBenchmark.ts 100 ``` ## 5. Ferramentas (Tools) A maestria do agente vem de seu arsenal de ferramentas (`tools.ts`), que operam com alta precisão cirúrgica para economizar tokens: * `read_file`, `list_dir`: Explorar a árvore de contratos vulneráveis. * `todo_planner`: Criar uma lista de tarefas persistente para orientar a memória de longo prazo durante as 30 iterações. * `write_file`, `edit_file`: Gerar ou alterar partes específicas do exploit de forma isolada. * `smart_contract_compile`, `smart_contract_test`: Interagir diretamente com a CLI do `forge` para compilar ou rodar os testes, com os logs canalizados de volta para o agente. > **Nota Metodológica:** O agente assume que está operando em um repositório configurado e funcional. Se as dependências do repositório alvo (ex: submódulos do foundry) estiverem quebradas ou faltantes fisicamente no disco, o agente tentará alucinar "Mocks" arquiteturais para forçar o projeto a compilar, o que foge do escopo do teste da vulnerabilidade. Sempre garanta que o projeto alvo passa por um `forge build` limpo antes de submetê-lo à auditoria.