Detalhes
ia / profissional
Tabby
Ajudei a desenhar e desenvolver o Tabby com a equipe Adopt AI: sessões de navegador para handoff de login humano, pods de worker por sessão, execução autenticada de API e automação no navegador.
Arquitetura 3D ao vivo
Use a navegação para alternar entre diagramas e trabalhos relacionados, depois role o painel para ler os detalhes.
Login por VNC cria um BrowserContext autenticado que pode apoiar automação de API e navegador.
Papel
Ajudei a desenhar e desenvolver o Tabby com colegas da Adopt AI.
Problema
O ABCD podia ingerir APIs web internas, mas a autenticação ainda exigia participação humana em alguns sistemas. Login, MFA, fluxos de renovação e telas antigas não podiam ser reduzidos a uma simples entrega de credencial de API, e alguns fluxos ainda precisavam de interação real com a página.
Implementação
O Tabby é um monorepo TypeScript usando Nx, NestJS, workers Playwright e um controller Kubernetes. Cada sessão é reconciliada em um pod de worker com contexto de tenant, app e sessão. O worker inicia um navegador e cria um BrowserContext que ações autenticadas de API e navegador podem reutilizar depois do login.
Execução autenticada
Depois que uma pessoa conclui o login, caminhos autorizados de fetch e execução no navegador podem reutilizar o BrowserContext autenticado. A execução no navegador cobre fluxos de apontar e clicar quando APIs não bastam. Eventos de auditoria são registrados para os caminhos de execução sem copiar headers, corpos de requisição ou valores digitados para o evento.
Ciclo de vida e recuperação
O controller reconcilia quantidades desejadas de sessões entre réplicas e usa bloqueio de banco com FOR UPDATE SKIP LOCKED para distribuir trabalho. O modelo de estado separa saúde da sessão do baton entre humano e automação, incluindo estados starting, healthy, unhealthy, login-needed, login-in-progress, failed e terminated, além de recuperação de baton, retentativas e timeouts.
Artefatos capturados
O worker pode exportar estado finito de autenticação do navegador: cookies, headers configurados, valores CSRF, storage do navegador e extrações customizadas. O worker criptografa artefatos com AES-256-GCM usando nonce, armazena blobs no MinIO, registra metadados e expiração no banco, e publica um evento NATS. Os artefatos capturam valores selecionados de autenticação e não restauram o processo Chrome. A configuração propaga TENANT_ENCRYPTION_KEY, sem estabelecer uma chave exclusiva por tenant.
Sessões de gravação preparadas
Um pool aquecido inicia sessões saudáveis em about:blank sob um tenant de sistema. Uma transação reserva uma sessão e reatribui aplicação, tenant e proprietário. Assim, a inicialização do navegador acontece antes da solicitação de gravação. Depois de gravar, a sessão é encerrada em vez de voltar ao pool; reservas de proxy são gerenciadas separadamente.
Acesso por CDP e VNC
Sessões CDP sem interface usam um relay restrito à página, que filtra eventos e comandos para um alvo fixo e rejeita comandos Target.*. Sessões VNC com interface usam Xvfb e um sidecar noVNC para interação humana. Os dois modos oferecem caminhos distintos para inspeção do navegador e login humano.
Stack e domínios
- TypeScript
- NestJS
- Nx
- Playwright
- Kubernetes
- PostgreSQL
- Redis
- NATS
- MinIO