Fluxos visuais transformam rotinas de análise em grafos reproduzíveis. Cada bloco recebe artefatos tipados, produz novos artefatos e registra duração, entradas, saídas, hashes e versões.
Começar #
- Abra Configurações → Extensões → Fluxos.
- Instale os modelos do laboratório e abra um fluxo.
- Revise a aprovação e execute a fixture.
- Toque na saída de uma etapa e depois na entrada da seguinte; apenas tipos compatíveis são aceitos.
A condição oferece rotas true e false, e a reunião espera as entradas selecionadas. Arraste, amplie, organize ou duplique blocos. O painel de propriedades fica na lateral em telas maiores e embaixo no celular.
Tipos de bloco #
| Bloco | Função |
|---|---|
capture | entrada de tráfego capturado |
filter | seleciona artefatos |
condition | divide o fluxo em true e false |
join | reúne ramos |
parser | interpreta conteúdo por tipo MIME |
request | envia requests aprovadas |
crawler | percorre páginas com GET e HEAD |
storage | persiste resultados |
report | consolida relatório |
connector | executa uma capacidade do CatBridge |
extension | executa uma etapa registrada por extensão |
Artefatos #
| Tipo | Conteúdo típico |
|---|---|
http | mensagem HTTP completa |
endpoint | URL observada, com origem |
jwt | claims decodificadas, sem verificação de assinatura |
secret | candidato a segredo, mascarado |
analysis | análise estruturada |
finding | achado com severidade e confiança |
record | registro genérico |
javascript | fonte JavaScript estática |
openapi | especificação OpenAPI |
O host gera identidade, SHA-256, origem, versões, fontes e proteção de cada artefato. Copiar uma entrada cria uma nova evidência ligada à anterior, e metadados fornecidos pelo script não substituem os do host.
Registrar etapas e parsers #
cat.pipeline.registerStep({
id: 'lab.inspecionar',
title: {'pt-BR': 'Inspecionar', en: 'Inspect'},
inputs: ['http'],
outputs: ['http', 'analysis']
}, async ctx => {
for (const entrada of ctx.inputs) {
if (ctx.signal.aborted) return;
ctx.emit('http', entrada.data);
ctx.emit('analysis', {url: entrada.data.url, confidence: 'observed'});
}
ctx.progress(1);
});
cat.parsers.register({
id: 'lab.json',
title: {'pt-BR': 'Ler JSON', en: 'Parse JSON'},
inputs: ['http'],
outputs: ['record'],
mimeTypes: ['application/json']
}, ctx => {
for (const entrada of ctx.inputs) {
if (!entrada.data.body.complete) throw new Error('E_BODY');
ctx.emit('record', JSON.parse(cat.bytes.toText(entrada.data.body.bytes)));
}
});Declare pipeline.step ou parsers no manifesto e, para receber HTTP, também traffic.read. Apenas tipos declarados podem ser emitidos.
Contexto da etapa #
| Campo | Descrição |
|---|---|
ctx.inputs | artefatos de entrada |
ctx.config | configuração própria da etapa |
ctx.runId, ctx.nodeId | identidade da execução e do bloco |
ctx.revisionId | revisão aprovada em execução |
ctx.protection | PUBLIC, PROTECTED ou SECRET |
ctx.restored | estado do último checkpoint |
ctx.checkpoint(estado) | grava até 32 KiB de JSON |
ctx.emit(tipo, dados) | emite um artefato |
ctx.progress(valor) | progresso de 0 a 1 |
ctx.signal.aborted | indica cancelamento |
Checkpoints e retomada #
cat.pipeline.registerStep({
id: 'lab.retomar',
title: {'pt-BR': 'Retomar', en: 'Resume'},
inputs: ['record'],
outputs: ['record']
}, async ctx => {
let feitos = ctx.restored?.feitos || 0;
for (; feitos < ctx.inputs.length; feitos++) {
if (ctx.signal.aborted) return;
ctx.emit('record', ctx.inputs[feitos].data);
await ctx.checkpoint({feitos: feitos + 1});
}
});Resultados, operações e checkpoints são gravados de forma incremental. A retomada reutiliza etapas concluídas. Uma operação de resultado desconhecido nunca é reenviada automaticamente; repeti-la exige autorização explícita depois de revisar possíveis efeitos duplicados. Checkpoints não tornam transações externas idempotentes por si só.
Aprovação e revisões #
O Flow ID é permanente. A revisão é o SHA-256 da definição executável, das dependências e da política efetiva; nome e posição visual não entram nesse hash. Salvar ou exportar sem mudanças executáveis preserva a ativação. Alterar código, configurações, escopo, métodos, proteção, capacidades ou limites exige nova aprovação, e revisões anteriores ficam arquivadas.
Envios precisam de network=true, execução com envios, destino permitido e capacidade própria. O tráfego gerado tem source=workflow, flowOrigin e pluginOrigin, e não reinicia o fluxo.
Falhas e histórico #
- Uma falha bloqueia seus dependentes; ramificações independentes podem terminar.
- Um ramo não escolhido fica ignorado.
- O histórico mostra duração, progresso, entradas, saídas, erros, hashes e versões.
- A comparação identifica resultados adicionados ou removidos e mudanças de versões.
- Reproduzir cria uma execução nova, inicialmente sem rede.
Limites #
| Recurso | Padrão | Teto |
|---|---|---|
| Fluxos simultâneos | 2 | 4 |
| Blocos por fluxo | 32 | 128 |
| Conexões | 64 | 256 |
| Fila | 128 | 512 |
| Artefatos por execução | 1.000 | 5.000 |
Análises usam dois ambientes de 32 MiB, separados dos quatro ambientes do proxy. Uma execução tem até 15 minutos e tarefas de conector até 10 minutos. Saturação é registrada e não suspende o encaminhamento do proxy.
Modelos incluídos #
| Modelo | Etapas |
|---|---|
| Auditoria de identidade | Captura → JWT → Segredos → Autorização → Relatório |
| Mapa de API | Crawler → JavaScript → Endpoints → OpenAPI → Relatório |
| Ramificações | Condição sobre Authorization, ramos de JWT e segredos, reunião e relatório |
| Auditoria de API | Captura → httpx → Katana → reunião → comparação OpenAPI → Schemathesis → relatório |