stamatios
← Voltar ao feed
Cubos de código atravessam barreira de vidro rumo a cidade de placa-mãe, sandbox do Run SDK da Vercel
Dev & Engenharia

Run SDK da Vercel executa JavaScript não confiável em sandbox

resumo de ~3 min

A Vercel lançou o Run SDK, um pacote para executar JavaScript e TypeScript não confiáveis sem dar a eles acesso direto à aplicação ou ao sistema, instalável com pnpm add run. Segundo o anúncio, agentes escrevem cada vez mais programas em TypeScript para coordenar ferramentas e processar resultados, mas rodar esse código com eval lhe confere o mesmo acesso da aplicação - incluindo segredos e serviços internos - sem forma durável de pausar em pontos que exigem autenticação ou aprovação humana.

Interface estreita com a aplicação

O SDK avalia JavaScript ou TypeScript com tipos removidos em um contexto novo do QuickJS dentro de uma worker thread, sem caminho direto para o Node.js nem para a rede. A aplicação expõe operações selecionadas por meio de hostFunctions: funções comuns que se tornam globais chamáveis dentro do sandbox. As chamadas cruzam a fronteira por serialização, e uma função do hospedeiro pode retornar uma promise, o que permite colocar clientes de serviço existentes atrás dessa interface. No exemplo citado, o programa gerado chama store.listOrders(), enquanto o cliente do banco de dados e suas credenciais permanecem na aplicação.

Code mode na prática

O Run SDK é o módulo interno que alimenta a execução de ferramentas em modo código no AI SDK. Como uma única resposta do modelo descreve as chamadas e a lógica que as conecta, requisições podem ocorrer em concorrência e filtros ficam locais ao programa, voltando à aplicação apenas o resultado útil. O texto cita como casos adequados agentes que atuam sobre vários serviços internos, como um agente de pesquisa que combina resultados de busca antes de responder ou um agente de suporte que inspeciona uma conta sem colocar toda uma resposta de faturamento no próprio contexto. O mesmo pacote pode alimentar um interpretador de código ou um recurso que aceita transformações definidas pelo cliente.

As funções do hospedeiro funcionam melhor quando correspondem a ações do produto, como orders.refund(id), criando um ponto claro para verificar o usuário e o pedido; uma função genérica de requisição tornaria essa autoridade difícil de raciocinar.

Aprovação humana e autenticação

Ao alcançar uma operação sensível, a função do hospedeiro pode interromper a execução com getHostFunctionContext(). O resultado interrompido inclui um token assinado que a aplicação pode guardar junto com um pedido de aprovação e usar para retomar a execução quando a decisão chegar. Retomar repete o programa, mas chamadas já concluídas usam seus resultados gravados: o trabalho feito antes da interrupção não roda novamente. O mecanismo também serve a fluxos que precisam esperar autenticação - a espera pertence à aplicação, e a worker não precisa permanecer viva.

Limites de execução

Com createRunner() é possível definir limites compartilhados de tempo e memória - os exemplos citam timeout de 10 segundos e 32 MB -, também ajustáveis por execução; os padrões cobrem o heap do QuickJS e os valores que cruzam a fronteira do host. Cada invocação recebe um contexto QuickJS novo, a avaliação dinâmica fica desativada e os protótipos internos são endurecidos. Essa fronteira vale para o programa gerado: as funções do hospedeiro seguem sendo código confiável e devem manter suas checagens normais de autorização. Cargas que exigem sistema operacional, instalação de pacotes ou isolamento em nível de processo devem usar o Vercel Sandbox.

Origem do runtime

A primeira versão vivia dentro do just-bash como js-exec, baseado em QuickJS, e permitia que agentes escrevessem TypeScript contra o sistema de arquivos virtual do shell. A camada foi extraída para o Run SDK, com o ambiente em formato Node substituído por funções definidas pela aplicação. O mecanismo foi testado no eve, executando TypeScript gerado por agentes contra ferramentas reais, e agora alimenta o modo código do AI SDK, em que ferramentas existentes são mapeadas para funções do hospedeiro. O pacote exige Node.js 22.13+ ou Bun.