# Origem: https://docs.tunnelhub.io/ # TunnelHub TunnelHub é uma plataforma de integração, automação e gerenciamento de APIs orientada a times que precisam operar fluxos em produção, com observabilidade, segurança e separação por ambiente. Esta documentação ajuda você a configurar, usar e acompanhar suas integrações no TunnelHub. Comece pelos guias e consulte as referências de cada recurso conforme sua necessidade. Hoje a plataforma combina quatro frentes principais: * Produto web para configurar ambientes, pacotes, Tabelas De/Para, sistemas, automações, APIs, usuários e configurações administrativas. * SDK em TypeScript para implementar automações com fluxos prontos, logging, delta, parâmetros, Tabelas De/Para e Sequências. * CLI para autenticar, listar recursos, criar pacotes, criar automações e publicar novas versões. * MCP para consultar recursos, investigar execuções e realizar operações pelo seu assistente de IA, respeitando as permissões da sua conta. ## O que você encontra no TunnelHub * **Produto**: ambientes, pacotes, Tabelas De/Para, sistemas, automações, Tabelas de Apoio, Sequências, monitoramento e administração. * **API Management**: definição de APIs, planos de uso, chaves de API, servidores de recursos, clientes e logs de execução. * **Developer tooling**: CLI, SDK, MCP e skill para agentes com papéis diferentes no ciclo de desenvolvimento e suporte. ## Como navegar nesta documentação * Se você está começando agora, siga [Criando sua primeira automação](/primeiros-passos/creating-your-first-automation.md). * Se você quer entender o modelo do produto, comece por [Conceitos principais](/produto/core-concepts.md). * Se você precisa modelar configuração operacional no produto, leia [Tabelas De/Para](/produto/data-stores.md) e [Sistemas](/produto/systems.md). * Se você vai desenvolver integrações, consulte as seções de [CLI](/cli/cli.md) e [SDK](/sdk/sdk.md). * Se você vai investigar execuções ou operar o ambiente via cliente MCP, consulte [MCP](/mcp/mcp.md). ## Skill para agentes Se você desenvolve automações com frequência, vale instalar o skill público `tunnelhub-sdk`. Ele ajuda a trabalhar com os fluxos do SDK, parâmetros, sistemas, Tabelas De/Para, Sequências, logging, interceptor HTTP e testes em plataformas de agentes compatíveis. Instalação: ```bash npx skills add tunnelhub/agent-skills --skill tunnelhub-sdk -a opencode ``` Instalação global: ```bash npx skills add tunnelhub/agent-skills --skill tunnelhub-sdk -a opencode -g ``` ## Requisitos gerais * Node.js 22 ou superior para usar a CLI ou desenvolver com o SDK. * Acesso a uma conta TunnelHub com pelo menos um ambiente. * Permissões adequadas para criar pacotes, automações, APIs ou usuários, dependendo do seu perfil. ## Principais conceitos * **Ambiente**: separa configuração e execução, como DEV, QAS e PRD. * **Pacote**: agrupador lógico de automações, sistemas e artefatos relacionados. * **Sistema**: definição reutilizável de conexão com serviços externos. * **Automação**: execução serverless ou em container que processa integrações e gera logs operacionais. * **Tabela De/Para**: conjunto de dados configurável no produto, usado para mapeamentos, listas de referência e traduções de valores. * **Tabela de Apoio**: tabela relacional gerenciada pelo produto para dados operacionais estruturados. * **Sequência**: gerador sequencial para identificadores controlados pela plataforma. Se precisar de ajuda para escolher um caminho, comece por [Conceitos principais](/produto/core-concepts.md). --- # Origem: https://docs.tunnelhub.io/primeiros-passos/creating-your-first-automation # Criando sua primeira automação Este guia mostra um fluxo atual de onboarding para criar, desenvolver, publicar e acompanhar uma automação no TunnelHub. ## Antes de começar Você vai precisar de: * uma conta TunnelHub com acesso a pelo menos um ambiente; * Node.js 22+ na sua máquina; * npm ou pnpm; * permissão para criar pacote e automação no ambiente desejado. ## 1. Instale a CLI ```bash npm install -g @tunnelhub/cli ``` Depois da instalação, você pode usar `tunnelhub` ou o alias curto `th`. ## 2. Faça login O fluxo recomendado usa autenticação via navegador: ```bash tunnelhub login ``` Durante o login, a CLI solicita o `Tenant ID` e abre a autenticação no frontend do TunnelHub. Em casos específicos, existe fallback por usuário e senha: ```bash tunnelhub login --password ``` Para validar a sessão atual: ```bash tunnelhub login-check ``` ## 3. Descubra seus ambientes Liste os ambientes disponíveis e identifique o nome ou UUID do ambiente onde você quer trabalhar: ```bash tunnelhub list-environments ``` Os comandos da CLI aceitam nome ou UUID do ambiente. Internamente, a CLI resolve esse valor para o identificador correto. ## 4. Crie um pacote Pacotes organizam recursos relacionados, como automações, sistemas e Tabelas De/Para. ```bash tunnelhub create-package --env DEV ``` O comando é interativo e solicita nome e descrição. ## 5. Crie uma automação Agora crie a automação com bootstrap local de um template oficial: ```bash tunnelhub create-automation --env DEV ``` Durante o fluxo, você escolhe: * o tipo base da automação; * o pacote; * nome e descrição; * período de retenção de logs; * URL do repositório, se desejar informar. Os templates atuais cobrem quatro modelos: * No delta * No delta batch * Delta * Delta batch Ao final, a CLI: * cria a automação no TunnelHub; * baixa um template do GitHub; * extrai o projeto para uma nova pasta local; * grava o `service.uuid` no `tunnelhub.yml`. ## 6. Entenda a estrutura do projeto O projeto gerado normalmente inclui: * `src/index.ts` como handler principal; * uma classe de integração que herda um dos flows do SDK; * `metadata` para definir as colunas visíveis no monitoramento; * `tunnelhub.yml` com identificação do serviço e configuração de build/deploy; * testes básicos para execução local. O desenvolvimento atual deve ser feito com o `@tunnelhub/sdk`, usando um dos fluxos públicos: * `NoDeltaIntegrationFlow` * `NoDeltaBatchIntegrationFlow` * `DeltaIntegrationFlow` * `BatchDeltaIntegrationFlow` ## 7. Escolha o flow certo Use esta regra prática: * **No delta** quando a automação apenas lê e envia dados, sem reconciliar estado; * **No delta batch** quando o fluxo continua sem delta, mas o volume pede processamento em lote; * **Delta** quando você precisa comparar origem e destino para decidir entre insert, update e delete; * **Delta batch** quando esse mesmo cenário de reconciliação precisa operar em lotes. Se estiver em dúvida, comece pelo flow mais simples que atende o caso. ## 8. Modele no produto antes de codar Evite valores fixos no código. O padrão atual é configurar no produto: * **Sistemas** para conexões com serviços externos; * **Parâmetros** para valores variáveis da automação; * **Tabelas De/Para** para mapeamentos e regras de negócio configuráveis; * **Sequências** para geração de identificadores. No SDK, esses dados chegam no payload de execução e podem ser acessados pelos helpers públicos. ## 9. Implemente a integração Em alto nível, sua automação precisa: * carregar dados da origem; * opcionalmente comparar com o destino, nos fluxos com delta; * executar insert, update, delete ou send; * definir os metadados que aparecerão no monitoramento. Exemplo simplificado de metadados: ```ts defineMetadata(): Metadata[] { return [ { fieldName: 'id', fieldLabel: 'ID', fieldType: 'TEXT' }, { fieldName: 'status', fieldLabel: 'Status do item', fieldType: 'TEXT' }, { fieldName: 'updatedAt', fieldLabel: 'Atualizado em', fieldType: 'DATETIME' }, ]; } ``` Os metadados controlam como os itens aparecem nos logs de processamento. ## 10. Teste localmente Os templates incluem testes iniciais. Para testes locais, habilite o modo de teste do SDK quando fizer sentido: ```ts import { SDK } from '@tunnelhub/sdk'; beforeAll(() => { SDK.testMode = true; }); ``` Esse modo evita efeitos colaterais da execução real da plataforma durante os testes. ## 11. Gere o artefato Antes do deploy, gere o bundle definido no seu projeto. O contrato importante é: * existir um `tunnelhub.yml` na raiz do projeto; * o campo `package.artifact` apontar para o ZIP ou artefato publicado; * o projeto estar pronto para o ambiente de execução configurado. ## 12. Faça o deploy Com o artefato pronto, publique uma nova versão: ```bash tunnelhub deploy-automation --env DEV --message "primeiro deploy" ``` Opcionalmente, você pode informar `--automation` e `--publish`. Em pipelines CI/CD, use `--message` para carregar contexto como SHA, autor do commit ou identificador da execução. O deploy: * valida seu `tunnelhub.yml`; * faz upload do artefato para S3 por URL assinada; * solicita a criação do deploy na plataforma. ## 13. Configure o disparo Na tela da automação, você pode configurar os gatilhos suportados hoje: * webhook; * agendamento; * inbound email. Dependendo do tipo escolhido, a automação pode ser executada manualmente, por URL ou por agenda. Para gatilhos de agendamento, use **Não executar antes de** quando quiser preparar a agenda antecipadamente e permitir execuções somente a partir de uma data e hora de go-live. ## 14. Acompanhe a execução Depois do deploy, use a interface web em `Automations > Monitoring` para acompanhar: * status geral da execução; * volume processado; * logs de processamento por item; * traces técnicos; * downloads e ações operacionais quando disponíveis. ## 15. Configure notificações de falha Na aba **Notificações** da automação, adicione os destinatários que devem ser alertados quando uma execução falhar. Você pode enviar alertas por e-mail, Discord, Microsoft Teams, Google Chat, Slack ou webhook genérico. Para os canais de colaboração, siga as instruções específicas do provedor e informe a URL gerada no produto. No Microsoft Teams, gere a URL com o **Workflows (Power Automate)**, e não com o conector legado **Incoming Webhook**. Escolha também o idioma da mensagem e trate URLs de webhook como segredos. Para instruções e links de configuração de cada canal, consulte [Notificações](/produto/automations.md#notificações). ## Próximos passos * Leia [Do template ao primeiro deploy](/primeiros-passos/from-template-to-first-deploy.md). * Leia [Modelando uma automação no produto](/primeiros-passos/modeling-an-automation-in-the-product.md). * Leia [SDK](/sdk/sdk.md) para escolher o flow correto. * Leia [Monitoramento](/produto/monitoring.md) para investigar falhas e execuções. * Leia [`tunnelhub.yml`](/cli/tunnelhub-yml.md) para entender o contrato de build e deploy. --- # Origem: https://docs.tunnelhub.io/primeiros-passos/from-template-to-first-deploy # Do template ao primeiro deploy Esta página conecta o template oficial ao fluxo real de desenvolvimento de uma automação TunnelHub. ## O que a CLI gera Quando você executa `tunnelhub create-automation --env `, a CLI cria a automação na plataforma e baixa um dos templates oficiais para sua máquina. O projeto gerado costuma incluir: * `src/index.ts` com o handler principal; * uma classe de integração no diretório `src/core/` ou equivalente; * `metadata` com os campos exibidos no monitoramento; * `__tests__` com exemplos básicos; * `tunnelhub.yml`; * scripts de build e teste. ## 1. Abra o handler O handler normalmente: * instancia sua classe de integração; * chama `AutomationExecution.executeAutomation(...)`; * retorna sucesso HTTP quando a execução termina sem erro fatal. Esse é o contrato central do runtime público. ## 2. Abra a classe de integração É nessa classe que você implementa o flow escolhido. Exemplos de responsabilidade por flow: * **No delta**: `loadSourceSystemData()` e `sendData()`; * **No delta batch**: `loadSourceSystemData()` e `sendDataInBatch()`; * **Delta**: `loadSourceSystemData()`, `loadTargetSystemData()`, `insertAction()`, `updateAction()`, `deleteAction()`; * **Delta batch**: `loadSourceSystemData()`, `loadTargetSystemData()`, `batchInsertAction()`, `batchUpdateAction()` e `batchDeleteAction()`. ## 3. Defina os metadados `defineMetadata()` define as colunas visíveis no monitoramento. Pense nesses campos como contrato operacional para suporte e negócio. Bons metadados ajudam a responder rapidamente: * qual item falhou; * qual identificador localizar no sistema de origem; * qual status funcional estava envolvido. ## 4. Ligue código à configuração de produto Antes de concluir a implementação, confirme que a automação no portal tem os recursos certos associados: * systems necessários; * parâmetros necessários; * Tabelas De/Para necessárias; * Sequências necessárias. No código, o padrão recomendado é localizar systems por `internalName` e usar helpers do SDK em vez de espalhar configuração no projeto. ## 5. Revise o `tunnelhub.yml` Confirme pelo menos: * `service.uuid` preenchido; * `configuration.entrypoint` coerente com o bundle gerado; * `package.artifact` apontando para o ZIP final. ## 6. Rode testes locais Os templates incluem um teste inicial. Expanda essa suíte conforme você implementa a integração. Checklist mínimo: * handler sobe sem erro; * classe de integração instancia corretamente; * metadados são válidos; * principal caminho feliz da integração está coberto. ## 7. Gere o artefato O comando exato depende do template, mas o resultado esperado é sempre um ZIP configurado em `package.artifact`. Antes do deploy, confirme que o arquivo realmente existe no caminho configurado. ## 8. Publique ```bash tunnelhub deploy-automation --env DEV --message "primeira versão" ``` Se necessário, sobrescreva o UUID com `--automation`. Em pipelines CI/CD, mantenha o contexto humano no `--message`, por exemplo com SHA e e-mail do autor do commit. ## 9. Valide no produto Depois do deploy, valide no portal: * se a nova versão apareceu na automação; * se os triggers esperados estão configurados; * se a execução manual ou agendada funciona; * se os logs e traces fazem sentido. ## Checklist final * flow escolhido corretamente; * systems, parâmetros, Tabelas De/Para e Sequências configuradas; * `tunnelhub.yml` coerente; * artefato gerado; * deploy publicado; * monitoramento validado. --- # Origem: https://docs.tunnelhub.io/primeiros-passos/modeling-an-automation-in-the-product # Modelando uma automação no produto Boa parte da qualidade de uma automação no TunnelHub vem da modelagem no produto, não apenas do código. ## Ordem recomendada Um fluxo prático costuma seguir esta sequência: 1. escolher o ambiente; 2. criar ou selecionar um pacote; 3. cadastrar systems; 4. definir parâmetros; 5. criar Tabelas De/Para e Sequências, quando fizer sentido; 6. criar a automação; 7. associar os recursos necessários; 8. configurar triggers e notificações. ## Pacote Use o pacote como agrupador funcional. Ele deve refletir domínio, cliente, iniciativa ou contexto de manutenção. ## Systems Cadastre um system quando a automação depender de uma conexão externa reutilizável. Exemplos comuns: * API HTTP; * FTP/SFTP; * banco de dados; * SOAP; * SAP RFC. Boas práticas: * usar `internalName` estável; * separar credenciais por ambiente; * evitar um mesmo system para contextos sem relação. ## Parâmetros Use parâmetros para valores variáveis e pequenos estados controlados pela automação. Exemplos: * feature flags; * datas de corte; * nomes de tabela; * cursores de sincronização. Não use parâmetro para tudo. Quando o dado representa conexão, prefira `System`. Quando representa mapeamento de negócio, prefira uma Tabela De/Para. ## Tabelas De/Para Use Tabelas De/Para quando o negócio precisa manter mapeamentos e listas de referência sem alterar código. Casos típicos: * de/para de status; * códigos de filial; * mapeamento de categorias; * IDs legados para IDs externos. ## Sequências Use Sequências quando a plataforma precisa gerar identificadores centralizados e atômicos. Casos típicos: * número de lote; * identificador incremental; * chave de negócio controlada. ## Associação com a automação Uma automação só recebe em runtime os recursos explicitamente associados a ela. Revise antes do deploy: * systems corretos associados; * parâmetros esperados cadastrados; * Tabelas De/Para corretas disponíveis; * Sequências corretas criadas. ## Triggers Hoje, a modelagem pública mais comum inclui: * webhook; * scheduled; * inbound email. Escolha o trigger conforme a forma de disparo do processo, não conforme a tecnologia da origem. Use `scheduled` para rotinas recorrentes. Quando a rotina precisa ser configurada antes do go-live, preencha **Não executar antes de** com a data e hora inicial desejada. Assim a agenda pode ficar pronta no produto, mas execuções anteriores ao início planejado serão ignoradas. ## Notificações e retenção Antes de publicar em produção, revise: * retenção de logs; * notificações de falha; * quem precisa operar essa automação; * se usuários limitados precisam enxergar a execução. ## Pergunta prática de modelagem Quando estiver em dúvida sobre onde colocar uma configuração, use esta regra: * conexão externa: `System`; * valor variável da automação: `Parameter`; * regra de negócio configurável: Tabela De/Para; * contador centralizado: Sequência. --- # Origem: https://docs.tunnelhub.io/produto/core-concepts # Conceitos principais Esta página resume as entidades mais importantes do TunnelHub e como elas se relacionam. ## Estrutura base * **Tenant/empresa**: unidade principal de conta e isolamento de dados. * **Usuário**: pessoa com acesso ao portal, à CLI ou a fluxos relacionados à autenticação. * **Ambiente**: recorte operacional dentro da empresa. É comum existir DEV, QAS e PRD. * **Pacote**: agrupador funcional usado para organizar automações, systems e outros recursos. ## Recursos de integração * **System**: conexão reutilizável com banco, HTTP, FTP/SFTP, LDAP, mail, SOAP, SAP RFC, SMB e outros tipos suportados. * **Automação**: integração executável criada no produto e implementada com o SDK. * **Deploy**: versão publicada da automação, com histórico e opção de transporte entre ambientes. * **Trigger**: forma de disparo de uma automação, como webhook, agenda ou inbound email. ## Recursos de dados * **Tabela De/Para**: conjunto de dados configurável no produto, usado para mapeamentos e regras de negócio. * **Tabela de conversão**: caso comum de uma Tabela De/Para com pares `fromValue` e `toValue`. * **Sequência**: gerador sequencial usado para números de negócio ou identificadores. * **Parâmetro**: valor configurável associado a automações e systems, evitando valores fixos no código. ## Recursos operacionais * **Execução**: uma execução de automação com status, período, logs e traces. * **Processing logs**: resultado por item processado, baseado nos metadados definidos pelo SDK. * **Traces**: logs técnicos e eventos auxiliares da execução. * **Notificações**: alertas enviados quando a automação falha ou requer atenção. * **Transport**: fluxo para promover configurações e versões entre ambientes quando aplicável. ## Gestão de APIs * **API**: definição publicada via API Gateway. * **Plano de uso**: política de consumo aplicada a clientes e chaves de API. * **Chave de API**: credencial de consumo para cenários controlados por plano. * **Servidor de recursos**: conjunto de escopos OAuth usados para proteger endpoints. * **Cliente**: aplicação consumidora autenticada para fluxos OAuth e machine-to-machine. ## Ferramentas de desenvolvimento * **CLI**: usada para login, listagem de recursos, bootstrap de automações e deploy. * **SDK**: base de desenvolvimento das automações. * **MCP**: interface operacional orientada à leitura para suporte, análise e investigação. ## Fluxo típico 1. criar ou selecionar um ambiente; 2. criar um pacote; 3. cadastrar systems e parâmetros necessários; 4. criar Tabelas De/Para e Sequências quando fizer sentido; 5. criar uma automação a partir de um template; 6. implementar a integração com o SDK; 7. gerar artefato, fazer deploy e executar; 8. monitorar logs, traces, consumo e falhas. --- # Origem: https://docs.tunnelhub.io/produto/users # Usuários e permissões O TunnelHub possui controle de acesso baseado em roles, permissões e escopos de ambiente. ## Onde gerenciar O gerenciamento de usuários fica em `Administration > Users`. Nesta tela você pode: * criar usuários; * editar dados e status; * redefinir escopo de acesso; * limitar a visibilidade de recursos para usuários restritos. ## Roles mais comuns Os nomes exatos podem variar conforme o tenant, mas o modelo público gira em torno de três grupos principais: * **TenantAdmin**: acesso mais amplo, incluindo administração e configuração. * **TenantUser**: operação do produto sem o mesmo alcance administrativo. * **TenantLimitedUser**: acesso somente a recursos explicitamente liberados. Em contextos privilegiados podem existir roles sistêmicas, mas elas não costumam fazer parte do fluxo operacional padrão da maioria dos tenants. ## Escopo por ambiente Além da role, o acesso também depende dos ambientes liberados para o usuário. Isso permite, por exemplo: * operar DEV e QAS sem enxergar PRD; * limitar produção a um grupo menor; * separar funções por time ou parceiro. ## Usuários limitados Usuários limitados são importantes para cenários B2B, parceiros ou times externos. Eles podem receber acesso granular a: * automações; * Tabelas De/Para; * áreas específicas de monitoramento. Esse modelo permite expor somente o mínimo necessário para acompanhamento operacional. ## Campos principais ao criar um usuário * **Usuário**: identificador único do usuário. * **E-mail**: usado para notificações, onboarding e recuperação de acesso. * **Role**: define o escopo inicial de permissão. * **Status**: controla se o acesso está ativo. Dependendo do tenant, o cadastro também pode considerar idioma, timezone, país e ambientes liberados. ## Boas práticas * use usuários limitados para acessos externos; * evite compartilhar contas; * revise periodicamente os acessos administrativos; * alinhe automações e Tabelas De/Para liberadas com a necessidade real de negócio. Consulte também [Roles e escopos](/produto/roles-and-permissions.md) para uma visão conceitual do modelo. --- # Origem: https://docs.tunnelhub.io/produto/environments # Ambientes Ambientes separam configurações e operação dentro da mesma empresa. O padrão mais comum é trabalhar com DEV, QAS e PRD. ## Para que servem Cada ambiente possui seu próprio conjunto de: * pacotes; * sistemas; * automações; * APIs; * Tabelas De/Para; * sequências; * monitoramento associado. Isso permite promover configurações e código de forma controlada. ## Casos de uso * desenvolver e validar sem afetar produção; * usar credenciais e endpoints diferentes por ambiente; * testar transportes e deploys antes da publicação final; * controlar exposição de APIs e execuções por etapa. ## No produto Ambientes são gerenciados na área `Environments` e aparecem como contexto de operação em diversas telas. Na CLI e no MCP, o ambiente também define o escopo das consultas e operações. ## Boas práticas * mantenha nomes padronizados e de fácil identificação; * não reutilize credenciais de produção em DEV; * trate PRD como ambiente controlado para deploy e execução; * documente os transportes e promoções entre ambientes. --- # Origem: https://docs.tunnelhub.io/produto/packages # Pacotes Pacotes são agrupadores lógicos dentro do TunnelHub. Eles ajudam a organizar integrações e recursos relacionados por domínio, projeto ou contexto de negócio. ## O que um pacote organiza Um pacote normalmente concentra: * automações relacionadas; * systems usados por essas automações; * Tabelas De/Para e sequências associadas; * APIs ou recursos operacionais do mesmo contexto. ## Quando criar um novo pacote Crie um pacote novo quando houver necessidade de separar: * uma iniciativa ou módulo de negócio; * um cliente ou vertical específica; * responsabilidade entre equipes; * ciclo de vida de deploy e governança. ## Campos principais * **Nome**: identificação amigável. * **Descrição**: contexto funcional do pacote. * **Ambiente**: escopo onde o pacote existe. ## Pela CLI Você também pode criar pacotes pela CLI: ```bash tunnelhub create-package --env DEV ``` ## Boas práticas * use nomes orientados a domínio, não a tecnologia; * evite pacotes grandes demais sem critério funcional; * alinhe pacote com responsabilidade e contexto de manutenção. --- # Origem: https://docs.tunnelhub.io/produto/data-stores # Tabelas De/Para Tabelas De/Para são recursos configuráveis do produto e reutilizáveis por automações, APIs e fluxos operacionais. Na prática, elas substituem o uso de regras fixas em código quando o time precisa manter mapeamentos, códigos externos, listas de referência ou traduções de valores por ambiente. O modelo mais comum é um mapeamento simples de valor de origem para valor de destino, usando itens com `fromValue` e `toValue`. ## Como pensar o recurso * use **Tabela De/Para** como conceito público principal; * trate o conteúdo como configuração de negócio versionada no produto, não como área improvisada para testes. ## Onde aparece no produto O recurso existe como área própria no portal e é associado a ambientes e pacotes. Normalmente, cada Tabela De/Para tem: * nome amigável; * `externalCode`, usado como identificador técnico; * descrição funcional; * pacote relacionado; * lista de itens. ## Estrutura dos itens O modelo mais comum usa duas colunas: * `fromValue` para o valor de origem; * `toValue` para o valor de destino. Esse formato cobre muitos cenários de integração, como: * status internos para status externos; * códigos de filial ou centro de custo; * categorias de produto; * IDs legados para IDs do sistema alvo. ## Operações disponíveis No fluxo atual do produto, você pode: * criar e editar Tabelas De/Para; * gerenciar itens individualmente; * remover itens em lote; * importar carga completa por CSV; * baixar o conteúdo para revisão externa. Esse modelo ajuda quando o negócio precisa atualizar um mapa sem esperar deploy de código. ## Uso em automações No runtime do SDK, o uso mais comum é consultar uma Tabela De/Para por código e aplicar a tradução durante o processamento. Exemplo conceitual: ```ts const dataStore = new DataStore(event); const conversionTable = new ConversionTable(dataStore); const mappedValue = await conversionTable.getValueFromConversionTable( 'sales-channel-map', order.channel, undefined, true, ); ``` O ponto importante é que a regra fica no produto, e não espalhada em `if/else` no projeto. ## Tabelas De/Para e usuários limitados Tabelas De/Para também participam do modelo de visibilidade granular do produto. Você pode liberar acesso seletivo para usuários limitados quando eles precisam: * revisar valores de referência; * operar um conjunto específico de mapeamentos; * acompanhar apenas uma parte da configuração compartilhada com parceiros. ## Boas práticas * escolha `externalCode` estável e orientado ao domínio; * mantenha descrição clara sobre dono funcional e finalidade; * prefira uma Tabela De/Para por contexto de negócio, em vez de agrupar regras sem relação; * revise itens obsoletos periodicamente; * use importação CSV com cuidado, porque carga completa normalmente substitui o conjunto existente. --- # Origem: https://docs.tunnelhub.io/produto/sql-tables # Tabelas de Apoio Tabelas de Apoio são tabelas relacionais gerenciadas pelo TunnelHub para guardar dados operacionais que precisam ser consultados ou alterados por automações. Use esse recurso quando o dado tem estrutura própria, chave primária, colunas tipadas e precisa ir além de um simples de/para. ## Quando usar Tabelas de Apoio fazem sentido para cenários como: * cache operacional compartilhado por execuções; * controle de processamento por entidade de negócio; * tabelas auxiliares com várias colunas; * dados importados por CSV e consumidos por automações; * estado de integração que precisa ser visível e administrado no produto. Se o caso for apenas traduzir um valor de origem para um valor de destino, prefira [Tabelas De/Para](/produto/data-stores.md). ## Modelo de dados Cada Tabela de Apoio possui: * `externalCode`, usado por automações e SDK; * descrição funcional; * pacote associado; * lista opcional de usuários limitados; * `schemaDefinition`, com colunas e tipos; * `primaryKey`, com uma ou mais colunas; * `indexesDefinition`, para índices adicionais. Tipos de coluna suportados: * `TEXT`; * `INTEGER`; * `REAL`; * `NUMERIC`; * `BOOLEAN`; * `DATETIME`. Além da chave primária definida no schema, o TunnelHub mantém um `rowId` técnico para operações sobre linhas. ## Operações disponíveis No produto, Tabelas de Apoio permitem: * criar e editar a definição da tabela; * listar linhas com paginação, filtros e ordenação; * inserir, editar e remover linhas; * importar dados por CSV; * exportar dados por CSV; * controlar visibilidade para usuários limitados. Alterações de schema são tratadas pela plataforma. Mudanças destrutivas ou troca de chave primária podem exigir recriação planejada da tabela. ## Uso em automações Para usar Tabelas de Apoio em uma automação, associe a tabela à automação no produto e habilite o runtime compatível no `tunnelhub.yml`. Exemplo: ```yaml configuration: runtimeEngine: LAMBDA entrypoint: index.handler runtime: nodejs24.x memorySize: 1024 timeout: 60 runInVpc: true sqlTables: enabled: true ``` Requisitos quando `sqlTables.enabled` é `true`: * `runtime` deve ser `nodejs24.x`; * `runInVpc` deve ser `true`; * `runtimeEngine` deve ser `LAMBDA` ou `ECS_FARGATE`. ## Uso no SDK O SDK expõe o helper `SqlTables` para operar linhas durante a execução. Exemplo conceitual: ```ts const sqlTables = new SqlTables(event); const inserted = await sqlTables.insertRow('customer-cache', { document: '12345678900', name: 'Cliente exemplo', active: true, }); const page = await sqlTables.queryRows('customer-cache', { current: 1, pageSize: 20, filter: { document: ['12345678900'], }, }); await sqlTables.updateRow('customer-cache', inserted.rowId, { name: 'Cliente atualizado', }); ``` O helper acessa o arquivo SQLite montado pela plataforma durante a execução. Ele não deve ser usado fora do runtime gerenciado do TunnelHub. ## Testes locais Para testes unitários com Jest, defina `SDK.testMode = true` antes de construir a integração. Nesse modo, o construtor de `SqlTables` não valida os requisitos do runtime gerenciado. As operações continuam precisando de mock explícito. `testMode` não fornece persistência local e não simula SQLite, EFS ou DynamoDB. O exemplo a seguir usa fixtures por `externalCode` e mantém as inserções apenas em memória durante o processo do Jest: ```ts import fs from 'node:fs'; import path from 'node:path'; import {ProcessorPayload, SDK, SqlTables} from '@tunnelhub/sdk'; type CustomerCacheRow = { document: string; name: string; active: boolean; }; type MockRow = { rowId: string; values: CustomerCacheRow; }; const rowsByTable = new Map(); let nextRowId = 1; const testEvent = { tenantId: 'test-tenant', environmentId: 'test-environment', automationId: 'test-automation', executionId: 'test-execution', systems: [], parameters: {}, } as ProcessorPayload; function getRows(externalCode: string): MockRow[] { const rows = rowsByTable.get(externalCode); if (rows) return rows; const fixturePath = path.join(__dirname, 'data', `${externalCode}.json`); const fixture = JSON.parse(fs.readFileSync(fixturePath, 'utf8')) as MockRow[]; const clonedRows = structuredClone(fixture); rowsByTable.set(externalCode, clonedRows); return clonedRows; } describe('CustomerCacheIntegration', () => { beforeAll(() => { SDK.testMode = true; }); beforeEach(() => { jest.spyOn(SqlTables.prototype, 'queryRows').mockImplementation(async (externalCode, request = {}) => { const current = request.current ?? 1; const pageSize = request.pageSize ?? 20; const rows = getRows(externalCode); return { success: true, current, pageSize, total: rows.length, data: rows.slice((current - 1) * pageSize, current * pageSize), }; }); jest.spyOn(SqlTables.prototype, 'insertRow').mockImplementation(async (externalCode, values) => { const row = {rowId: `test-row-${nextRowId++}`, values}; getRows(externalCode).push(row as MockRow); return row; }); }); afterEach(() => { jest.restoreAllMocks(); rowsByTable.clear(); nextRowId = 1; }); afterAll(() => { SDK.testMode = false; }); test('insere cliente ausente do cache', async () => { const sqlTables = new SqlTables(testEvent); await sqlTables.insertRow('customer-cache', {document: '12345678900', name: 'Ana', active: true}); expect(await sqlTables.queryRows('customer-cache')).toEqual({ success: true, current: 1, pageSize: 20, total: 1, data: [ { rowId: 'test-row-1', values: {document: '12345678900', name: 'Ana', active: true}, }, ], }); }); }); ``` Organize as fixtures em `__tests__/data/.json`. Cada arquivo deve conter uma lista de linhas no formato retornado por `queryRows`. Por exemplo, o arquivo `__tests__/data/customer-cache.json` usado no teste de inserção pode conter apenas: ```json [] ``` Uma fixture vazia representa uma tabela existente sem registros. O mock é apropriado para testar o fluxo da automação. Ele não reproduz schema, constraints, normalização de tipos nem o comportamento do SQLite. Teste esses cenários com `SqlTables` real, usando um arquivo SQLite preparado ou o runtime gerenciado do TunnelHub. ## Boas práticas * escolha `externalCode` estável e orientado ao domínio; * defina uma chave primária natural quando possível; * modele colunas com tipos claros; * use índices somente para consultas recorrentes; * evite armazenar segredos ou credenciais; * prefira Tabelas de Apoio para dados estruturados e Tabelas De/Para para mapeamentos simples. --- # Origem: https://docs.tunnelhub.io/produto/systems # Sistemas Systems representam conexões reutilizáveis com recursos externos consumidos por automações e APIs. ## Por que usar systems Em vez de colocar credenciais e endpoints no código, o TunnelHub centraliza esses dados em entidades configuráveis por ambiente. Isso permite: * trocar credenciais sem alterar o código da automação; * separar DEV, QAS e PRD com segurança; * reutilizar a mesma configuração em múltiplas automações; * transportar configurações entre ambientes com mais controle. ## Tipos suportados Os tipos expostos atualmente no produto incluem: * `DATABASE` * `FTP` * `LDAP` * `MAIL` * `HTTP` * `SFTP` * `SAPRFC` * `SMB` * `SOAP` Dependendo do tipo, a aba de parâmetros muda para refletir o formato de autenticação e conexão esperado. ## Como modelar um system Além dos campos básicos, cada system normalmente combina: * `internalName` estável para uso técnico; * parâmetros tipados conforme o tipo do system; * parâmetros customizados, quando o contexto pede valores extras; * status ativo ou inativo; * vínculo com o ambiente correto. Trocar o tipo de um system não é um ajuste cosmético: isso muda a estrutura esperada de parâmetros e, em muitos casos, a própria forma de autenticação. ## Campos principais * **Nome**: nome amigável. * **Nome interno**: identificador técnico único dentro do ambiente. * **Tipo**: tipo do system. * **Status**: ativo ou inativo. * **Descrição**: contexto funcional. Dependendo do caso, o produto também permite logo ou imagem e parâmetros customizados adicionais. ## Exemplos de parâmetros por tipo * **HTTP**: URL base, autenticação, headers ou query string. * **DATABASE**: tipo do banco, host, porta, usuário, senha e database ou schema. * **FTP/SFTP**: host, porta, usuário, credencial, timeout e política de reconexão. * **SOAP**: WSDL URL e autenticação, quando aplicável. * **SAP RFC**: host, usuário, mandante, número do sistema e trace. ## Uso em automações Systems precisam ser associados a uma automação para ficarem disponíveis em tempo de execução. No SDK, eles chegam pelo payload de execução e podem ser acessados pela lista `systems` ou pelos utilitários públicos. Em projetos mais maduros, o padrão é localizar o system pelo `internalName` e deixar o resto da configuração no produto. ## Boas práticas * use `internalName` previsível e estável; * cadastre credenciais por ambiente; * mantenha descrições claras sobre finalidade e dono da integração; * desative systems obsoletos em vez de manter configurações ambíguas; * evite reutilizar um mesmo system para contextos de negócio sem relação. --- # Origem: https://docs.tunnelhub.io/produto/automations # Automações Automações são o núcleo da plataforma de integração do TunnelHub. Elas definem como um fluxo é executado, monitorado e operado ao longo do tempo. ## O que uma automação concentra Na tela de detalhes, a automação normalmente é organizada em abas como: * dados básicos; * gatilhos; * deploys; * parâmetros; * notificações; * usuários limitados; * systems; * Tabelas De/Para; * histórico de ações. Dependendo da automação, o produto também expõe execução manual, transporte entre ambientes e histórico de versões. ## Dados básicos Na configuração básica, o time normalmente define: * nome e descrição; * pacote relacionado; * status; * URL de repositório, quando deseja rastreabilidade com o código; * retenção de logs operacionais. A retenção influencia diretamente a janela disponível para investigação no monitoramento. ## Gatilhos suportados Atualmente, a plataforma expõe três formas principais de disparo: * **Webhook**: execução sob demanda por URL. * **Scheduled**: execução automatizada por agenda. * **Inbound email**: execução a partir de recebimento de email. Em gatilhos do tipo **Scheduled**, é possível definir uma data e hora em **Não executar antes de**. Essa opção permite configurar a agenda com antecedência para um go-live sem disparar execuções antes do momento planejado. Disparos anteriores à data configurada são ignorados; a automação passa a executar normalmente quando a próxima ocorrência da agenda for igual ou posterior à data/hora inicial. Exemplo: uma agenda “de hora em hora” com **Não executar antes de** em `01/07/2026 06:00` começa a considerar execuções a partir de `06:00`, depois `07:00`, `08:00` e assim por diante. No caso de webhook, o produto pode exigir autenticação conforme a configuração definida. Os modos mais comuns são: * sem autenticação; * `BASIC`; * autenticação por query string; * autenticação por header. ## Deploys e versões Cada automação possui histórico de deploys. Esse histórico permite: * saber quem publicou uma versão; * acompanhar data e contexto do deploy; * promover configurações e artefatos entre ambientes por transporte, quando aplicável. Dependendo do caso, o runtime pode aparecer como `LAMBDA` ou `ECS_FARGATE`. ## Parâmetros e systems associados Parâmetros permitem externalizar configurações variáveis do código. Uma automação só recebe em runtime os systems que foram explicitamente associados a ela. Isso reduz acoplamento e melhora o controle operacional. ## Notificações Você pode configurar notificações automáticas para falhas de execução. Quando uma execução termina com status de erro, o TunnelHub envia um alerta para cada destinatário configurado na aba **Notificações** da automação. ### Como configurar 1. Abra a automação e acesse a aba **Notificações**. 2. Clique em **Adicionar**. 3. Selecione o tipo de notificação. 4. Informe o e-mail ou a URL de destino. 5. Escolha o idioma da mensagem, entre português e inglês. 6. Salve a configuração. Os canais disponíveis são: | Canal | Destinatário | Configuração | | ------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **E-mail** | Endereço de e-mail que receberá o alerta. | Informe o endereço do destinatário. | | **Discord** | URL de webhook criada para um canal do Discord. | Crie e copie a URL do webhook em **Integrações** do servidor. Consulte [Introdução a webhooks](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks). | | **Microsoft Teams** | URL de webhook gerada pelo Workflows (Power Automate) para um canal ou chat. | No Teams, abra **Workflows**, escolha um modelo de alerta por webhook para o canal ou chat, crie o fluxo e copie a URL gerada. Consulte [Criar webhooks de entrada com Workflows](https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498). | | **Google Chat** | URL de webhook criada para um espaço do Google Chat. | Adicione um webhook em **Apps e integrações** do espaço e copie a URL. Consulte [Criar um webhook](https://developers.google.com/workspace/chat/quickstart/webhooks). | | **Slack** | URL de Incoming Webhook associada ao canal de destino. | Crie um Incoming Webhook no aplicativo Slack e copie a URL. Consulte [Enviar mensagens usando Incoming Webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks). | | **Webhook** | URL de um endpoint HTTP próprio. | Prepare o endpoint para receber uma requisição `POST` com conteúdo JSON. | É possível adicionar mais de um destinatário, inclusive usando canais diferentes. URLs de webhook podem conter tokens ou outros dados que permitem publicar mensagens no canal. Trate-as como segredos e não as exponha em repositórios, tickets, logs ou mensagens públicas. ### Conteúdo do alerta A apresentação varia conforme o canal, mas as notificações normalmente incluem: * conta, ambiente, pacote e automação; * início e fim da execução; * totais processados e registros com erro; * mensagem geral de erro; * link para consultar a execução no monitoramento, quando suportado pelo canal. No webhook genérico, o TunnelHub envia esses dados em JSON e inclui o header `TunnelHub-Tenant-Id`. O endpoint deve aceitar requisições `POST` com `Content-Type: application/json`. Para usar a notificação como ponto de entrada para consultar logs e exportar traces da execução, leia [Do webhook de erro à exportação da execução](/produto/from-error-webhook-to-execution-export.md). ## Usuários limitados Automações podem liberar visibilidade seletiva para usuários limitados. Esse recurso é importante quando parceiros ou clientes precisam acompanhar apenas execuções específicas. ## Execução Depois do deploy, a automação pode ser executada: * manualmente pelo portal; * via webhook; * por agenda; * por inbound email, quando configurado. As execuções geram logs de processamento, traces e métricas para investigação. ## Boas práticas * modele `defineMetadata()` pensando no time que vai operar a execução; * associe apenas os systems realmente necessários; * prefira parâmetros, Tabelas De/Para e Sequências a regras rígidas no código; * revise notificações e retenção de logs antes de colocar a automação em produção. --- # Origem: https://docs.tunnelhub.io/produto/sequences # Sequências Sequências são contadores sequenciais controlados pela plataforma. Elas servem para gerar números ou identificadores de forma consistente entre execuções. ## Casos de uso comuns * números de documento; * identificadores de lote; * códigos incrementais de integração; * chaves que precisam ser atômicas e centralizadas. ## Vantagens * evita lógica de contagem local em cada automação; * reduz risco de colisão; * centraliza a geração no produto; * simplifica cenários com múltiplas execuções concorrentes. ## Uso no SDK O SDK possui um helper público para recuperar o próximo valor de uma sequência em runtime. ## Boas práticas * crie sequências com nomes orientados a negócio; * não reutilize a mesma sequência para domínios diferentes; * monitore consumo em fluxos de alto volume quando isso impactar regras externas. --- # Origem: https://docs.tunnelhub.io/produto/monitoring # Monitoramento Monitoramento é uma das partes mais importantes do TunnelHub. A plataforma foi desenhada para dar visibilidade sobre execuções, falhas e comportamento técnico sem exigir que cada integração implemente sua própria camada operacional do zero. ## Onde acessar As execuções de automações ficam em `Automations > Monitoring`. Nesta área você encontra filtros por período, automação, pacote, status e outros critérios operacionais. No fluxo atual, também é comum trabalhar com: * janela de tempo explícita; * filtro por pacote e ambiente; * opção para esconder execuções bem-sucedidas sem itens processados. ## O que existe em uma execução Cada execução possui informações como: * identificador da execução; * automação e ambiente relacionados; * horário de início e fim; * status consolidado; * quantidade processada e quantidade de erros. Dependendo do caso, a execução também pode exibir versão do SDK, estratégia de logging, runtime e identificadores técnicos adicionais. ## Logs de processamento Os logs de processamento mostram o resultado por item processado. Eles são baseados nos metadados definidos pelo SDK e normalmente incluem: * ação executada; * status; * mensagem; * colunas de negócio definidas por `defineMetadata()`. Esses logs são a melhor fonte para entender o que aconteceu com cada registro. ## Traces Os traces mostram informações mais técnicas da execução, incluindo logs emitidos pelo próprio flow e eventos auxiliares da plataforma. Eles são úteis para: * investigar falhas de integração; * medir passos internos do processamento; * validar comportamento de chamadas externas. ## Como investigar um problema Um fluxo prático costuma ser: 1. localizar a execução pelo período e status; 2. abrir o detalhe para entender o contexto geral; 3. usar logs de processamento para registros de negócio; 4. usar traces para erros técnicos ou intermitentes; 5. reprocessar a execução quando o cenário permitir. Quando a investigação começa em uma notificação de erro recebida por outro sistema, consulte [Do webhook de erro à exportação da execução](/produto/from-error-webhook-to-execution-export.md). ## Análise assistida Em alguns cenários, a plataforma também oferece análise assistida por IA para resumir falhas e ajudar no troubleshooting. Esse recurso não substitui logs e traces. Ele acelera a leitura inicial do incidente. ## Dicas para bons logs * defina metadados que ajudem o time de negócio a localizar registros; * evite mensagens genéricas demais; * use parâmetros, Tabelas De/Para e Sequências para enriquecer o contexto sem valores fixos no código; * complemente com traces técnicos apenas quando isso gerar valor investigativo. --- # Origem: https://docs.tunnelhub.io/produto/from-error-webhook-to-execution-export # Do webhook de erro à exportação da execução Este guia mostra como receber uma notificação de falha por webhook e consultar os dados da execução pela API do TunnelHub. Use esse fluxo quando seu sistema precisa abrir um incidente, armazenar evidências ou encaminhar logs e traces para outra ferramenta de observabilidade. ## Antes de começar Você precisa de: * uma notificação do tipo **Webhook** configurada na automação; * acesso de usuário ao tenant e ao ambiente da execução; * usuário e senha do TunnelHub; * o UUID do ambiente, enviado no header `EnvironmentId`. > O contrato atual usa ID token de usuário. Credenciais técnicas de CI/CD não autorizam os endpoints deste guia. A seção [Autentique as chamadas](#3-autentique-as-chamadas) mostra como obter e renovar esse token. Todos os exemplos usam HTTPS. A base da API é `https://api.tunnelhub.io/`. ## 1. Receba a notificação de erro O TunnelHub envia notificações por webhook somente quando a execução termina com falha. O endpoint receptor deve aceitar `POST` com `Content-Type: application/json` e responder rapidamente com um status `2xx`. Exemplo de payload: ```json { "account": { "name": "Conta exemplo", "id": "" }, "environment": { "name": "Produção", "id": "" }, "package": { "name": "Integrações", "id": "" }, "automation": { "name": "Pedidos", "id": "" }, "execution": { "startedAt": "2026-08-21T10:00:00.000Z", "finishedAt": "2026-08-21T10:05:00.000Z", "totalSuccess": 95, "totalErrors": 5, "message": "Falha ao enviar pedidos" }, "url": "https://portal.cliente.example/#/automations//execution/2026-08/?env=" } ``` O request também contém o header `TunnelHub-Tenant-Id` com o UUID do tenant. O header identifica o tenant, mas não é uma assinatura criptográfica. Não o use sozinho para autenticar a origem do evento. Trate a URL de destino do webhook como segredo e processe o evento em uma fila antes de executar chamadas demoradas. ## 2. Identifique a execução Use os campos abaixo para montar as chamadas à API: | Dado | Origem no webhook | | --------------- | ------------------------------------------------- | | `automationId` | `automation.id` | | `environmentId` | `environment.id` | | `period` | trecho da URL entre `/execution/` e o próximo `/` | | `executionId` | trecho da URL após `period` e antes de `?env=` | No exemplo acima, o `period` é `2026-08` e o `executionId` é ``. > No contrato atual, `period` e `executionId` não são campos próprios do JSON. Eles precisam ser obtidos da URL. Trate essa extração como dependência do formato atual do link e valide os valores antes de chamar a API. ## 3. Autentique as chamadas Envie o ID token do usuário no header `Authorization` e o ambiente da execução no header `EnvironmentId`. Use `USER_PASSWORD_AUTH` para obter o token diretamente do Amazon Cognito. ### 3.1. Obtenha os identificadores Use `environment.id` do webhook para `TUNNELHUB_ENVIRONMENT_ID`. No portal, abra **Conta > Informações da conta** e copie: * **Grupo de usuários** para `TUNNELHUB_USER_POOL_ID`. * **App Client ID** para `TUNNELHUB_CLIENT_ID`. O Grupo de usuários tem o formato `_`. Por exemplo, `us-east-1_AbCdEf` usa a região `us-east-1`. ```bash export TUNNELHUB_API_URL='https://api.tunnelhub.io' export TUNNELHUB_ENVIRONMENT_ID='' export TUNNELHUB_USER_POOL_ID='' export TUNNELHUB_CLIENT_ID='' export TUNNELHUB_REGION="${TUNNELHUB_USER_POOL_ID%%_*}" ``` O **Grupo de usuários** e o **App Client ID** precisam pertencer ao mesmo pool. ### 3.2. Obtenha o ID token Leia a senha sem exibi-la e exporte-a somente para a chamada de autenticação atual: ```bash read -r -s -p 'Senha do TunnelHub: ' TUNNELHUB_PASSWORD printf '\n' export TUNNELHUB_PASSWORD read -r -p 'Usuário ou e-mail do TunnelHub: ' TUNNELHUB_USERNAME export TUNNELHUB_USERNAME ``` Faça a chamada HTTPS ao endpoint do Cognito. `jq` monta o JSON a partir das variáveis de ambiente para que a senha não apareça nos argumentos do comando ou no histórico do shell. ```bash AUTH_RESPONSE="$( jq -n \ '{ AuthFlow: "USER_PASSWORD_AUTH", ClientId: env.TUNNELHUB_CLIENT_ID, AuthParameters: { USERNAME: env.TUNNELHUB_USERNAME, PASSWORD: env.TUNNELHUB_PASSWORD } }' | curl --fail-with-body \ -H 'Content-Type: application/x-amz-json-1.1' \ -H 'X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth' \ --data @- \ "https://cognito-idp.${TUNNELHUB_REGION}.amazonaws.com/" )" export TUNNELHUB_ID_TOKEN="$(jq -er '.AuthenticationResult.IdToken' <<< "${AUTH_RESPONSE}")" export TUNNELHUB_REFRESH_TOKEN="$(jq -er '.AuthenticationResult.RefreshToken' <<< "${AUTH_RESPONSE}")" export TUNNELHUB_TOKEN_EXPIRES_IN="$(jq -er '.AuthenticationResult.ExpiresIn' <<< "${AUTH_RESPONSE}")" unset AUTH_RESPONSE TUNNELHUB_PASSWORD ``` Se a resposta contiver `ChallengeName` em vez de `AuthenticationResult`, ela não contém tokens. Resolva o desafio manualmente no Cognito antes de tentar a autenticação novamente. Não use `USER_PASSWORD_AUTH` para usuários autenticados por SAML. ### 3.3. Renove o ID token Antes de o token expirar, use o refresh token para obter novos tokens. O refresh token permanece o mesmo no fluxo atual. ```bash REFRESH_RESPONSE="$( jq -n \ '{ AuthFlow: "REFRESH_TOKEN_AUTH", ClientId: env.TUNNELHUB_CLIENT_ID, AuthParameters: { REFRESH_TOKEN: env.TUNNELHUB_REFRESH_TOKEN } }' | curl --fail-with-body \ -H 'Content-Type: application/x-amz-json-1.1' \ -H 'X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth' \ --data @- \ "https://cognito-idp.${TUNNELHUB_REGION}.amazonaws.com/" )" export TUNNELHUB_ID_TOKEN="$(jq -er '.AuthenticationResult.IdToken' <<< "${REFRESH_RESPONSE}")" export TUNNELHUB_TOKEN_EXPIRES_IN="$(jq -er '.AuthenticationResult.ExpiresIn' <<< "${REFRESH_RESPONSE}")" unset REFRESH_RESPONSE ``` Proteja `TUNNELHUB_REFRESH_TOKEN` como uma credencial de longa duração. Não o registre, não o exponha em variáveis de CI abertas e não o inclua em tickets. ### 3.4. Use o token na API ```bash export AUTOMATION_ID='' export EXECUTION_ID='' export PERIOD='2026-08' ``` Não registre o ID token, URLs pré-assinadas de download ou o corpo completo de logs e traces em sistemas que não precisam desses dados. ## 4. Consulte o resumo da execução Comece pelo detalhe para confirmar automação, ambiente, período, status e totais antes de aprofundar a investigação. ```bash curl --fail-with-body \ -H "Authorization: Bearer ${TUNNELHUB_ID_TOKEN}" \ -H "EnvironmentId: ${TUNNELHUB_ENVIRONMENT_ID}" \ "${TUNNELHUB_API_URL}/integrations-service/automations/monitoring/${EXECUTION_ID}?automationId=${AUTOMATION_ID}&period=${PERIOD}" ``` Use logs de processamento para investigar registros de negócio e traces para investigar o comportamento técnico da execução. ## 5. Exporte todos os logs de processamento Para obter todos os logs, solicite a exportação em vez de paginar a consulta de logs. ```bash curl --fail-with-body \ -H "Authorization: Bearer ${TUNNELHUB_ID_TOKEN}" \ -H "EnvironmentId: ${TUNNELHUB_ENVIRONMENT_ID}" \ "${TUNNELHUB_API_URL}/integrations-service/automations/monitoring/${EXECUTION_ID}/executionLogs/download?automationId=${AUTOMATION_ID}&period=${PERIOD}" ``` Para execuções com menos de 5.000 logs, a resposta contém uma URL imediata: ```json { "status": "ok", "url": "" } ``` Para volumes maiores, a resposta cria um job assíncrono: ```json { "status": "pending", "processingId": "" } ``` Consulte o job conforme descrito em **Acompanhe uma exportação assíncrona**. ## 6. Exporte todos os traces O endpoint de leitura de traces é paginado e serve para investigação interativa. Não o use para tentar recuperar a execução completa quando houver muitas páginas. Para exportar todos os traces, inicie a exportação assíncrona sem filtros: ```bash curl --fail-with-body \ -X POST \ -H "Authorization: Bearer ${TUNNELHUB_ID_TOKEN}" \ -H "Content-Type: application/json" \ -H "EnvironmentId: ${TUNNELHUB_ENVIRONMENT_ID}" \ -d "{\"automationId\":\"${AUTOMATION_ID}\",\"executionId\":\"${EXECUTION_ID}\",\"period\":\"${PERIOD}\",\"format\":\"ndjson\"}" \ "${TUNNELHUB_API_URL}/integrations-service/automations/monitoring/${EXECUTION_ID}/traces/export" ``` Uma solicitação aceita retorna `202`: ```json { "exportId": "", "status": "accepted", "message": "Exportação iniciada" } ``` Guarde `exportId` e use-o como o ID do job na próxima etapa. Se já existir uma exportação de traces em andamento para a execução, a API retorna `409` com `EXPORT_ALREADY_IN_PROGRESS`. > Embora a requisição exija `format` com `csv` ou `ndjson`, o artefato atual é entregue como `traces-.gz`, com o export textual do CloudWatch Logs. Não presuma um CSV ou NDJSON convertido pelo worker atual. ## 7. Acompanhe uma exportação assíncrona Use `processingId` para logs ou `exportId` para traces no endpoint de background processing: ```bash curl --fail-with-body \ -H "Authorization: Bearer ${TUNNELHUB_ID_TOKEN}" \ -H "EnvironmentId: ${TUNNELHUB_ENVIRONMENT_ID}" \ "${TUNNELHUB_API_URL}/platform-service/backgroundProcessings/" ``` Repita a consulta com intervalo progressivo enquanto o status for `PENDING` ou `PROCESSING`. | Status | Ação | | ------------ | ---------------------------------------------------- | | `PENDING` | Aguarde o processamento iniciar. | | `PROCESSING` | Continue aguardando. | | `FINISHED` | Baixe a URL pré-assinada presente em `message`. | | `FAIL` | Registre a mensagem de erro e investigue a execução. | As URLs de download expiram em 24 horas. Baixe e armazene o arquivo em um repositório seguro antes da expiração, quando a política de retenção do cliente permitir. ## Erros comuns * `401`: o ID token expirou ou não foi enviado. * `403`: o usuário não tem acesso ao recurso ou ambiente informado. * `404`: confirme `automationId`, `executionId`, `period` e `EnvironmentId`. * `409 EXPORT_ALREADY_IN_PROGRESS`: reutilize o job de exportação em andamento em vez de iniciar outro. * `FAIL` no background processing: a exportação não foi concluída; use o resumo, logs e traces disponíveis para investigar. * URL de download expirada: solicite uma nova exportação. ## Boas práticas * responda ao webhook antes de iniciar consultas ou exports; * deduplique eventos pelo conjunto de automação, ambiente, período e execução; * valide que os IDs extraídos da URL correspondem aos campos `automation.id` e `environment.id` do payload; * use o endpoint assíncrono para traces completos, principalmente em execuções com milhares de páginas; * sanitize logs e traces antes de enviá-los para tickets, chats ou sistemas externos. Veja também [Notificações](/produto/automations.md#notificações) e [Monitoramento](/produto/monitoring.md). --- # Origem: https://docs.tunnelhub.io/produto/roles-and-permissions # Roles e escopos O modelo de acesso do TunnelHub combina role, escopo por ambiente e visibilidade granular de recursos. Por isso, a pergunta correta não é apenas "qual perfil esse usuário tem?", mas também "em quais ambientes ele opera?" e "quais recursos estão liberados para ele?". ## Camadas do modelo Em alto nível, o controle de acesso mistura três camadas: * **role** para definir a capacidade geral do usuário; * **ambientes** para limitar onde ele pode operar; * **escopos específicos** para casos de usuários limitados. ## Roles da plataforma As roles da plataforma são fixas. Hoje, existem apenas três opções: * `Administrador`: administração ampla do tenant e acesso às áreas operacionais; * `Usuário Comum`: operação do produto sem o mesmo alcance administrativo; * `Usuário Limitado`: acesso restrito a recursos explicitamente liberados. ## Escopo por ambiente O usuário pode ter acesso a um subconjunto dos ambientes do tenant. Isso é importante para separar DEV, QAS e PRD sem depender apenas de convenção. Na prática, o mesmo usuário pode: * operar livremente em DEV; * ter acesso parcial em QAS; * não enxergar PRD. ## Usuário limitado Usuários limitados são úteis para cenários B2B, parceiros, clientes e times externos. Hoje, esse modelo pode restringir visibilidade de forma granular para recursos como: * automações; * Tabelas De/Para; * telas de monitoramento derivadas desses recursos. Esse desenho permite compartilhar operação sem expor o tenant inteiro. ## Mudanças de acesso Ambientes liberados e escopos granulares podem ser ajustados ao longo do tempo. A role, porém, não é mutável na plataforma. Se for necessário trocar a role de um usuário, ele precisa ser excluído e criado novamente com a role correta. Ao revisar permissões, vale checar pelo menos quatro pontos: * role do usuário; * ambientes liberados; * automações liberadas, quando for usuário limitado; * Tabelas De/Para liberadas, quando for usuário limitado. ## Campos que influenciam a operação Além da role, o cadastro de usuário costuma incluir dados que afetam experiência e governança, como: * e-mail; * idioma padrão; * timezone; * país; * tenant e ambientes associados. ## Boas práticas * escolha a role correta já na criação do usuário; * use `Usuário Limitado` para acessos externos ou parciais; * evite compartilhar contas entre pessoas; * revise acessos administrativos de forma periódica; * separe ambientes críticos por permissão, não apenas por combinado informal; * documente internamente quem é responsável por cada liberação granular. Para o fluxo prático de gestão de usuários, consulte também [Usuários e permissões](/produto/users.md). --- # Origem: https://docs.tunnelhub.io/api-management/overview # Visão geral O módulo de API Management do TunnelHub permite publicar, proteger e monitorar APIs a partir de uma interface unificada. ## O que o módulo cobre * cadastro e manutenção de definições de API; * importação e exportação de especificações; * publicação de Swagger público quando aplicável; * uso de chaves de API e planos de uso; * autenticação baseada em OAuth/Cognito; * monitoramento de chamadas e logs de requisição e resposta. ## Recursos principais * **APIs**: definições gerenciadas no produto. * **Planos de uso**: políticas de consumo. * **Chaves de API**: credenciais de uso associadas a planos. * **Servidores de recursos**: escopos OAuth para proteger recursos. * **Clientes**: aplicações consumidoras autenticadas. * **Monitoramento**: histórico e detalhe de chamadas executadas. ## Quando usar Use API Management quando você precisa: * expor endpoints com governança centralizada; * controlar consumo por cliente; * aplicar autenticação e autorização por escopos; * investigar chamadas com rastreabilidade operacional. ## Fluxo típico Em um cenário comum, o trabalho acontece nesta sequência: 1. importar ou cadastrar a definição da API; 2. revisar rotas, documentação e comportamento esperado; 3. decidir se a API será pública, protegida por chave de API ou protegida por OAuth; 4. criar planos de uso, chaves de API, servidores de recursos e clientes quando necessário; 5. publicar e validar a documentação Swagger; 6. acompanhar chamadas e investigar falhas pelo monitoramento. Consulte [Definições e monitoramento](/api-management/definitions-and-monitoring.md) para o fluxo operacional mais detalhado do módulo. ## Como pensar a modelagem Ao desenhar uma API no TunnelHub, vale separar quatro decisões: * **exposição**: quais recursos realmente precisam ficar acessíveis externamente; * **consumo**: quem vai chamar a API e em que volume; * **segurança**: se o cenário pede apenas controle de uso ou autenticação forte por escopo; * **operação**: como o time vai monitorar chamadas, erros e comportamento do consumidor. ## Boas práticas * trate a definição da API como parte do contrato do produto, e não apenas como detalhe técnico; * use chaves de API para identificação e governança de consumo, não como única camada de segurança; * prefira OAuth com escopos quando houver dados sensíveis ou múltiplos consumidores com perfis diferentes; * mantenha nomes de planos, chaves e clientes alinhados ao contexto de negócio; * acompanhe o monitoramento de forma contínua, principalmente após publicação e mudanças de contrato. --- # Origem: https://docs.tunnelhub.io/api-management/definitions-and-monitoring # Definições e monitoramento O módulo de API Management combina duas frentes que andam juntas no dia a dia: * definição e publicação da API; * monitoramento das chamadas em produção. ## O que compõe uma definição de API Na modelagem atual, uma definição de API normalmente reúne: * nome e descrição; * pacote relacionado; * tipo de API, como `REST`, `HTTP` ou `WEBSOCKET`; * URL de repositório, quando o time quer manter rastreabilidade com o código; * configuração de documentação e exportação. ## Fluxo típico de definição Um fluxo comum no produto segue esta ordem: 1. criar ou importar a definição; 2. revisar recursos, métodos e documentação; 3. decidir o modelo de proteção da API; 4. associar planos de uso, chaves de API, servidores de recursos ou clientes; 5. publicar e validar a documentação Swagger; 6. acompanhar chamadas pelo monitoramento. ## Importação e exportação Além do cadastro manual, o módulo suporta importação e exportação de especificações. No estado atual do produto, a exportação pode envolver formatos como: * `OpenAPI 3`; * `Swagger 2`; * `JSON` ou `YAML`. ## Publicação de Swagger Quando a API possui documentação pública habilitada, o produto também pode expor uma página Swagger para facilitar validação por consumidores e times internos. Esse recurso é útil para: * validar contrato após importação; * compartilhar documentação técnica com parceiros; * alinhar rapidamente payloads, headers e respostas esperadas. ## O que monitorar depois da publicação Depois que a API entra em uso, o módulo de monitoramento ajuda a responder perguntas como: * quais endpoints receberam chamadas em um período; * quais consumidores geraram erro; * quais métodos e recursos concentram mais falhas; * qual foi o payload recebido ou devolvido em um caso específico. ## Filtros operacionais No fluxo atual, o monitoramento de APIs tende a oferecer filtros por: * intervalo de tempo; * pacote; * API; * método HTTP; * recurso; * status; * chave de API; * cliente OAuth. ## Detalhe de chamada Ao abrir uma chamada específica, o time costuma conseguir inspecionar: * request original; * headers; * contexto da requisição; * response; * payloads decodificados quando o backend consegue descompactar o conteúdo. ## Boas práticas * trate a definição como contrato do produto, não apenas como artefato técnico; * publique documentação suficiente para reduzir dúvidas do consumidor; * mantenha filtros e nomes orientados ao contexto de negócio; * use monitoramento continuamente após mudanças de contrato ou autenticação. --- # Origem: https://docs.tunnelhub.io/api-management/usage-plans # Planos de uso Planos de uso controlam como consumidores utilizam suas APIs no TunnelHub. ## Para que servem Eles permitem associar regras de consumo a: * chaves de API; * clientes ou parceiros específicos; * conjuntos de APIs ou estágios publicados. No produto atual, o vínculo com a API costuma ser feito por estágio publicado, o que ajuda a separar consumo por versão ou contexto operacional. ## Casos de uso comuns * separar consumidores internos e externos; * aplicar políticas por parceiro; * organizar acesso por produto ou contrato; * controlar a evolução do consumo ao longo do tempo. ## Relação com chaves de API Chaves de API normalmente são associadas a planos de uso. O plano define o contexto de consumo; a chave identifica o consumidor naquele contexto. Na prática: * o plano de uso representa a política; * a chave de API representa o consumidor; * a combinação dos dois permite governar acesso e operação. ## Quando criar planos diferentes Considere separar planos de uso quando houver diferença de: * tipo de consumidor; * criticidade do serviço; * expectativa de volume; * contrato comercial ou SLA; * escopo de APIs liberadas. ## O que revisar antes de publicar Antes de ativar um plano de uso, confirme: * quais APIs ou estágios ele cobre; * quais consumidores estarão vinculados a ele; * se o plano faz sentido para o contexto de negócio; * se a API também precisa de autenticação adicional por OAuth. Quando o cenário exigir, revise também limites de throughput, quota e combinação com segurança por escopos. ## Boas práticas * crie nomes orientados a negócio; * mantenha uma descrição clara de quem deve usar cada plano; * evite compartilhar a mesma key entre consumidores diferentes; * combine planos de uso com autenticação forte quando a API exigir maior segurança; * revise periodicamente planos antigos ou pouco utilizados. --- # Origem: https://docs.tunnelhub.io/api-management/api-keys # Chaves de API Chaves de API identificam consumidores de APIs e costumam ser usadas em conjunto com planos de uso. ## Quando usar Elas são úteis para: * controlar o consumo de um cliente específico; * diferenciar integrações que usam o mesmo endpoint; * aplicar políticas de uso via plano de uso. ## O que uma chave de API resolve Uma chave de API ajuda principalmente em governança e operação. Ela permite: * saber quem está consumindo a API; * segmentar consumidores por plano; * investigar consumo e comportamento por cliente; * facilitar rotação e substituição de credenciais de uso. ## Importante Uma chave de API não deve ser tratada como mecanismo único de segurança para dados sensíveis. Para proteção forte, prefira combinar com autenticação baseada em OAuth e escopos. ## No produto No módulo de APIs, você pode: * listar chaves de API; * criar e desativar chaves; * associar chaves a planos de uso; * inspecionar o contexto operacional quando necessário. Em ambientes mais sensíveis, trate a visualização e o compartilhamento dessas chaves como processo controlado, porque o backend pode expor o valor efetivo da credencial dependendo do fluxo usado. ## Quando rotacionar Considere rotacionar uma chave quando: * houver suspeita de exposição; * o consumidor mudar de aplicação ou ambiente; * a chave deixar de representar corretamente o responsável atual; * uma política interna exigir renovação periódica. ## Boas práticas * rotacione chaves quando houver suspeita de exposição; * use uma chave por consumidor ou aplicação; * nunca incorpore chaves em código frontend público; * documente responsabilidade e finalidade de cada chave; * remova ou desative chaves obsoletas para reduzir risco operacional. --- # Origem: https://docs.tunnelhub.io/api-management/authentication # Autenticação O TunnelHub suporta diferentes estratégias de autenticação para APIs, incluindo chaves de API e fluxos baseados em OAuth com Cognito. ## Visão geral As duas camadas mais comuns são: * **Chave de API + plano de uso** para identificação e controle de consumo; * **OAuth com escopos** para autenticação e autorização mais robustas. Essas camadas podem coexistir, mas cumprem papéis diferentes. A chave de API ajuda a identificar e governar consumo; OAuth ajuda a autenticar e autorizar acesso a recursos protegidos. ## Quando usar cada uma Use apenas chave de API quando o cenário pede principalmente governança de consumo e o risco é menor. Use OAuth quando: * a API expõe dados sensíveis; * existe necessidade de escopos finos; * há múltiplos clientes com acessos diferentes; * governança e auditoria são importantes. Em cenários corporativos, o mais comum é combinar controle de consumo com autenticação forte. ## Servidores de recursos Servidores de recursos agrupam os escopos OAuth que protegem seus endpoints. Cada servidor de recursos normalmente define: * nome amigável; * identificador único; * lista de escopos com descrição. Esses escopos podem ser associados a endpoints protegidos. ## Clientes Clientes representam aplicações consumidoras autenticadas. Eles são usados para cenários machine-to-machine e outros fluxos controlados pela plataforma. Ao criar um cliente, você normalmente define: * identificação do cliente; * expiração de tokens; * escopos autorizados. Dependendo do caso, o fluxo também envolve rotação de segredo do cliente, ativação ou inativação e outros controles operacionais. ## Fluxo prático mínimo Um fluxo típico para uma API protegida costuma ser: 1. definir a API e seus endpoints; 2. decidir quais rotas exigem OAuth; 3. criar ou revisar o servidor de recursos; 4. criar o cliente consumidor; 5. autorizar os escopos corretos; 6. validar a obtenção de token e a chamada autenticada. ## Geração de token Dependendo do fluxo configurado, a aplicação consumidora troca suas credenciais por um access token e usa esse token para chamar endpoints protegidos. Na prática, a documentação da API e a configuração do cliente devem deixar claro: * endpoint de token; * grant esperado; * escopos permitidos; * formato de envio das credenciais. ## Boas práticas * modele escopos com granularidade suficiente para refletir o negócio; * evite compartilhar o mesmo cliente entre consumidores distintos; * documente claramente quais rotas exigem escopos e quais usam apenas governança por chave; * revise expiração de tokens conforme criticidade e perfil de integração; * rotacione segredos de clientes sempre que houver suspeita de exposição. --- # Origem: https://docs.tunnelhub.io/api-management/importacao-de-apis # Importação de APIs O TunnelHub permite importar definições de API para acelerar publicação, padronização e governança. ## Objetivo da importação Importar uma API ajuda a: * iniciar rapidamente a configuração de uma definição; * reaproveitar especificações existentes; * reduzir erros manuais na modelagem; * alinhar documentação e configuração operacional. ## O que normalmente faz parte do fluxo * importar a especificação base; * revisar rotas e configurações; * associar autenticação quando necessário; * vincular planos de uso, chaves de API, servidores de recursos e clientes; * publicar e validar por Swagger ou chamadas reais. Dependendo do caso, a importação é só o começo. Ainda pode ser necessário revisar tipos de API, documentação pública, estágios, monitoramento e exportação do contrato final. ## Depois da importação Depois de importar, revise com atenção: * segurança dos endpoints; * políticas de consumo; * publicação de documentação Swagger; * monitoramento e observabilidade da API. Também vale validar se o arquivo importado deve ser exportado novamente em outro formato, como OpenAPI 3, Swagger 2, JSON ou YAML, para distribuição ao time consumidor. ## Recomendação Considere a importação como ponto de partida. A definição final deve refletir a forma como a API será operada no TunnelHub, e não apenas o arquivo original. --- # Origem: https://docs.tunnelhub.io/cli/cli # CLI O `@tunnelhub/cli` é a ferramenta de linha de comando para fluxos de desenvolvimento e publicação de automações. ## Quando usar Use a CLI para: * autenticar na plataforma; * listar ambientes, pacotes e automações; * criar pacotes; * criar automações com bootstrap de template; * publicar deploys. ## Escopo atual da CLI Os comandos públicos instalados hoje são: * `login` * `logout` * `login-check` * `list-environments` * `list-packages` * `create-package` * `list-automations` * `create-automation` * `deploy-automation` ## Instalação ```bash npm install -g @tunnelhub/cli ``` Pacote no npm: `https://www.npmjs.com/package/@tunnelhub/cli` Depois da instalação, os dois comandos abaixo funcionam: ```bash tunnelhub --help th --help ``` ## Fluxo de autenticação O fluxo principal usa navegador e salva as credenciais localmente para reutilização e refresh automático. ```bash tunnelhub login ``` Também existe fallback por usuário e senha: ```bash tunnelhub login --password ``` ## Como a CLI trabalha com ambientes Comandos como `list-packages`, `create-package`, `list-automations` e `create-automation` dependem de `--env`. Você pode informar nome ou UUID do ambiente. No fluxo interativo com login, `deploy-automation` também usa `--env`. No fluxo CI/CD com credenciais M2M, use `--environment-id` ou `--env` com o UUID do ambiente. Os comandos de listagem também aceitam `--json` quando você precisa integrar a saída em script. ## O que acontece ao criar uma automação Ao executar `create-automation`, a CLI: * consulta seus pacotes no ambiente escolhido; * pede os dados da automação; * cria a automação na plataforma; * baixa um template oficial do GitHub; * extrai esse template em uma nova pasta local; * preenche o `service.uuid` no `tunnelhub.yml`. ## O que acontece no deploy Ao executar `deploy-automation`, a CLI valida o `tunnelhub.yml`, verifica `package.artifact`, faz upload do artefato para S3 e solicita a criação do deploy. O parâmetro `--message` é obrigatório. Ele deve carregar o contexto humano do deploy, especialmente em pipelines. No fluxo CI/CD: * a credencial é da account e pode ser autorizada para um ou mais ambientes; * `createdBy` da revisão fica como `api-client:`; * a mensagem do deploy deve trazer o contexto do commit, autor e execução quando isso for relevante. Exemplo de variáveis de ambiente para CI/CD: * `TH_API_HOST` * `TH_CLIENT_ID` * `TH_CLIENT_SECRET` * `TH_ENVIRONMENT_ID` * `TH_AUTOMATION_ID` Exemplo com GitHub Actions: ```bash COMMIT_EMAIL="$(git log -1 --pretty=format:'%ae')" COMMIT_SHA="$(git rev-parse --short HEAD)" th deploy-automation \ --environment-id "$TH_ENVIRONMENT_ID" \ --automation "$TH_AUTOMATION_ID" \ --message "GitHub Actions deploy ${COMMIT_SHA} by ${COMMIT_EMAIL}" ``` Consulte [Deploy via CI/CD](/cli/ci-cd-deployments.md), [Autenticação e ambientes](/cli/authentication-and-environments.md), [Comandos e referência](/cli/commands.md) e [`tunnelhub.yml`](/cli/tunnelhub-yml.md) para o contrato completo. --- # Origem: https://docs.tunnelhub.io/cli/ci-cd-deployments # Deploy via CI/CD Esta página descreve o fluxo recomendado para publicar automações com a CLI em pipelines como GitHub Actions, GitLab CI e Jenkins, sem usar `tunnelhub login`. O modelo recomendado usa credenciais CI/CD account-level com allowlist de ambientes. A credencial pertence à conta, mas só pode fazer deploy nos UUIDs de ambiente autorizados durante a criação. ## Pré-requisitos Antes de configurar o pipeline, você precisa: * ter uma automação já criada no TunnelHub; * ter o `tunnelhub.yml` configurado com a automação que será publicada; * saber o UUID de cada ambiente TunnelHub que o pipeline poderá publicar; * ter permissão para acessar `Administration > Settings`; * se for usar GitHub Actions, ter permissão para criar GitHub Environments, secrets e variables no repositório. ## 1. Gere a credencial no portal No portal do TunnelHub: 1. acesse `Administration > Settings`; 2. abra a aba `CI/CD`; 3. clique em `Criar credencial CI/CD`; 4. informe um nome para a credencial; 5. selecione os ambientes autorizados para a credencial; 6. conclua a criação; 7. copie o `Client ID` e o `Client secret` exibidos. Observações importantes: * a credencial é da account, mas só pode fazer deploy nos ambientes autorizados na criação; * você pode liberar ambientes específicos ou usar a opção de todos os ambientes; * o `Client secret` é exibido apenas uma vez; * se o secret for perdido ou exposto, use `Regenerar secret` ou `Revogar`; * para produção, prefira credenciais separadas por ambiente para reduzir blast radius. ## 2. Salve secrets e variables do pipeline No GitHub Actions, a separação recomendada é: * `TH_CLIENT_ID`: GitHub Environment Secret; * `TH_CLIENT_SECRET`: GitHub Environment Secret; * `TH_ENVIRONMENT_ID`: GitHub Environment Variable; * `TH_API_HOST`: repositório variable, GitHub Environment Variable ou valor fixo no workflow. Exemplo de valores: * `TH_API_HOST`: `https://api.tunnelhub.io` * `TH_ENVIRONMENT_ID`: UUID de um ambiente TunnelHub autorizado para essa credencial A automação publicada é inferida automaticamente a partir do `tunnelhub.yml` do projeto. Se você usar outra plataforma de CI/CD, mantenha a mesma ideia: * `TH_CLIENT_ID` e `TH_CLIENT_SECRET` como secrets; * `TH_ENVIRONMENT_ID` como variável por ambiente; * `TH_API_HOST` como variável ou valor fixo do pipeline. ## 3. Entenda GitHub Environment vs TunnelHub Environment Esses dois conceitos são diferentes: * GitHub Environment: controla approvals, protection rules, secrets e variables dentro do GitHub; * TunnelHub Environment: é o UUID passado para `--environment-id` no deploy. O vínculo entre os dois acontece pela variável `TH_ENVIRONMENT_ID`. Exemplo: * GitHub Environment `production` pode ter `TH_ENVIRONMENT_ID=`; * GitHub Environment `development` pode ter `TH_ENVIRONMENT_ID=`. ## 4. Execute o deploy com a CLI O deploy CI/CD usa a mesma CLI pública, mas autenticada com variáveis de ambiente M2M. O parâmetro `--message` é obrigatório e deve carregar o contexto humano do deploy. Os exemplos abaixo usam a mensagem completa do último commit e o e-mail do autor para preencher `--message`. Antes de executar `deploy-automation`, o workflow precisa gerar o artefato ZIP configurado em `package.artifact` no `tunnelhub.yml`. Os exemplos abaixo usam `corepack` e detectam `pnpm`, `yarn` ou `npm` pelo lockfile do projeto. Ajuste os comandos se o seu repositório usar outro fluxo de build. ### Exemplo 1: `main` publica em `production` Use este exemplo quando apenas a branch `main` deve publicar, mapeada para o GitHub Environment `production`. ```yaml name: Deploy TunnelHub Automation on: push: branches: - main workflow_dispatch: jobs: deploy-production: if: github.ref_name == 'main' runs-on: ubuntu-latest environment: production steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 - name: Enable Corepack run: corepack enable - name: Install dependencies run: | if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile elif [ -f yarn.lock ]; then yarn install --immutable else npm ci fi - name: Build deployment artifact run: | if [ -f pnpm-lock.yaml ]; then pnpm build elif [ -f yarn.lock ]; then yarn build else npm run build fi - name: Install TunnelHub CLI run: npm install --global @tunnelhub/cli - name: Deploy automation env: TH_API_HOST: https://api.tunnelhub.io TH_CLIENT_ID: ${{ secrets.TH_CLIENT_ID }} TH_CLIENT_SECRET: ${{ secrets.TH_CLIENT_SECRET }} TH_ENVIRONMENT_ID: ${{ vars.TH_ENVIRONMENT_ID }} run: | COMMIT_EMAIL="$(git log -1 --pretty=format:'%ae')" COMMIT_MESSAGE="$(git log -1 --pretty=format:'%B')" COMMIT_SHA="$(git rev-parse --short HEAD)" DEPLOY_MESSAGE="${COMMIT_MESSAGE} Deploy ${COMMIT_SHA} by ${COMMIT_EMAIL}" tunnelhub deploy-automation \ --environment-id "$TH_ENVIRONMENT_ID" \ --message "$DEPLOY_MESSAGE" ``` ### Exemplo 2: `develop` publica em `development` e `main` publica em `production` Use este exemplo quando você quer separar ambientes por branch. ```yaml name: Deploy TunnelHub Automation on: push: branches: - develop - main workflow_dispatch: jobs: deploy-development: if: github.ref_name == 'develop' runs-on: ubuntu-latest environment: development steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 - name: Enable Corepack run: corepack enable - name: Install dependencies run: | if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile elif [ -f yarn.lock ]; then yarn install --immutable else npm ci fi - name: Build deployment artifact run: | if [ -f pnpm-lock.yaml ]; then pnpm build elif [ -f yarn.lock ]; then yarn build else npm run build fi - name: Install TunnelHub CLI run: npm install --global @tunnelhub/cli - name: Deploy automation env: TH_API_HOST: https://api.tunnelhub.io TH_CLIENT_ID: ${{ secrets.TH_CLIENT_ID }} TH_CLIENT_SECRET: ${{ secrets.TH_CLIENT_SECRET }} TH_ENVIRONMENT_ID: ${{ vars.TH_ENVIRONMENT_ID }} run: | COMMIT_EMAIL="$(git log -1 --pretty=format:'%ae')" COMMIT_MESSAGE="$(git log -1 --pretty=format:'%B')" COMMIT_SHA="$(git rev-parse --short HEAD)" DEPLOY_MESSAGE="${COMMIT_MESSAGE} Deploy ${COMMIT_SHA} by ${COMMIT_EMAIL}" tunnelhub deploy-automation \ --environment-id "$TH_ENVIRONMENT_ID" \ --message "$DEPLOY_MESSAGE" deploy-production: if: github.ref_name == 'main' runs-on: ubuntu-latest environment: production steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 - name: Enable Corepack run: corepack enable - name: Install dependencies run: | if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile elif [ -f yarn.lock ]; then yarn install --immutable else npm ci fi - name: Build deployment artifact run: | if [ -f pnpm-lock.yaml ]; then pnpm build elif [ -f yarn.lock ]; then yarn build else npm run build fi - name: Install TunnelHub CLI run: npm install --global @tunnelhub/cli - name: Deploy automation env: TH_API_HOST: https://api.tunnelhub.io TH_CLIENT_ID: ${{ secrets.TH_CLIENT_ID }} TH_CLIENT_SECRET: ${{ secrets.TH_CLIENT_SECRET }} TH_ENVIRONMENT_ID: ${{ vars.TH_ENVIRONMENT_ID }} run: | COMMIT_EMAIL="$(git log -1 --pretty=format:'%ae')" COMMIT_MESSAGE="$(git log -1 --pretty=format:'%B')" COMMIT_SHA="$(git rev-parse --short HEAD)" DEPLOY_MESSAGE="${COMMIT_MESSAGE} Deploy ${COMMIT_SHA} by ${COMMIT_EMAIL}" tunnelhub deploy-automation \ --environment-id "$TH_ENVIRONMENT_ID" \ --message "$DEPLOY_MESSAGE" ``` O deploy deve informar `--environment-id` ou `--env` com UUID. O backend valida se esse ambiente está na allowlist da credencial. ## 5. Entenda o que fica salvo na revisão No deploy via CI/CD, a revisão criada guarda dois tipos de informação: * `createdBy`: identifica a credencial técnica que autorizou o deploy; * `message`: registra o contexto humano e operacional do deploy. Na prática: * `createdBy` fica como `api-client:`; * `message` deve conter dados como a mensagem do commit, SHA, e-mail do autor, identificador da execução ou o nome do workflow quando isso fizer sentido. Esse desenho preserva auditoria técnica sem perder rastreabilidade humana. ## 6. Rotação e revogação Na mesma aba `Administration > Settings > CI/CD`, você pode: * usar `Regenerar secret` para emitir um novo secret para a credencial existente; * usar `Revogar` para bloquear novos deploys com essa credencial. Após regenerar o secret, atualize imediatamente os secrets do pipeline. Se você usa GitHub Environments separados, atualize cada environment que depende dessa credencial. Se migrar para credenciais separadas por ambiente, revogue as credenciais antigas assim que o novo fluxo estiver validado. ## Veja também * [Visão geral da CLI](/cli/cli.md) * [Comandos e referência](/cli/commands.md) * [Autenticação e ambientes](/cli/authentication-and-environments.md) * [`tunnelhub.yml`](/cli/tunnelhub-yml.md) --- # Origem: https://docs.tunnelhub.io/cli/authentication-and-environments # Autenticação e ambientes Quase todo fluxo da CLI depende de duas coisas: uma sessão válida e a resolução correta do ambiente. ## Fluxo principal de autenticação O caminho recomendado usa navegador: ```bash tunnelhub login ``` Nesse fluxo, a CLI: * solicita o `Tenant ID`; * abre a autenticação no frontend do TunnelHub; * recebe tokens ao final do login; * salva a sessão localmente para reutilização; * usa refresh automático quando necessário. ## Fallback por usuário e senha Em cenários específicos, a CLI ainda aceita fallback por usuário e senha: ```bash tunnelhub login --password ``` Esse modo é útil quando o fluxo por navegador não é o mais prático, mas o padrão recomendado continua sendo autenticação pelo browser. ## Como validar a sessão ```bash tunnelhub login-check ``` Use esse comando quando você quiser confirmar rapidamente se a sessão ainda é válida antes de listar recursos ou iniciar um deploy. ## Como encerrar a sessão ```bash tunnelhub logout ``` Esse comando remove as credenciais locais salvas pela CLI. ## Como a CLI resolve ambientes Comandos como `list-packages`, `create-package`, `list-automations`, `create-automation` e `deploy-automation` usam `--env`. Você pode informar: * o nome do ambiente; * ou o UUID do ambiente. A CLI resolve esse valor para o identificador correto antes de chamar a API. ## Descobrindo ambientes válidos ```bash tunnelhub list-environments ``` Se você quiser usar saída de máquina: ```bash tunnelhub list-environments --json ``` ## Recomendações práticas * prefira nome de ambiente apenas quando a nomenclatura do tenant for estável; * use UUID em scripts quando quiser reduzir ambiguidade; * valide a sessão antes de deploys importantes; * confirme o tenant correto quando estiver em máquina compartilhada. ## Erros comuns * **Sessão inválida**: execute `tunnelhub login` novamente. * **Ambiente não encontrado**: valide o nome ou UUID com `tunnelhub list-environments`. * **Tenant incorreto no login**: confirme se o `Tenant ID` corresponde ao tenant certo antes de autenticar. * **Sessão antiga em máquina compartilhada**: rode `tunnelhub logout` antes de iniciar novo login. ## Check rápido antes de deploy 1. `tunnelhub login-check` 2. `tunnelhub list-environments` 3. confirmar o valor de `--env` 4. confirmar se o projeto certo contém `tunnelhub.yml` Consulte também [Comandos e referência](/cli/commands.md). --- # Origem: https://docs.tunnelhub.io/cli/commands # Comandos e referência Esta página resume o comportamento atual dos comandos públicos da CLI e destaca os pré-requisitos mais importantes de cada fluxo. ## Matriz rápida | Comando | Exige login | Exige `--env` | Aceita `--json` | | ------------------- | ---------------- | ---------------- | --------------- | | `login` | não | não | não | | `logout` | não | não | não | | `login-check` | sim | não | não | | `list-environments` | sim | não | sim | | `list-packages` | sim | sim | sim | | `create-package` | sim | sim | não | | `list-automations` | sim | sim | sim | | `create-automation` | sim | sim | não | | `deploy-automation` | depende do fluxo | depende do fluxo | não | Para `deploy-automation`: * no fluxo interativo, exige login e `--env`; * no fluxo CI/CD M2M, não exige login no navegador e aceita `--environment-id` ou `--env` com UUID. ## Login ```bash tunnelhub login ``` * abre autenticação via navegador; * solicita `Tenant ID`; * salva tokens localmente; * usa refresh automático quando necessário. Fallback: ```bash tunnelhub login --password ``` ## Verificação de sessão ```bash tunnelhub login-check ``` Use para confirmar se as credenciais atuais ainda são válidas. ## Logout ```bash tunnelhub logout ``` Remove credenciais locais salvas pela CLI. ## Listagem de ambientes ```bash tunnelhub list-environments ``` Saída de máquina: ```bash tunnelhub list-environments --json ``` ## Listagem de pacotes ```bash tunnelhub list-packages --env DEV ``` Também é possível usar `--json`. Importante: `--env` é obrigatório. Você pode informar nome ou UUID do ambiente. ## Criação de pacote ```bash tunnelhub create-package --env DEV ``` O comando é interativo e hoje exige `--env` no fluxo público atual. ## Listagem de automações ```bash tunnelhub list-automations --env DEV ``` Também é possível usar `--json`. Importante: `--env` é obrigatório. Você pode informar nome ou UUID do ambiente. ## Criação de automação ```bash tunnelhub create-automation --env DEV ``` O comando permite escolher entre quatro templates: * `NO_DELTA` * `NO_DELTA_BATCH` * `DELTA` * `DELTA_BATCH` Durante o fluxo, a CLI: * consulta os pacotes do ambiente escolhido; * coleta nome, descrição, pacote, retention period e URL de repositório; * cria a automação na plataforma; * baixa o template oficial correspondente do GitHub; * extrai o projeto para uma nova pasta local; * preenche `service.uuid` no `tunnelhub.yml` gerado. ## Deploy de automação ```bash tunnelhub deploy-automation --env DEV --message "meu deploy" ``` Opções relevantes: * `--automation ` para sobrescrever o `service.uuid` do `tunnelhub.yml`; * `--environment-id ` para informar explicitamente o UUID do ambiente; * `--publish` para solicitar criação de versão publicada. Requisitos do deploy: Fluxo com login: * estar autenticado; * executar o comando na pasta que contém `tunnelhub.yml`; * ter `package.artifact` configurado; * fornecer `--env`; * fornecer `--message`. Fluxo CI/CD M2M: * configurar `TH_API_HOST`, `TH_CLIENT_ID` e `TH_CLIENT_SECRET`; * executar o comando na pasta que contém `tunnelhub.yml`; * ter `package.artifact` configurado; * fornecer `--environment-id` ou `--env` com UUID; * fornecer `--message`. O fluxo de deploy faz upload do artefato por URL assinada e depois solicita a criação do deploy na plataforma. No fluxo CI/CD com credenciais M2M: * configure `TH_API_HOST`, `TH_CLIENT_ID` e `TH_CLIENT_SECRET`; * use uma credencial autorizada para o ambiente alvo; * use `--environment-id` ou `--env` com UUID do ambiente; * use `--message` para registrar o contexto humano do deploy; * `createdBy` da revisão ficará como `api-client:`. Exemplo: ```bash COMMIT_EMAIL="$(git log -1 --pretty=format:'%ae')" COMMIT_SHA="$(git rev-parse --short HEAD)" th deploy-automation \ --environment-id "$TH_ENVIRONMENT_ID" \ --automation "$TH_AUTOMATION_ID" \ --message "GitHub Actions deploy ${COMMIT_SHA} by ${COMMIT_EMAIL}" ``` ## Troubleshooting rápido * **Não autenticado**: rode `tunnelhub login`. * **Ambiente inválido**: valide com `tunnelhub list-environments`. * **`tunnelhub.yml` não encontrado**: execute o comando na raiz correta do projeto. * **`package.artifact` ausente**: configure o caminho do ZIP antes do deploy. * **UUID da automação ausente**: preencha `service.uuid` ou use `--automation`. ## Fluxo recomendado ```bash tunnelhub login tunnelhub list-environments tunnelhub create-package --env DEV tunnelhub create-automation --env DEV # implementar e gerar artefato tunnelhub deploy-automation --env DEV --message "primeira versão" ``` Consulte também [Deploy via CI/CD](/cli/ci-cd-deployments.md), [Autenticação e ambientes](/cli/authentication-and-environments.md) e [`tunnelhub.yml`](/cli/tunnelhub-yml.md). --- # Origem: https://docs.tunnelhub.io/cli/tunnelhub-yml # `tunnelhub.yml` `tunnelhub.yml` é o manifesto local usado pelos fluxos de scaffold, build e deploy de projetos TunnelHub. Em geral, ele responde três perguntas: * qual recurso esse projeto representa; * como o artefato deve ser gerado ou publicado; * qual configuração de runtime acompanha a automação. ## Fonte de verdade pública Use esta página como referência prática e o schema publicado no SchemaStore como referência estrutural: * `https://json.schemastore.org/tunnelhub.json` Se você usa editor com suporte a JSON Schema em YAML, vale associar esse schema ao arquivo para ganhar validação e autocomplete. Alguns campos recém-lançados podem aparecer nesta documentação antes da atualização do schema publicado. ## Exemplo mínimo ```yaml service: type: automation uuid: 11111111-2222-3333-4444-555555555555 configuration: runtimeEngine: LAMBDA entrypoint: index.handler runtime: nodejs22.x memorySize: 512 timeout: 30 package: artifact: dist/artifact.zip ``` ## Exemplo com campos opcionais ```yaml service: type: automation uuid: 11111111-2222-3333-4444-555555555555 region: us-east-1 configuration: runtimeEngine: LAMBDA entrypoint: index.handler runtime: nodejs22.x memorySize: 1024 timeout: 120 lambdaLayers: - arn:aws:lambda:us-east-1:123456789012:layer:shared-lib:1 environmentVariables: LOG_LEVEL: info vpcConfig: subnetIds: - subnet-aaaa1111 securityGroupIds: - sg-bbbb2222 assignPublicIp: false package: artifact: dist/artifact.zip ``` ## Bloco `service` Esse bloco identifica o tipo de recurso e o vínculo com a plataforma. Campos mais importantes: * `type`: normalmente `automation` no fluxo público atual; * `uuid`: UUID da automação no TunnelHub; * `region`: opcional em cenários que precisam declarar região explicitamente. Durante `create-automation`, a CLI escreve `service.uuid` automaticamente no template baixado. ## Bloco `configuration` Esse bloco orienta o runtime do projeto. Campos mais comuns: * `runtimeEngine`: como `LAMBDA` ou `ECS_FARGATE`; * `entrypoint`: função ou arquivo de entrada esperado pelo bundle; * `runtime`: runtime Node.js alvo; * `memorySize`: memória esperada; * `timeout`: tempo máximo de execução. Também podem aparecer campos opcionais, como: * `lambdaLayers`; * `environmentVariables`; * `runInVpc`; * `sqlTables`; * `vpcConfig`. O schema publicado é a melhor referência para validar combinações e tipos desses campos. ### Tabelas de Apoio Para usar [Tabelas de Apoio](/produto/sql-tables.md) em automações, habilite o bloco `sqlTables`: ```yaml configuration: runtimeEngine: LAMBDA entrypoint: index.handler runtime: nodejs24.x memorySize: 1024 timeout: 60 runInVpc: true sqlTables: enabled: true ``` Quando `sqlTables.enabled` é `true`, a automação precisa usar `runtime: nodejs24.x`, `runInVpc: true` e `runtimeEngine: LAMBDA` ou `ECS_FARGATE`. Nota: a documentação deste campo pode preceder a atualização do schema publicado no SchemaStore. Até que `tunnelhub.json` seja atualizado, editores podem não validar ou autocompletar `configuration.sqlTables`. ## Bloco `package` Esse bloco é especialmente importante para o deploy da CLI. Campo crítico: * `artifact`: caminho do artefato ZIP que será enviado para a plataforma. Sem esse valor, `deploy-automation` não consegue concluir o fluxo de publicação. ## Quem usa cada parte do arquivo * **CLI scaffold**: preenche `service.uuid`. * **CLI deploy**: lê `service.uuid` e `package.artifact`. * **SDK build tooling**: usa `configuration` para empacotar o projeto corretamente. ## O que é obrigatório na prática Para o fluxo público atual de automações, o contrato mínimo é: * `service.type`; * `service.uuid`; * `configuration.runtimeEngine`; * `configuration.entrypoint`; * `configuration.runtime`; * `configuration.memorySize`; * `package.artifact`. ## Erros comuns * **`tunnelhub.yml` ausente**: execute o deploy na raiz do projeto correto. * **`service.uuid` ausente**: recrie o projeto com `create-automation` ou informe `--automation` no deploy. * **`package.artifact` ausente**: configure o caminho do ZIP antes do deploy. * **artefato em caminho errado**: confirme se o arquivo realmente existe no caminho configurado. * **bundle incompleto**: garanta que o artefato gerado contenha o que o runtime precisa. ## Relação com o fluxo de trabalho O ciclo mais comum é: 1. `create-automation` gera o projeto e grava `service.uuid`; 2. o projeto gera o artefato configurado; 3. `deploy-automation` lê `tunnelhub.yml` e publica a nova versão. Consulte também [Comandos e referência](/cli/commands.md) e [Criando sua primeira automação](/primeiros-passos/creating-your-first-automation.md). --- # Origem: https://docs.tunnelhub.io/sdk/sdk # Visão geral O `@tunnelhub/sdk` é a base pública para implementar automações no TunnelHub. ## O que o SDK entrega * flows prontos para integrações com e sem delta; * persistência e comparação de estado em flows delta; * logging operacional com estratégia inteligente; * utilitários para parâmetros, systems, Tabelas De/Para e Sequências; * utilitários de interceptação HTTP, validação e concorrência; * suporte a build, testes locais e troubleshooting. ## Instalação ```bash npm install @tunnelhub/sdk ``` ## Superfície pública atual O entrypoint principal exporta, entre outros: * `AutomationExecution` * `DeltaIntegrationFlow` * `BatchDeltaIntegrationFlow` * `NoDeltaIntegrationFlow` * `NoDeltaBatchIntegrationFlow` * `AutomationParameter` * `DataStore` * `Sequences` * `System` * `setupInterceptor` * `promiseWithConcurrency` * `validateMetadata` * `SDK` O pacote também possui export separado para build tooling em `@tunnelhub/sdk/building`. ## Como pensar o runtime Na prática, um projeto TunnelHub costuma combinar: * um handler em `src/index.ts`; * uma classe que herda um dos flows do SDK; * `AutomationExecution.executeAutomation(...)` como ponto central da execução; * `tunnelhub.yml` para build e deploy. Consulte [Estrutura de projeto e runtime](/sdk/project-structure-and-runtime.md) para o fluxo completo. ## Como escolher um flow * use **No delta** quando o processamento é unidirecional e sem comparação de estado; * use **No delta batch** para alto volume unidirecional; * use **Delta** quando precisa detectar insert, update e delete; * use **Delta batch** quando precisa do modelo delta com processamento em lote. ## Skill para agentes Além da documentação, existe um skill público chamado `tunnelhub-sdk` para ajudar agentes a trabalhar melhor com o SDK. Esse skill é especialmente útil para: * escolher o flow correto; * trabalhar com parâmetros, systems, Tabelas De/Para e Sequências; * entender logging, interceptor HTTP e utilitários; * acelerar troubleshooting e implementação de testes. Instalação: ```bash npx skills add tunnelhub/agent-skills --skill tunnelhub-sdk -a opencode ``` Instalação global: ```bash npx skills add tunnelhub/agent-skills --skill tunnelhub-sdk -a opencode -g ``` ## Próximas leituras * [Como escolher um flow](/sdk/choosing-a-flow.md) * [Fluxos de integração](/sdk/integration-flows.md) * [Helpers de plataforma](/sdk/platform-services.md) * [Build, deploy e testes](/sdk/logging-and-testing.md) * [Estrutura de projeto e runtime](/sdk/project-structure-and-runtime.md) --- # Origem: https://docs.tunnelhub.io/sdk/choosing-a-flow # Como escolher um flow O SDK público expõe quatro classes base para automações. A escolha certa depende menos do sistema de origem e mais de como você quer comparar, agrupar e publicar dados. ## Visão rápida | Flow | Quando usar | Pergunta-chave | | ----------------------------- | ---------------------------------------------------------- | ----------------------------------------------------- | | `NoDeltaIntegrationFlow` | envio unidirecional sem comparação de estado | "eu só preciso ler e enviar?" | | `NoDeltaBatchIntegrationFlow` | envio unidirecional em alto volume | "eu preciso processar em lotes?" | | `DeltaIntegrationFlow` | comparação de origem e destino com insert, update e delete | "eu preciso reconciliar estados?" | | `BatchDeltaIntegrationFlow` | delta com processamento em lote | "eu preciso reconciliar estados e agrupar operações?" | ## `NoDeltaIntegrationFlow` Use quando a automação apenas lê uma origem e executa uma ação de saída, sem comparar snapshots anteriores. Cenários comuns: * envio de eventos para API externa; * exportação simples para data lake; * processamento disparado por payload de webhook. ## `NoDeltaBatchIntegrationFlow` Use quando o cenário continua sendo unidirecional, mas o volume pede agrupamento para reduzir custo, chamadas externas ou tempo de processamento. Esse flow costuma fazer sentido quando: * o destino aceita operações em lote; * o custo por request é relevante; * o volume por execução é alto. ## `DeltaIntegrationFlow` Use quando a automação precisa comparar origem e destino para decidir entre: * insert; * update; * delete. Esse é o flow certo para sincronizações clássicas entre sistemas com reconciliação de estado. Geralmente, ele pede uma modelagem clara de: * `keyFields` para identidade do registro; * `deltaFields` para comparação de mudança; * ações de insert, update e delete. ## `BatchDeltaIntegrationFlow` Use quando o cenário é delta, mas o volume exige batching. Ele combina a lógica de reconciliação com operações agrupadas no destino, o que costuma ser útil em integrações com: * APIs bulk; * pipelines analíticos; * sistemas com custo alto por operação individual. ## Regras práticas de decisão * se não existe comparação entre origem e destino, comece por **No delta**; * se existe comparação, comece por **Delta**; * só vá para as versões **batch** quando houver ganho claro de volume, custo ou throughput; * não escolha batch apenas por antecipação: a implementação e o troubleshooting tendem a ficar mais complexos. ## Exemplos de cenários * **Webhook que recebe nota emitida e grava em banco**: `NoDeltaIntegrationFlow` * **Exportação diária de pedidos para lake**: `NoDeltaBatchIntegrationFlow` * **Sincronização de usuários entre HR e ERP**: `DeltaIntegrationFlow` * **Sincronização massiva de catálogo entre duas bases**: `BatchDeltaIntegrationFlow` ## Depois da escolha Depois de escolher o flow: 1. modele `defineMetadata()` com foco no monitoramento; 2. externalize parâmetros e sistemas no produto; 3. valide se precisa de Tabelas De/Para ou Sequências; 4. planeje build e deploy com `tunnelhub.yml`. Consulte também [Fluxos de integração](/sdk/integration-flows.md) e [Helpers de plataforma](/sdk/platform-services.md). --- # Origem: https://docs.tunnelhub.io/sdk/integration-flows # Fluxos de integração O SDK expõe quatro flows públicos. Eles cobrem os cenários principais de sincronização e transferência de dados. ## Tabela rápida | Flow | Quando usar | Métodos centrais | | ----------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `NoDeltaIntegrationFlow` | envio unidirecional sem comparação de estado | `loadSourceSystemData()`, `sendData()`, `defineMetadata()` | | `NoDeltaBatchIntegrationFlow` | envio unidirecional em lote | `loadSourceSystemData()`, `sendDataInBatch()`, `defineMetadata()` | | `DeltaIntegrationFlow` | reconciliação com insert, update e delete | `loadSourceSystemData()`, `loadTargetSystemData()`, `insertAction()`, `updateAction()`, `deleteAction()`, `defineMetadata()` | | `BatchDeltaIntegrationFlow` | reconciliação em lote | `loadSourceSystemData()`, `loadTargetSystemData()`, `batchInsertAction()`, `batchUpdateAction()`, `batchDeleteAction()`, `defineMetadata()` | ## 1. NoDeltaIntegrationFlow Use quando a automação apenas coleta dados de uma origem e envia para um destino, sem comparar estado anterior. Métodos centrais: * `loadSourceSystemData()` * `sendData()` * `defineMetadata()` ## 2. NoDeltaBatchIntegrationFlow Use quando o comportamento continua sendo no-delta, mas o volume pede agrupamento. Métodos centrais: * `loadSourceSystemData()` * `sendDataInBatch()` * `defineMetadata()` ## 3. DeltaIntegrationFlow Use quando você precisa comparar origem e destino para identificar: * inserts; * updates; * deletes. Métodos centrais: * `loadSourceSystemData()` * `loadTargetSystemData()` * `insertAction()` * `updateAction()` * `deleteAction()` * `defineMetadata()` ## 4. BatchDeltaIntegrationFlow Use quando o modelo delta precisa operar com maior volume e chamadas em lote. Métodos centrais: * `loadSourceSystemData()` * `loadTargetSystemData()` * `batchInsertAction()` * `batchUpdateAction()` * `batchDeleteAction()` * `defineMetadata()` ## Key fields e delta fields Nos flows delta, você define: * **key fields** para identificar unicamente um registro; * **delta fields** para detectar alterações relevantes. Na prática, `keyFields` define identidade e `deltaFields` define o que conta como mudança relevante. ## Persistência de estado Os flows delta usam os recursos internos do SDK para persistir o estado anterior da execução. Isso permite comparar snapshots e reduzir lógica manual dentro da integração. ## Metadados `defineMetadata()` controla como os dados aparecerão no monitoramento. Boas práticas: * use labels compreensíveis para operação; * não use `Action`, `Status` ou `Message` como `fieldLabel`; * escolha o `fieldType` correto para melhorar filtros e visualização. ## Regras práticas de decisão * se não existe comparação entre origem e destino, comece por **No delta**; * se existe comparação, comece por **Delta**; * só vá para as versões **batch** quando houver ganho claro de volume, custo ou throughput; * não escolha batch apenas por antecipação. Para uma visão mais orientada a cenários, consulte [Como escolher um flow](/sdk/choosing-a-flow.md). --- # Origem: https://docs.tunnelhub.io/sdk/platform-services # Helpers de plataforma O SDK não se limita ao flow principal. Ele também expõe utilitários para ler configuração e estado operacional do TunnelHub. ## Parâmetros `AutomationParameter` permite: * ler parâmetros recebidos no evento; * recuperar parâmetros obrigatórios; * interpretar booleanos; * persistir valores dinâmicos entre execuções, quando aplicável. Esse recurso é útil para feature flags, cursores de sincronização, overrides por ambiente e pequenos estados controlados pelo produto. Exemplo conceitual: ```ts const lastCursor = AutomationParameter.getRequiredParameter(event.parameters, 'lastCursor'); ``` ## Systems Os systems associados à automação chegam no payload de execução. Eles representam conexões como HTTP, banco de dados, FTP/SFTP, SOAP e outras. O uso recomendado é localizar o system pelo `internalName` e usar seus parâmetros tipados para a integração. Exemplo conceitual: ```ts const erpSystem = event.systems.find((system) => system.internalName === 'ERP_HTTP'); ``` Esse padrão reduz acoplamento entre código e credenciais do ambiente. ## Tabelas De/Para `DataStore` permite consultar Tabelas De/Para e seus itens durante a execução. Casos comuns: * mapear status; * traduzir códigos; * resolver IDs externos; * aplicar regra de negócio sem alterar o código. Exemplo conceitual: ```ts const dataStore = new DataStore(event); const conversionTable = new ConversionTable(dataStore); const mappedValue = await conversionTable.getValueFromConversionTable( 'sales-channel-map', order.channel, undefined, true, ); ``` ## Sequências `Sequences` permite pedir o próximo valor de uma Sequência diretamente no runtime da automação. Esse helper é útil quando o destino precisa de identificadores controlados pela plataforma, sem depender de contadores locais no projeto. Exemplo conceitual: ```ts const nextValue = await sequences.getSequenceNextValue('ORDER_NUMBER'); ``` ## Tabelas de Apoio `SqlTables` permite inserir, consultar, atualizar e remover linhas em Tabelas de Apoio associadas à automação. Esse helper deve ser usado apenas no runtime gerenciado com `sqlTables.enabled=true`, porque depende do SQLite montado pela plataforma. Exemplo conceitual: ```ts const sqlTables = new SqlTables(event); const row = await sqlTables.insertRow('customer-cache', { document: '12345678900', name: 'Cliente exemplo', }); await sqlTables.updateRow('customer-cache', row.rowId, { name: 'Cliente atualizado', }); ``` ## Interceptor HTTP `setupInterceptor()` habilita interceptação de chamadas HTTP para ampliar a observabilidade de requisições e respostas. Isso é útil quando a integração conversa com APIs externas e o time precisa de mais rastreabilidade. Em projetos orientados a troubleshooting, esse recurso pode reduzir bastante o tempo de investigação. ## Utilitários O SDK também exporta utilitários como: * `promiseWithConcurrency()` * `promiseAllSettled()` * `validateMetadata()` * `validateMetadataArray()` Esses utilitários ajudam a controlar concorrência, validar configurações e simplificar implementações de alto volume. ## Recomendações práticas * localize systems por `internalName`, nunca por posição na lista; * prefira parâmetros e Tabelas De/Para a condicionais rígidas no código; * use Tabelas de Apoio quando o dado tiver estrutura relacional própria; * use `Sequences` apenas quando a geração de identificador realmente pertence à plataforma; * ative interceptação HTTP com intenção clara de observabilidade. --- # Origem: https://docs.tunnelhub.io/sdk/logging-and-testing # Build, deploy e testes O SDK atual não cobre apenas runtime. Ele também participa do empacotamento do projeto, da estratégia de logging e dos testes locais. ## Build e empacotamento O pacote público expõe tooling de build em `@tunnelhub/sdk/building` e o bin `tunnelhub-sdk-esbuild`. Esse fluxo lê a configuração do projeto, usa `tunnelhub.yml` como referência e normalmente gera um artefato ZIP para deploy. Na prática, isso ajuda a padronizar: * entrypoint; * runtime; * memória e timeout; * arquivos incluídos no bundle; * artefato final esperado pela CLI. ## Estratégia de logging O SDK escolhe entre logging em tempo real e logging em lote conforme o volume e o perfil da execução. Em alto nível: * cargas pequenas tendem a usar logging em tempo real; * cargas muito grandes tendem a usar modo em lote; * flows podem ajustar limiares protegidos para adaptar o comportamento. Esse desenho melhora custo e performance sem exigir lógica manual em cada integração. ## Observabilidade Os logs da automação alimentam as telas de monitoramento da plataforma. A qualidade dos metadados e das mensagens impacta diretamente a capacidade de suporte e investigação. Boas práticas: * incluir identificadores de negócio nos metadados; * evitar mensagens genéricas demais; * diferenciar erro técnico de erro funcional; * usar `setupInterceptor()` apenas quando o ganho investigativo justificar. ## Testes locais Para testes, o SDK expõe o flag: ```ts SDK.testMode = true; ``` Esse modo é recomendado para suítes Jest e cenários de mock de serviços AWS ou chamadas externas. Para `SqlTables`, o modo de teste apenas desativa a validação de runtime no construtor. Faça mock explícito dos métodos usados, como `queryRows` e `insertRow`; ele não cria SQLite local, EFS ou persistência. Consulte [Tabelas de Apoio](/produto/sql-tables.md#testes-locais) para um exemplo com fixtures JSON e armazenamento em memória. ## Modo verboso Quando necessário, você pode habilitar: ```ts SDK.verbose = true; ``` Isso ajuda durante desenvolvimento e depuração local. ## O que vale testar em uma automação Checklist mínimo: * handler chama `AutomationExecution.executeAutomation(...)` corretamente; * flow instancia sem erro com payload mínimo; * `defineMetadata()` está válida; * principal caminho feliz da integração está coberto; * erros relevantes retornam mensagens operacionais úteis. ## Troubleshooting comum * **parâmetro obrigatório ausente**: valide o cadastro no produto e o helper usado no código; * **Tabela De/Para ou Sequência não encontrada**: confirme código, ambiente e associação correta; * **erro de metadata**: revise labels reservadas e tipos inválidos; * **artefato inconsistente**: confira `tunnelhub.yml`, entrypoint e caminho do ZIP antes do deploy. --- # Origem: https://docs.tunnelhub.io/sdk/project-structure-and-runtime # Estrutura de projeto e runtime Esta página mostra como um projeto TunnelHub costuma ser organizado e como o SDK participa da execução. ## Estrutura típica Um template oficial normalmente inclui: * `src/index.ts`; * uma classe de integração em `src/core/` ou equivalente; * `metadata`; * tipos e modelos; * `__tests__`; * `tunnelhub.yml`. ## Handler O handler principal costuma: * instanciar a classe de integração; * chamar `AutomationExecution.executeAutomation(...)`; * retornar sucesso HTTP quando não há erro fatal. Esse é o ponto de entrada esperado pelo runtime público. ## Classe de integração Essa classe herda um dos flows do SDK e concentra a lógica principal de negócio: * extração da origem; * reconciliação com destino, quando houver delta; * envio, insert, update ou delete; * definição de metadados. ## Payload de execução Em runtime, a automação recebe um payload que costuma incluir pelo menos: * identificadores de tenant, ambiente, automação e execução; * systems associados; * parameters cadastrados; * payload do trigger, quando aplicável. É esse contrato que conecta o produto ao código. ## Relação com `tunnelhub.yml` `tunnelhub.yml` define como o projeto será empacotado e publicado. O runtime depende desse arquivo para localizar o artefato e interpretar a configuração básica do serviço. ## Fluxo completo 1. a CLI cria a automação e baixa um template; 2. o projeto implementa a integração com o SDK; 3. o build gera o artefato definido em `package.artifact`; 4. a CLI publica uma nova versão; 5. o produto executa e monitora a automação. --- # Origem: https://docs.tunnelhub.io/mcp/mcp # Visão geral Conecte seu assistente de IA ao TunnelHub para consultar recursos, investigar execuções e realizar operações na plataforma usando linguagem natural. A conexão usa o Model Context Protocol (MCP) e respeita as permissões da sua conta em cada empresa e ambiente. ## Comece aqui Adicione esta URL como servidor MCP remoto no seu assistente: ```text https://mcp.tunnelhub.io/tunnelhub/mcp ``` Siga o [guia de conexão](/mcp/remote.md) para configurar o cliente e autorizar o acesso pelo navegador. Depois de conectar, peça ao assistente para listar suas empresas e os ambientes disponíveis. Informe em qual deles deseja trabalhar. ## O que você pode fazer * Consultar automações, pacotes, sistemas e usuários. * Localizar execuções, resumir falhas e analisar logs de processamento. * Consultar APIs, chamadas, planos de uso e estatísticas de consumo. * Trabalhar com Tabelas De/Para e Tabelas de Apoio. * Criar, atualizar ou excluir recursos e executar automações, quando sua conta tiver permissão. Consulte o [catálogo de ferramentas](/mcp/tools.md) para conhecer as operações disponíveis. Ações de alteração afetam os recursos da empresa e do ambiente informados; confira esses dados antes de autorizar uma ação no assistente. ## Experimente * “Liste as empresas e os ambientes aos quais tenho acesso.” * “Na empresa Acme, ambiente Produção, quais automações tiveram erro nas últimas 24 horas?” * “Resuma a execução mais recente da automação de pedidos e destaque os registros que falharam.” * “Mostre as chamadas da API de pedidos que retornaram erro hoje.” Use os nomes da sua empresa, ambiente e automação no lugar dos exemplos. Se houver mais de um recurso com o mesmo nome, peça ao assistente para listar as opções antes de continuar. ## Próximos passos * [Conectar seu assistente](/mcp/remote.md) * [Consultar as ferramentas disponíveis](/mcp/tools.md) * [Investigar uma execução](/mcp/investigating-executions.md) --- # Origem: https://docs.tunnelhub.io/mcp/remote # Conectar seu assistente Conecte seu assistente ao TunnelHub pela URL abaixo. Você faz login pelo navegador e autoriza o assistente a usar as ferramentas disponíveis para sua conta. ```text https://mcp.tunnelhub.io/tunnelhub/mcp ``` Essa URL é a mesma para todas as empresas e ambientes. Você escolhe onde trabalhar depois de conectar. ## Antes de começar Você precisa de uma conta TunnelHub com acesso à empresa e ao ambiente desejados, além de um cliente com suporte a MCP remoto, transporte Streamable HTTP e autenticação OAuth. ## Conectar e autorizar 1. Adicione o TunnelHub como servidor MCP remoto no seu cliente, usando a URL acima. 2. Inicie a autenticação e faça login no TunnelHub pelo navegador. 3. Confira a solicitação de acesso e autorize a conexão. 4. Retorne ao assistente e peça: “Liste minhas empresas e os ambientes disponíveis”. A autorização mantém as permissões da sua conta. Ela não libera acesso a empresas, ambientes ou operações que você não pode usar no TunnelHub. ### OpenCode Adicione o servidor ao arquivo de configuração do OpenCode: ```json { "mcp": { "tunnelhub": { "type": "remote", "url": "https://mcp.tunnelhub.io/tunnelhub/mcp" } } } ``` Em seguida, execute e conclua a autorização no navegador: ```bash opencode mcp auth tunnelhub ``` Consulte também o [guia de servidores MCP do OpenCode](https://opencode.ai/docs/mcp-servers/). ### Codex No Codex CLI, execute: ```bash codex mcp add tunnelhub --url https://mcp.tunnelhub.io/tunnelhub/mcp codex mcp login tunnelhub ``` No aplicativo Codex, abra as configurações de servidores MCP, adicione um servidor Streamable HTTP com o nome `tunnelhub` e a URL acima, salve e autorize a conexão. Consulte também o [guia de MCP do Codex](https://developers.openai.com/codex/mcp). ### Claude Code Adicione o servidor: ```bash claude mcp add --transport http tunnelhub https://mcp.tunnelhub.io/tunnelhub/mcp ``` No Claude Code, use `/mcp`, selecione o TunnelHub e inicie a autenticação. Veja o [guia de MCP do Claude Code](https://code.claude.com/docs/en/mcp) para as opções do cliente. ### Claude Na área de conectores, adicione um conector personalizado com a URL do TunnelHub e conclua o login. Em contas de equipe, um administrador pode precisar disponibilizar o conector antes de cada pessoa conectar sua conta. Consulte o [guia de conectores personalizados do Claude](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp). ### ChatGPT Habilite o modo de desenvolvedor, quando disponível, e adicione uma conexão MCP personalizada na área de aplicativos ou plugins. Informe a URL do TunnelHub, selecione autenticação OAuth e conclua o login. Depois, habilite a conexão na conversa em que deseja usá-la. A disponibilidade desse recurso depende da conta e das políticas da sua organização. Consulte o [guia de conexão MCP do ChatGPT](https://developers.openai.com/plugins/deploy/connect-chatgpt). ## Escolher a empresa e o ambiente Informe ao assistente em qual empresa e ambiente deseja trabalhar. Ele pode descobrir os identificadores pelas ferramentas: 1. `list_my_tenants_tunnelhub`: lista as empresas acessíveis. 2. `list_environments_tunnelhub`: recebe o `tenantId` da empresa e lista seus ambientes. 3. As operações seguintes recebem `tenantId` e, quando se referem a um ambiente, `environmentId`. Por exemplo, uma chamada a `list_automations_tunnelhub` usa: ```json { "tenantId": "", "environmentId": "", "current": 1, "pageSize": 20 } ``` Os IDs devem ser os retornados pelas ferramentas. Cada operação identifica a empresa e o ambiente em que será realizada. ## Resolver problemas de conexão | Situação | O que fazer | | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | A autorização expirou ou o login não foi concluído | Inicie novamente a autenticação pelo cliente e conclua o fluxo no navegador. | | Uma empresa ou um ambiente não aparece | Confira a conta usada no login e peça ao administrador para verificar seu acesso. | | Uma operação foi negada | Confira a empresa, o ambiente e as permissões necessárias para a operação. | | Sua empresa exige login corporativo por SAML | Essa forma de autenticação ainda não está disponível nesta conexão. Consulte o administrador para orientação sobre o acesso. | Para encerrar o uso, desconecte o TunnelHub nas configurações do cliente. Continue em [Catálogo de ferramentas](/mcp/tools.md) ou [Investigando execuções](/mcp/investigating-executions.md). --- # Origem: https://docs.tunnelhub.io/mcp/tools # Catálogo de ferramentas As ferramentas permitem ao assistente consultar e operar recursos do TunnelHub. Cada operação respeita as permissões da sua conta na empresa e no ambiente informados. Você pode pedir uma ação em linguagem natural. O assistente escolhe a ferramenta e solicita os dados necessários. Confira a empresa, o ambiente e os recursos envolvidos antes de autorizar alterações ou exclusões. ## Empresa e ambiente Use `list_my_tenants_tunnelhub` para listar as empresas e `list_environments_tunnelhub` com o `tenantId` para listar os ambientes. As operações da empresa recebem `tenantId`; as operações de ambiente também recebem `environmentId`. Se ainda não conectou seu assistente, siga o [guia de conexão](/mcp/remote.md). ## Recursos da plataforma | Área | Operações disponíveis | Exemplos de ferramentas | | ------------------------ | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | Empresas | Listar e consultar detalhes. | `list_my_tenants_tunnelhub`, `get_tenant_tunnelhub` | | Usuários | Listar, consultar, criar, atualizar e excluir. | `list_users_tunnelhub`, `create_user_tunnelhub` | | Pacotes | Listar, consultar, criar, atualizar e excluir. | `list_packages_tunnelhub`, `get_package_tunnelhub` | | Sistemas | Listar, consultar, criar, atualizar e excluir. | `list_systems_tunnelhub`, `get_system_tunnelhub` | | Automações | Listar, consultar, criar, atualizar, excluir e executar; consultar histórico de publicação e ações. | `list_automations_tunnelhub`, `execute_automation_tunnelhub` | | Transporte de automações | Consultar solicitações de transporte entre ambientes, solicitar, aprovar e rejeitar. | `list_automation_transports_tunnelhub`, `request_automation_transport_tunnelhub` | | Tabelas De/Para | Consultar e gerenciar tabelas e seus itens. | `list_data_stores_tunnelhub`, `list_data_store_items_tunnelhub` | | Tabelas de Apoio | Consultar e gerenciar tabelas, estrutura e registros; exportar registros. | `list_sql_tables_tunnelhub`, `export_sql_table_rows_tunnelhub` | ## Execuções e monitoramento | Objetivo | Ferramenta | | -------------------------------------------- | -------------------------------------- | | Listar execuções | `list_automation_executions_tunnelhub` | | Localizar uma execução por período e filtros | `find_execution_tunnelhub` | | Consultar o detalhe de uma execução | `get_execution_tunnelhub` | | Resumir uma execução | `summarize_execution_tunnelhub` | | Consultar eventos técnicos | `get_execution_traces_tunnelhub` | | Consultar logs dos registros processados | `get_execution_logs_tunnelhub` | | Solicitar uma exportação de traces | `export_execution_traces_tunnelhub` | | Consultar uma exportação de traces | `get_trace_export_tunnelhub` | Para os detalhes de uma execução, use `automationId`, `executionId` e `executionPeriod` retornados pela busca. Veja o passo a passo em [Investigando execuções](/mcp/investigating-executions.md). ## APIs e consumo As ferramentas de API Management permitem consultar: * APIs e seus detalhes; * planos de uso e chaves de API; * clientes de autenticação e servidores de recursos; * chamadas por recurso ou período; * detalhes de chamadas, incluindo os dados enviados e recebidos quando disponíveis. Comece com `list_api_gateways_tunnelhub`, `list_all_api_gateway_logs_tunnelhub` ou `get_api_gateway_log_tunnelhub`, conforme a consulta desejada. Para consumo e estatísticas, use `get_home_statistics_tunnelhub` e `get_tenant_execution_statistics_tunnelhub`. ## Boas práticas * Informe a empresa, o ambiente e um período ao consultar execuções ou chamadas de API. * Use filtros e paginação para trabalhar com grandes volumes. * Peça uma consulta antes de solicitar alterações, para confirmar o recurso correto. * Logs, chaves de API e dados de processamento podem conter informações confidenciais. Revise o conteúdo antes de compartilhá-lo fora da sua organização. --- # Origem: https://docs.tunnelhub.io/mcp/investigating-executions # Investigando execuções Use o MCP para localizar uma execução, entender seu resultado e analisar os registros que precisam de atenção. Você pode começar com um pedido como: > Na empresa Acme, ambiente Produção, encontre as execuções com erro da automação de pedidos nas últimas 24 horas. Resuma a mais recente e mostre os registros que falharam. Substitua os nomes pelos recursos da sua empresa. Informe também o fuso horário quando ele for relevante para o período consultado. ## 1. Localize a execução Peça ao assistente para buscar as execuções usando `find_execution_tunnelhub`. Informe o período, a automação quando conhecida e o status desejado. A consulta inclui o `tenantId` da empresa e o `environmentId` do ambiente. A busca retorna os identificadores usados nas próximas consultas: | Campo | Significado | | ----------------- | ------------------------------------------ | | `automationId` | Identificador da automação. | | `executionId` | Identificador da execução. | | `executionPeriod` | Período da execução, no formato `YYYY-MM`. | Use o período retornado pela busca, inclusive ao investigar execuções antigas. ## 2. Consulte o resumo Use `summarize_execution_tunnelhub` para obter uma visão do resultado e dos principais indícios de falha. Para consultar os dados detalhados, use `get_execution_tunnelhub`. Exemplo de parâmetros, substituindo os valores entre `< >` pelos IDs e pelo período retornados: ```json { "tenantId": "", "environmentId": "", "automationId": "", "executionId": "", "executionPeriod": "" } ``` ## 3. Aprofunde a análise Escolha a consulta conforme o problema: | O que você quer entender | Ferramenta | Exemplo de pedido | | ---------------------------------------- | -------------------------------- | ------------------------------------------------------------------- | | A sequência de eventos e falhas técnicas | `get_execution_traces_tunnelhub` | “Mostre os eventos com erro e o que aconteceu imediatamente antes.” | | O resultado de cada registro processado | `get_execution_logs_tunnelhub` | “Liste os registros que falharam e a mensagem de erro de cada um.” | Use filtros por nível, status, mensagem ou período quando disponíveis. Para compartilhar uma análise extensa, as ferramentas `export_execution_traces_tunnelhub` e `get_trace_export_tunnelhub` permitem solicitar e consultar uma exportação de traces. ## 4. Organize o resultado Peça ao assistente para apresentar: * a automação e a execução analisadas; * o período e o ambiente; * os erros encontrados e os registros afetados; * as evidências que sustentam a análise; * os pontos que ainda precisam de confirmação. Logs e traces podem conter informações da sua operação. Revise os dados antes de compartilhar o resultado em chamados ou com outras pessoas.