Envoy

Servidor MCP para TouchDesigner — 45 ferramentas permitem que assistentes de IA criem operadores, definam parâmetros, conectem fios e gerenciem projetos por meio de conversas naturais.

Documentação

Embody

Embody

crie na velocidade do pensamento.

Version TouchDesigner MCP Tools License GitHub Stars Downloads

embody.tools  ·  Documentação  ·  Manifesto  ·  Changelog


O Embody coloca suas ideias na tela tão rápido quanto você consegue descrevê-las. Operadores, conexões, parâmetros, tudo. Quer experimentar uma direção diferente? Crie uma nova abordagem em segundos. Compare tentativas lado a lado. Ramifique a partir da que funciona. A ferramenta acompanha você, em vez de o contrário.

Quatro Ferramentas, Uma Ideia

Envoyvelocidade para frente. Um servidor MCP embutido permite que Claude Code, Codex, OpenCode, Gemini, Cursor, Windsurf e GitHub Copilot (via VS Code) conversem diretamente com sua sessão TouchDesigner ao vivo. Crie operadores, conecte-os, defina parâmetros, escreva extensões, depure erros — apenas dizendo o que você quer. Sem copiar e colar código. Sem descrever sua rede no chat. Ideia → operadores em segundos.

Embodyvelocidade lateral. Marque qualquer operador e o Embody o externaliza para arquivos em disco que espelham a hierarquia da sua rede. Experimente uma nova direção, ramifique a partir de uma boa, restaure o estado de ontem — tudo em segundos. Seus arquivos externalizados são a fonte da verdade, então todo projeto já abre em fluxo.

Convoyvelocidade para fora. Nós Embody habilitados para Convoy em uma LAN confiável descobrem, inspecionam e controlam uns aos outros — uma única sessão de IA retransmitindo builds, execuções de teste, salvamentos, capturas de tela e reinicializações para todas as máquinas na sala. Um pequeno aplicativo de fundo por usuário mantém cada nó acessível mesmo com o TouchDesigner fechado. Guia do Convoy

TDNo substrato que torna tudo isso possível. Redes do TouchDesigner exportadas como YAML legível por humanos. O formato é o que permite que seu agente de IA entenda o que está na tela, o que permite que você compare uma tentativa com outra, e o que permite que uma rede se reconstrua a partir de texto na próxima abertura do projeto. O TDN é o que torna o resto possível.

Embody Manager UI

O quêPor que importa
🤖Servidor MCP Envoy62 ferramentas permitem que seu assistente de IA construa, conecte, parametrize e depure redes ao vivo. Na primeira vez que você vê isso acontecer, você para de digitar nomes de operadores manualmente para sempre.
📄Formato de Rede TDNRedes se tornam texto. Compare duas versões, revisite qualquer versão, entregue a um LLM uma imagem completa do que está na tela — tudo a partir de um único arquivo .tdn.
📦Restauração AutomáticaArquivos externalizados são gravados ao salvar, então qualquer COMP pode ser recuperado do disco. Por padrão (Export-on-Save), o .toe permanece autoritativo ao abrir; mude para o modo Roundtrip para reconstruir COMPs de estratégia TDN a partir do .tdn a cada abertura.
📤Exportação Tox PortátilExtraia qualquer COMP como um .tox autocontido com referências externas removidas. Envie uma parte do seu projeto para qualquer lugar.
🛰️Retransmissão LAN ConvoyNós Embody habilitados para Convoy em uma LAN confiável descobrem, inspecionam e controlam uns aos outros através do Envoy — retransmita execuções de teste, salvamentos, capturas de tela e reinicializações para outras máquinas a partir de uma única sessão de IA. Guia do Convoy

Início Rápido

Requisitos: TouchDesigner 2025.33070 ou posterior (Windows / macOS). Nenhuma configuração de Python necessária — o Envoy instala suas próprias dependências na primeira ativação. Nenhuma estrutura de pastas especial também: o Embody funciona em qualquer pasta de projeto, e se você usar git, cada alteração também é um diff limpo de graça.

1. Instalar

Baixe o .tox do Embody em /release e arraste-o para o seu projeto TouchDesigner. O Assistente de Configuração abre e orienta você pelas escolhas que importam — quanta autonomia o Embody recebe, o que externalizar, se deve habilitar o assistente de IA (Envoy) e para qual ferramenta, permissões, se deve participar de um Convoy em LAN confiável e onde os arquivos de configuração ficam. Nada muda até o clique final, e você pode executá-lo novamente a qualquer momento através do pulso Assistente de Configuração no COMP Embody.

Atualizando o Embody: O Embody se atualiza sozinho — pressione Verificar Atualização na página Sobre (ou defina Auto-Update para verificar na inicialização), e uma versão verificada é baixada, com backup e substituída no lugar. Suas configurações e externalizações rastreadas ficam no disco e sobrevivem à atualização intactas. Veja o guia de auto-atualização. Alternativa manual: exclua o COMP Embody antigo e arraste o novo .tox em seu lugar — a nova versão pega seu estado no disco automaticamente, sem nova varredura, sem arquivos reescritos.

2. Marque e Trabalhe

  1. Marque operadores — passe o mouse sobre qualquer COMP ou DAT e pressione lctrl duas vezes para abrir o marcador (escolha uma estratégia para um COMP, um formato de arquivo para um DAT)
  2. Trabalhe normalmente — pressione ctrl + shift + u para atualizar todas as externalizações, ou ctrl + alt + u para atualizar apenas o COMP atual. Arquivos externalizados são gravados ao salvar; ao abrir, o .toe permanece autoritativo por padrão (Export-on-Save), enquanto o modo Roundtrip também reconstrói COMPs de estratégia TDN a partir do disco

Dica: A externalização é opcional — nada é gravado em disco até que você marque. Para capturar o trabalho do seu assistente de IA automaticamente, defina Auto-Externalize New Ops (página de parâmetros do Envoy) e tudo o que ele criar através do Envoy será marcado e externalizado conforme for construído.

Para formatos suportados, configuração de pastas, tratamento de duplicatas, UI do Gerenciador e mais — veja a documentação do Embody.


Servidor MCP Envoy

O Embody inclui o Envoy, um servidor MCP embutido que dá aos assistentes de codificação de IA acesso direto à sua sessão TouchDesigner ao vivo.

Configuração

  1. Escolha um assistente de IA no Assistente de Configuração — ele abre na primeira instalação, ou execute-o novamente a qualquer momento (o pulso Assistente de Configuração no COMP Embody). Prefere parâmetros? Alternar Envoy Enable (Envoyenable) faz o mesmo com suas configurações atuais
  2. O servidor inicia em 127.0.0.1:9870 (configurável via Envoyport; se a porta estiver ocupada por outra instância, o Envoy varre para frente automaticamente)
  3. Auto-configuração — o Envoy escreve um .mcp.json (ponte STDIO, então as ferramentas estão disponíveis mesmo antes do TD estar em execução) na raiz do seu projeto de IA. Por padrão, essa é a raiz do repositório git; a etapa de localização de configuração do assistente — ou o parâmetro Aiprojectroot — pode apontá-lo para a pasta .toe ou um caminho personalizado. Projetos sem repositório git ainda recebem configuração gerada na pasta .toe
  4. Conecte — abra uma sessão do Claude Code (ou reinicie sua IDE) nessa raiz — ele pega o .mcp.json automaticamente

A configuração gerada executa o transporte STDIO em ponte do Envoy (recomendado — ele pode iniciar e reiniciar o TD para você). Se preferir conectar um cliente manualmente, o transporte HTTP direto funciona sempre que o TD estiver em execução:

{
  "mcpServers": {
    "envoy": {
      "type": "http",
      "url": "http://127.0.0.1:9870/mcp"
    }
  }
}

Ferramentas em Resumo

FerramentaO Que Ela Faz
create_opCria qualquer tipo de operador em qualquer rede
set_parameterDefine valores, expressões ou modos de ligação em qualquer parâmetro
connect_opsConecta operadores entre si
execute_pythonExecuta Python arbitrário na thread principal do TD
export_networkExporta redes para YAML .tdn comparável
create_extensionEstrutura uma extensão completa (COMP + DAT + conexões)
get_op_errorsInspeciona erros em qualquer operador e seus filhos

...e mais 55. Veja a referência completa de ferramentas.

Quando o Envoy inicia, ele sempre gera um arquivo AGENTS.md na raiz do seu projeto com padrões de desenvolvimento TD e orientação específica do projeto. Ele também escreve uma configuração específica do cliente para o assistente que você selecionar no parâmetro Aiclient (CLAUDE.md + .claude/ para Claude Code, opencode.json + .claude/ para OpenCode, regras do Cursor/Windsurf, instruções do Copilot, GEMINI.md para Gemini; Codex e OpenCode leem AGENTS.md diretamente). Para OpenCode e configurações de modelo local, veja o guia Modelos Locais e Clientes Abertos.


Formato de Rede TDN

TDN (TouchDesigner Network) é o formato de arquivo que torna o resto do Embody possível. Ele exporta uma rede de operadores inteira — operadores, conexões, parâmetros, layout, anotações, conteúdo de DAT — como um único arquivo YAML legível por humanos. Seu agente de IA pode lê-lo. Você pode lê-lo. Qualquer ferramenta de texto pode compará-lo. A rede pode se reconstruir a partir dele.

Este é o substrato. Todas as outras capacidades — construção orientada por IA, controle de versão, restauração automática — são construídas sobre ele.

  • Projeto inteiro: ctrl + shift + e
  • COMP atual: ctrl + alt + e
  • Via Envoy: ferramentas MCP export_network / import_network

Veja a especificação completa do TDN para detalhes do formato, processo de importação e garantias de ida e volta.


Atalhos de Teclado

AtalhoAção
lctrl + lctrlMarca ou gerencia o operador sob o cursor
ctrl + shift + uAtualiza todas as externalizações
ctrl + alt + uAtualiza apenas o COMP atual
ctrl + shift + rAtualiza o estado de rastreamento
ctrl + shift + oAbre a UI do Gerenciador
ctrl + shift + cCopia o COMP selecionado para a área de transferência como um envelope TDN portátil
ctrl + shift + eExporta o projeto inteiro para arquivo .tdn
ctrl + alt + eExporta o COMP atual para arquivo .tdn

Estes são os padrões — todo atalho é editável na página de parâmetros Shortcuts do COMP Embody (digite uma combinação, ou pressione Record e tecle; vazio desativa). Veja Atalhos de Teclado.


Onde os arquivos externalizados vão

O Embody grava arquivos externalizados relativos à sua localização .toe, espelhando a hierarquia da sua rede — nenhuma estrutura de pastas especial necessária:

my-project/              ← project folder (optionally a git repo)
├── my-project.toe       ← your TouchDesigner project
├── base1/               ← externalized operators
│   ├── base2.tox        ← COMP (TOX strategy)
│   ├── base3.tdn        ← COMP (TDN strategy — diffable YAML)
│   └── text1.py         ← DAT
└── ...
Registro de Logs

O Embody fornece um sistema de registro de logs com múltiplos destinos:

  • Registro em arquivo (padrão): dev/logs/<project_name>_YYMMDD.log, com rotação automática a 10 MB
  • FIFO DAT: Entradas recentes visíveis no editor de rede do TD
  • Textport: Habilite o parâmetro Print para ecoar logs
  • Ring buffer: Últimas 200 entradas via ferramenta MCP get_logs do Envoy
op.Embody.Log('Something happened', 'INFO')
op.Embody.Warn('Check this out')
op.Embody.Error('Something broke')
Testes

O Embody inclui 125 suítes de teste (3.719 testes) cobrindo externalização central, ferramentas MCP, formato TDN, servidor/ponte Envoy, geração de inicialização/configuração, caminhos de instalação/desinstalação, auto-atualização, ganchos de lançamento, leitura de status e catálogos de paleta. Os testes rodam dentro do TouchDesigner usando um executor de testes personalizado com isolamento de sandbox. Suítes destrutivas de projeto inteiro são segregadas e executadas apenas via RunDestructiveTests com proteção de salvamento.

op.unit_tests.RunTests()                              # All tests (non-blocking)
op.unit_tests.RunTests(suite_name='test_path_utils')   # Single suite
op.unit_tests.RunTestsSync()                           # All in one frame (blocks TD)

Via Envoy MCP: use a ferramenta run_tests. Veja a documentação completa de testes para detalhes de cobertura e como escrever novos testes.

Solução de Problemas
  • Timeline Pausada: O Embody requer que a timeline esteja em execução. Um erro aparece se estiver pausada.
  • Operadores Clone/Replicant: Não podem ser externalizados. O Embody avisa se você tentar marcá-los.
  • COMPs Engine: COMPs Engine, time e annotate não são suportados para externalização. Para mais informações, consulte Solução de problemas.

Histórico de Versões

Consulte o registro de alterações completo para obter o histórico detalhado de versões.

Lançamentos recentes:

  • 6.0.246: a v6.0.245 corrigiu um parâmetro onde a categoria inteira estava quebrada -- a leitura de status precisa de AMBOS nodeview e opviewer, e afirmar opviewer sozinho a deixa acinzentada e inerte, então essa versão ainda se apresentava como um no-op. O conjunto não é mais escolhido manualmente: uma instalação correta carrega 25 parâmetros embutidos definidos fora de seus padrões TD, o exportador registra todos eles no manifesto da versão, e o atualizador afirma o que quer que o build declare -- então um parâmetro adicionado em uma versão futura é carregado automaticamente. Isso também fecha um caso mais silencioso do mesmo bug: ext*object são parâmetros embutidos, então um build que ADICIONASSE uma extensão a teria instalado e nunca carregado. Modos viajam com valores (w/h são enviados vinculados; atribuir .val os achataría silenciosamente em constantes). Os testes agora afirmam o resultado em vez da suposição que foi enviada quebrada.
  • 6.0.245: Uma atualização podia instalar um novo recurso e nunca deixá-lo aparecer -- o recarregamento no local preserva cada valor de parâmetro ativo, o que mantém suas configurações através de uma atualização, mas também preservava parâmetros de propriedade do build. opviewer chegou com a leitura de status na v6.0.233, então todo usuário atualizando de um build mais antigo obteve a nova visualização de status instalada e nunca exibida: o nó continuava mostrando o painel do gerenciador antigo enquanto a página Sobre lia a nova versão, e a atualização parecia não ter sido executada (relatado em campo em uma atualização v6.0.152 -> v6.0.244). Embutidos de propriedade do build agora são reafirmados a partir do novo build, e somente quando o build realmente envia o que eles apontam. O mesmo recarregamento que preserva valores também deixou órfãs configurações que builds mais novos haviam aposentado, então o manifesto da versão agora declara os parâmetros que um build envia e o atualizador remove qualquer coisa ausente dele -- dizendo exatamente quais configurações foram embora. O valor de um parâmetro personalizado ainda nunca é reescrito por uma atualização; nove testes fixam todo o contrato.
  • 6.0.244: As próprias regressões da v6.0.243, encontradas colocando um painel de revisão adversarial sobre ela -- a varredura suja em blocos executava uma varredura completa da tabela por bloco (desfazendo parte de sua própria vitória), morria permanentemente e silenciosamente se a impressão digital de qualquer COMP aumentasse, reiniciava do zero em cada Atualização, então clicar pelo gerenciador podia impedi-la de terminar, e continuava rodando depois que TDN era desligado. Um salvamento também podia registrar SUCESSO e retornar verdadeiro sem linha de rastreamento. Além de um bug latente que precede 243: a limpeza de linhas duplicadas agrupava em type (o tipo OP, idêntico em ambas as linhas) em vez de strategy, então um COMP externalizado como ambos .tox e .tdn tinha uma de suas linhas de rastreamento silenciosamente excluída em cada Atualização. Envia menor que 243 -- a regra de manter o mais recente é um helper em vez de dois, células de posição se fundem na escrita de linha existente do salvamento, e um ramo morto se foi -- com uma nova suíte cobrindo a varredura adiada, o escritor de linhas e a semântica de linhas duplicadas.
  • 6.0.243: O flash do prompt de comando se foi, e o salvamento que o causava é ~4x mais rápido -- TouchDesigner é um processo GUI sem console, então cada chamada subprocess de dentro dele fazia o Windows alocar e destruir uma janela de console real; o distintivo laranja "não confirmado" do gerenciador pergunta git status em cada Atualização, então cada salvamento piscava uma janela preta vazia (a saída já passava por um pipe). Todos os nove locais restantes de spawn no lado TD agora passam CREATE_NO_WINDOW, protegidos por uma nova suíte que falha em qualquer spawn futuro sem ele. A criação de perfil do salvamento então encontrou ~99% de um salvamento de COMP vazio era contabilidade: a varredura de arquivos obsoletos rglobava a pasta inteira do projeto antes de filtrar para uma subárvore (~150-200ms -> alguns ms; exportações de projeto inteiro inalteradas), a limpeza de linhas duplicadas re-escaneava cada linha uma vez por caminho (504.7ms -> 6.9ms), a busca de estratégia executava uma varredura completa da tabela por COMP (82.8ms -> 18.3ms), e a verificação de caminho duplicado sondava o armazenamento de tags TD uma vez por tag conhecida por operador onde uma leitura bastava. A varredura de impressão digital TDN do projeto inteiro, 255ms em um quadro, agora é dividida em blocos entre quadros. Salvamento TDN vazio 306ms -> 95ms; Atualização 724ms -> 44.5ms.
  • 6.0.241: Dois bugs TDN relatados em campo, ambos reproduzidos ao vivo antes de uma linha ser escrita -- um "Recarregar tdn" individual deixava filhos externalizados aninhados como cascas vazias cujas impressões digitais obsoletas deixavam a próxima exportação automática sobrescrever o bom .tdn do filho com uma rede vazia (a importação agora restaura cada casca aninhada de seu próprio arquivo na mesma passada, e exportações automáticas recusam sobrescrever um arquivo não vazio de um COMP vazio); e um fio na entrada 2 de um operador de conector fixo exportado na posição 0 e reimportado na entrada 0 -- o exportador agora enumera conectores reais, produzindo os arrays nulos esparsos que a especificação sempre documentou, com a mesma correção aplicada aos get_op/get_connections do Envoy para que agentes finalmente vejam índices de conector verdadeiros.
  • 6.0.240: A recuperação de reino ganha sua direção que faltava -- o Resolve da v239 só podia MANTER o reino desta máquina, mas o caso de campo é uma máquina cujo próprio reino é o errado; "Juntar-se a " adota um reino anunciado ao vivo através de uma sequência que nunca passa por um instante não vinculado, recusa ids sem evidência, mostra nomes de host DNS reversos para as máquinas pedindo para serem juntadas, e religa o projeto atual no mesmo clique confirmado. Validado em campo de ponta a ponta em uma LAN de duas máquinas.
  • 6.0.239: O bug do reino dividido, causa raiz encontrada e fechado -- uma única transmissão UDP de qualquer host não admitido na sub-rede podia travar permanentemente um daemon em local_realm_conflict; reinos confirmados agora se movem apenas com evidência de um par admitido, registros estrangeiros recusam sem envenenar o estado, a janela de escuta da gênese é randomizada como projetado, toda transição de reino audita sua fonte, e Resolve Realm Conflict... dá à trava uma saída que nunca teve.
  • 6.0.237: A primeira sessão diz a verdade -- uma instalação nova via o Envoy ficar vermelho no meio de sua instalação única de dependências (a permanência da trava é por operação agora), "Verificar e Notificar" nunca verificava até a segunda sessão (o caminho de instalação nova agenda a verificação de inicialização), e um Ctrl+S deixava o contador "Salvo" alegando trabalho de horas atrás (o hook pós-salvamento o carimba).
  • 6.0.235: Um layout de status, mínimo por design, e nada nele que não seja verdade -- três linhas onde as marcas SÃO a leitura, texto ~65% maior na mesma largura de painel, uma linha de versão vermelha apenas quando uma atualização está genuinamente esperando ou falhou, e um daemon Convoy rodando que não pode mais ser relatado como uma instalação falha.
  • 6.0.234: A leitura de status para de relatar trabalho que não está acontecendo, e o assistente de configuração para de comer seu primeiro clique -- três linhas (o salvamento automático, Convoy e o passo do projeto atrás deles) caíram para um padrão RODANDO para estados que significam concluído, parado ou nunca iniciado, então uma instalação nova desenhava uma marca de ocupado permanente e um Convoy parado deixava um relógio subindo ao lado de trabalho que não estava acontecendo; a linha de salvamento automático agora responde há quanto tempo o trabalho chegou ao disco, semeada na inicialização a partir da escrita rastreada mais recente e medida contra o calendário em vez de dobrada em um relógio de 24 horas. O cartão de salvamento do assistente abria seu modal de dentro do callback de clique, que engole o mouse-up e fazia cada primeiro Avançar um no-op -- quebrado desde a v6.0.204, trinta builds; todo modal do assistente agora espera o mouse-up real. A visualização de barras de inicialização é removida em favor de uma visualização de status para toda a sessão (o módulo vai de 1.691 linhas -> 1.076), levando o registro de passo publicado somente-escrita junto, e toda ação de host Convoy agora nomeia um spawn de processo filho bloqueado em vez de vazar um OSError bruto.
  • 6.0.233: O nó Embody diz o que o projeto está fazendo, o trabalho do agente é realmente checkpointado, e uma instalação nova para de falhar o Convoy no caminho -- o visualizador do nó carrega uma leitura de status ao vivo que nunca fabrica uma porcentagem, computada uma vez por evento em vez de 60 vezes por segundo (um painel estável cozinha zero vezes; uma mudança de status custa ~0,65 ms); execute_python e exec_op_method, que anteriormente não armavam nenhum checkpoint de salvamento automático, agora armam um grosseiro; habilitar Convoy espera o ambiente Python que o Envoy ainda está construindo em vez de correr contra ele e falhar; um trabalhador Convoy de longa duração não morre mais no desmonte de módulo que um salvamento produz; um TouchDesigner que não pode gerar processos filhos é relatado como tal em vez de culpar seu Python; e um Embot ao vivo ainda podia alcançar um .tdn através da exportação assíncrona de projeto inteiro, agora fechado de ambas as caminhadas.
  • 6.0.222: Uma revisão de 219/220 encontrou um defeito de perda de dados na própria versão -- o ceifador podia excluir um registro de entrega que ele meramente falhou em abrir (um handle de antivírus, exaustão de fd, um rename concorrente), incluindo o indeterminate não reconhecido que é a única prova de pode-ter-executado. Corrupção agora deve ser provada e um registro comprovadamente corrompido é colocado em quarentena em vez de excluído. Além disso: tudo que o App Convoy escreve é liberado antes do rename que o publica; duas maneiras silenciosas do loop de reconciliação parar até o TD reiniciar; o texto de ajuda e a linha de log do botão agora correspondem ao contrato que o código aplica; e os dois caminhos da correção 219 que o teste de mutação mostrou estarem não testados.
  • 6.0.220: Atualizar o Embody pode atualizar o App Convoy sem reiniciar o TouchDesigner -- a atualização automática do daemon é orçada em uma tentativa por sessão TD, e ambos os seus guardas vivem em um armazenamento de sessão que sobrevive ao COMP Embody ser substituído. Então uma atualização em uma sessão ao vivo nunca podia atualizar o daemon: novo Embody, daemon antigo, nenhuma das correções para as quais foi atualizado. O orçamento agora também é chaveado na versão do Embody, então uma atualização rearma exatamente uma tentativa sem reabrir o loop de repetição. Verificado ao vivo: uma instalação nova levou o daemon desta máquina de 6.0.212 para 6.0.220 por conta própria.
  • 6.0.219: Linhas de nó duplicadas se limpam sozinhas -- um predicado tratava "uma entrega que não terminou" e "um resultado concluído que ninguém coletou" como a mesma coisa, e ele controlava todos os três caminhos de limpeza, então um único resultado não coletado tornava uma linha duplicada permanente (uma máquina de campo tinha 11 linhas e 123 registros de trabalho, 115 deles exatamente dessa classe). Um resultado concluído não prende mais uma linha em lugar nenhum; uma entrega enfileirada em uma identidade substituída é duravelmente recusada em vez de deixada para assombrá-la; trabalho além do limite de despacho nunca é tocado. Esquecer Nós Offline para de registrar uma recusa como sucesso, nomeia os nós que manteve e as entregas que os prendem, e restaura uma linha recusada no mesmo quadro. Dois caminhos latentes de ressuscitação de fantasma (commit-antes-write em ambos os caminhos de exclusão) fechados, e um registro de trabalho ilegível não congela mais a limpeza para sempre.
  • 6.0.217: Esquecer Nós Offline limpa os blocos no mesmo quadro -- as linhas confirmadas saem da sequência sincronamente com o clique, sem ida e volta ao daemon no caminho visual; a aplicação do daemon roda atrás puramente como reconciliação.
  • 6.0.216: O redesenho do esquecimento é real -- um esquecimento confirmado substitui o tick de reconciliação já armado (que captura seu atraso quando agenda) e arma um novo dois quadros depois.
  • 6.0.215: Esquecer Nós Offline puxa seu redesenho para frente -- um esquecimento confirmado marca o registro como devido e reduz o tick ao seu mínimo em vez de esperar o heartbeat de 30-60 s.
  • 6.0.214: Correção de alinhamento do contêiner do gerenciador -- o contêiner da UI do gerenciador justifica seus filhos ao topo.
  • 6.0.213: O Convoy App se atualiza sozinho — o daemon informa a versão do código que realmente executa; uma versão mais antiga é atualizada no local no momento em que um Embody mais novo se registra com ele (as instalações verificam o daemon que reiniciaram), e as duas últimas classes de linhas fantasmas duplicadas desapareceram: um Salvar Como em uma nova pasta aposenta a linha antiga, e a reivindicação obsoleta de uma porta recuperada é limpa.
  • 6.0.212: Diálogos legíveis — toda caixa de mensagem quebra seu texto em ~70 caracteres por linha por meio de um único ponto central (estrutura e caminhos de arquivo preservados), e Esquecer Nós Offline mostra um "tudo limpo" visível em vez de uma linha de log silenciosa quando não há nada para esquecer.
  • 6.0.211: Um projeto, uma linha — o salvamento versionado de uma sessão ativa não deixa mais um duplicado fantasma na lista de nós do Convoy (a linha antiga mantinha uma porta que pertencia ao seu próprio sucessor e aparecia como "ativa" para sempre); além disso, o novo botão Esquecer Nós Offline..., que nomeia cada linha em uma confirmação antes de remover as entradas offline desta máquina.
  • 6.0.210: op.Convoy — o COMP do convoy carrega um atalho OP global, então scripts e documentação o referenciam como op.Convoy.ext.ConvoyExt... em vez de uma cadeia de caminhos; teste de contrato fixado.
  • 6.0.209: Reparar Convoy App funciona sobre um daemon em execução (e os botões do Host App são renomeados para Convoy App) — o macOS inicializava sobre o rótulo do LaunchAgent ainda carregado (launchctl EIO 5), então reparar um host app saudável sempre falhava; o instalador agora para graciosamente o daemon antigo, remove o rótulo, espera o launchd soltá-lo e então inicializa novamente. O Windows recebe a mesma parada graciosa (o processo antigo continuava silenciosamente executando código antigo). Também: o aviso de "nenhum interpretador utilizável" dispara uma vez em vez de três, e nunca em um projeto não salvo.
  • 6.0.208: Nós obsoletos do Convoy se limpam sozinhos — a varredura de retenção do host app esquece nós cujo .toe foi excluído (após ~30 min de silêncio) e nós não vistos por 30 dias, nunca tocando em nós meramente offline ou ocupados (uma unidade desconectada nunca é lida como exclusão); a nova ferramenta convoy_forget_node conecta a rota de recuperação existente do daemon para limpeza manual imediata.
  • 6.0.207: Uma instalação nova não grava nada no disco antes de o projeto ser salvo — a pasta logs/, o catálogo .embody/, a tabela de externalizações e os arquivos de estado do projeto ficam todos adiados atrás da porta de salvamento do assistente, em vez de caírem órfãos na pasta padrão do TouchDesigner (o log de arquivo retoma na primeira linha pós-salvamento; o catálogo é liberado pós-salvamento; as adições se autocorrigem na primeira varredura). Também: os nomes dos nós do Convoy param de assar o placeholder NewProject.1 não salvo — o preenchimento do Nome do Nó espera um projeto salvo e corrige placeholders já assados no local.
  • 6.0.206: Botão salvar do assistente desatolado — o grupo de opções da etapa de salvamento nunca foi registrado no roteador central de cliques do assistente, então em um projeto novo o cartão "Salvar o projeto agora" ignorava todos os cliques e o assistente ficava travado; o grupo está conectado, o cartão de ação dispara uma vez por clique (um diálogo cancelado não reabre mais) e um teste de contrato de roteamento fixa cada grupo ao padrão do roteador.
  • 6.0.205: Rodapé do assistente fixado — as descrições de auto-dimensionamento da 6.0.204 ultrapassaram o painel fixo nas três etapas mais altas, cortando Voltar/Avançar na parte inferior; o painel agora é dimensionado para a etapa mais alta e um espaçador de preenchimento fixa o rodapé na mesma posição inferior em todas as páginas, com um novo teste de contrato que recalcula a pilha de cada etapa a partir da geometria wizard.tdn para que um painel ultrapassado falhe no CI em vez de em campo.
  • 6.0.204: O Assistente de Configuração ganha uma porta de salvamento — um projeto nunca salvo agora recebe uma etapa "Salve seu projeto primeiro" antes de todas as outras (tudo o que o assistente cria — .venv, configuração de IA, estado .embody, o repositório git — fica relativo à pasta do projeto), com Avançar bloqueado até o projeto estar no disco. As descrições do assistente agora se dimensionam, então as opções de cada página começam com o mesmo espaçamento abaixo do texto (corrige o corte da descrição do Convoy e o deslocamento da página de permissões). Cada captura de tela verificada.
  • 6.0.203: Auto-atualização funciona no macOS — toda chamada HTTPS do Python embutido do TD (verificação de atualização, download de atualização, fallback web get_docs, verificação de versão do PyPI) falhava com CERTIFICATE_VERIFY_FAILED em Macs porque esse Python não tem caminho de CA padrão; o Windows só funcionava via armazenamento de certificados do SO. Todos os quatro sites agora verificam por meio do pacote do certifi (enviado dentro do TD) carregado ao lado dos padrões do sistema — a verificação nunca é desabilitada.
  • 6.0.202: Uma cadeia de dreno morta não pode mais travar o Convoy — a segunda descoberta do teste de campo no macOS: as cadeias de polling do lado do frame que entregam resultados dos workers podiam morrer silenciosamente (exceção ou disparo de instância obsoleta) com sua flag de ocupado órfã, congelando o status do host e recusando toda alternância de política de segurança até reiniciar o TD. Todos os três slots de worker agora se recuperam em vez de recusar — drenos que travam registram seu traceback e limpam o slot, guardas entregam resultados estacionados na hora e um limite de relógio de parede de 15 minutos protege contra um worker desaparecido. Nove novos testes de contrato.
  • 6.0.201: Convoy ativa no macOS — o verdadeiro bloqueador era a validação de biblioteca do macOS (o Python assinado do TouchDesigner recusa todo módulo nativo do PyPI quando iniciado de forma autônoma; o log truncado havia sido mal interpretado como incompatibilidade de arquitetura). O Convoy agora classifica os três modos de falha do interpretador distintamente, repara apenas o que uma reinstalação pode corrigir e constrói um venv de daemon dedicado a partir de um Python fora do domínio de assinatura do TouchDesigner (Homebrew, por caminho absoluto), reutilizando-o entre instalações e nomeando-o na pré-visualização de desinstalação. Os venvs também carimbam sua arquitetura de CPU, então uma troca TouchDesigner Intel<->Apple-Silicon reconstrói o ambiente em vez de apodrecê-lo silenciosamente. Ambas as pernas do CI verdes novamente: um deadlock de socketpair no macOS, a recusa de mesmo diretório do git-LFS, um fragmento de float dependente de máquina no orçamento de leitura da ponte e três corridas de ciclo de vida de 100 ms — cada uma com causa raiz, nenhuma encoberta. 3.329 testes (118 suítes).
  • 6.0.171: Convoy retransmite trabalhos para o TouchDesigner — o dispatcher do host app agora drena sua própria fila (um estado de reivindicação dispatching, um compare-and-set para que dois dispatchers nunca executem um trabalho duas vezes, e o encaminhamento movido PARA FORA do bloqueio global para que uma retransmissão de 30 s não congele nenhuma rota), operações longas (run_tests, save_project) retransmitem de ponta a ponta por polling de trabalho de nó com o veredito do próprio nó espelhado de volta, e o TouchDesigner se registra: uma nova página de parâmetros do Convoy mais um COMP filho ConvoyExt que encontra o host app local, registra sua porta Envoy ativa, faz heartbeat e pergunta uma vez — nomeando o id de convoy que vai cunhar e o escopo que concede — antes de gravar qualquer coisa. A ponte transmite: frames enviados pelo servidor e tools/list_changed chegam ao cliente conforme chegam, em vez de morrerem em um buffer, e toda resposta cortada agora responde ao cliente (duas formas eram hangs silenciosos em todas as versões enviadas). Dez rodadas de revisão adversarial em quatro fatias encontraram 40+ defeitos reproduzidos por sonda. Também corrigido: raise SkipTest em setUp sempre foi contado erroneamente como ERROR pelo executor de testes. 2.895 testes (114 suítes).
  • 6.0.169: O Modo Perform não luta mais contra o watchdog de atividade do Envoy — entrar no Modo Perform para o Envoy, mas deliberadamente deixa Envoyenable ligado, e o watchdog lia esse estado habilitado-mas-abaixado como uma interrupção: ele revivia o servidor ~4-12 s em cada performance e sobrescrevia a leitura de status Perform Mode com Reviving (watchdog).... O Modo Perform agora é uma condição de inatividade de primeira classe do watchdog, controlada pela autoridade de par ativa (nunca pela string de status), Start() recusa durante o Perform e — da revisão adversarial da própria correção — um início em andamento não pode mais cruzar uma entrada de Perform: todas as três pesquisas de inicialização honram o Perform, derrubando um worker que se vinculou no meio da entrada em vez de declarar Running sobre o show. Os hooks de saída de thread foram unificados no mesmo helper de autoridade, cujo modo de falha (erros leem False) nunca pode desabilitar a autocura. Também: arquivos TDN exportam com finais de linha LF (o escritor fixou newline='\n', fechando a mesma classe de churn que a v6.0.168 corrigiu para regras geradas). Doze novos testes de watchdog, incluindo as portas de polling e o fio de autoridade não-stubado. 2.516 testes (112 suítes).
  • 6.0.168: Sem mais mudanças fantasma no git dos próprios arquivos gerados do EmbodyPath.write_text() padrão para newline=None, traduzindo finais de linha para CRLF no Windows, então write_template reescrevia toda regra e habilidade gerada com CRLF em cada deploy enquanto .gitattributes declara *.md eol=lf. Isso produzia uma fileira permanente de badges M com um git diff VAZIO (o atributo eol normaliza na comparação, então git status e git diff discordam) — e em um projeto de usuário sem .gitattributes, o CRLF era commitado e causava churn contra colaboradores macOS/Linux. Dez locais de escrita agora fixam newline='\n' (write_template, os escritores CLAUDE.md/ENVOY.md, ambos os manifests JSON, os editores .gitignore/.gitattributes), e os nove arquivos já em CRLF foram normalizados uma vez. Escopo deliberadamente limitado aos próprios escritores do Embody: 103 arquivos rastreados carregam CRLF de edição comum no Windows, mas são inertes porque nada os regenera. 2.504 testes (112 suítes).
  • 6.0.166: Fluxo multiagente — um livro-razão de tarefas compartilhado (announce_task/update_task, .embody/tasks.json) dá a sessões de IA paralelas ESTADO de trabalho, não apenas presença: done_uncommitted marca trabalho concluído sentado não-commitado na árvore (nascido de uma leitura errada real na mesma manhã — um recurso concluído segurava o lote de outra sessão porque nada compartilhado registrava a conclusão), entradas ativas andam em get_sessions, e preflight_landing avisa antes que alguém aterrisse sobre trabalho concluído não-commitado. Operações longas viram trabalhos em segundo plano à prova de reinício (run_tests background=True, novo save_project, get_job_status): handles retornam imediatamente e resultados estacionam em .embody/jobs/, sobrevivendo aos reinícios de servidor que cortaram chamadas síncronas duas vezes em um dia. Além disso: o rodapé de efeito de escrita para de contar os avisos /ui do próprio TD como seu dano, e o smoke de instalação nova roda totalmente headless (o harness dirige o backend do Assistente de Configuração em vez de travar em seu painel). Ferramentas 56 → 60. 2.542 testes (112 suítes).
  • 6.0.165: Cinco recursos de experiência do agente de um teardown de concorrente — uma auditoria completa em nível de código de um plugin rival de IA para TD revelou cinco lacunas reais, fechadas aqui sem adotar sua telemetria, patch em arquivos do sistema ou manipulação de prompt em tempo de execução. get_guidance finalmente serve as regras e habilidades deste projeto (36 documentos) via MCP, para que agentes Codex/Cursor/opencode recebam a mesma doutrina TouchDesigner que o Claude Code carrega, em vez de apenas esquemas de ferramentas. get_focus reporta a rede do painel, seleção, operador atual e rollover com uma regra explícita de desambiguação ("este operador" é o op SELECIONADO, nunca o rollover incidental). Chamadas de ferramentas mutáveis agora retornam um bloco _effects nomeando erros e avisos que NÃO existiam antes da chamada, além de uma queda significativa de fps — comparado a uma linha de base por sessão, autodesabilitando se a varredura exceder seu orçamento de tempo, e lendo o Perform CHOP apenas quando ele já existe, para que uma escrita nunca crie um monitor como efeito colateral. O assistente de configuração agora oferece externalização (projeto inteiro / apenas novo trabalho / não agora), bloqueado para recusar sem um ponto de recuperação .toe salvo e roteado pelo ExternalizeProject() existente para que seu diálogo de confirmação ainda se aplique. E iniciar um agente CLI semeia seu prompt inicial uma vez por projeto, posicionalmente (nunca -p, que responderia uma vez e sairia), com editores GUI intocados. Adicionar duas ferramentas acionou test_version_sync, que pegou um badge README que um grep de tabela de recursos perdeu. 2.516 testes (110 suítes).
  • 6.0.162: MCP SDK 2.0 — o lançamento noturno 2.0.0 do SDK removeu mcp.server.fastmcp e quebrou toda instalação nova (issue #81: a especificação de dep do Embody não tinha teto, então novos venvs resolveram 2.0.0 sob código 1.x; o gate de importação verificava apenas mcp.server, que o 2.0 ainda fornece, então a falha surgiu como uma tempestade de reinicialização de 30 minutos). O Envoy agora roda nativamente em MCPServer — verificado contra o wheel real no Python exato do TD: ferramentas, prompts, capturas Image, esquemas Optional[Literal], rejeição de rebinding DNS e handshakes de clientes de revisão antiga passam, então sessões existentes do Claude Code continuam funcionando. O pin é um intervalo (mcp>=2.0.0,<3), e venvs agora se auto-atualizam: cada instalação carimba o venv com sua especificação de dep + Python; qualquer lançamento que mude um pin auto-atualiza todos os venvs existentes no próximo início (um bump de Python do TD reconstrói via uv venv --clear), e atualizar uma sessão ativa recusa com um honesto "reinicie o TouchDesigner para concluir a atualização" em vez de importar uma pilha mista que pode abortar() o TD. Também: o limite silencioso de 4 MiB do corpo de requisição do 2.0 foi elevado para 64 MiB (payloads grandes de import_network não se disfarçam mais como conexões perdidas), e seu efeito colateral logging.basicConfig (handler de stderr raiz em INFO, em todo o processo) é desfeito para que o textport permaneça limpo. 2.424 testes (108 suítes).
  • 6.0.160: Duas proteções que estavam silenciosamente desligadasis_pid_alive usava OpenProcess sozinho, mas um objeto de processo do Windows (e seu PID) permanece alocado enquanto qualquer handle para ele estiver aberto, então processos encerrados leem como vivos para sempre: linhas de registro mortas nunca eram podadas, o basename nunca era reivindicado, e cada relançamento cunhava outra instância -2/-3 enquanto pontes perseguiam um cadáver (heartbeats encalhados também permaneciam como peers fantasmas). Um WaitForSingleObject com timeout zero distingue sinalizado-ao-sair de em execução. Separadamente, o _running do runner de testes era estado de instância, então editar qualquer fonte syncfile'd durante a execução reconstruía a extensão e desarmava a supressão de diálogo — um modal real "Embody — Uninstall" escapou para o usuário, e uma vez clicado parou o servidor Envoy ao vivo; agora é apoiado por armazenamento com um TTL atualizado. Seis chaves de runtime adicionais (incluindo _smoke_test_responses, que teria respondido automaticamente a modais reais) pararam de vazar para .tdn commitado, agora aplicado por um teste invariante em vez de uma lista mantida manualmente. Suítes de clipboard pulam alto em contenção de clipboard do SO em vez de culpar o watcher, e o smoke de instalação nova espera por um estado terminal do Envoy e escreve um veredito explícito. 2.407 testes (108 suítes).
  • 6.0.159: Triagem de relatório de camporemove_externalization_tag era uma ferramenta MCP MORTA desde v6.0.154 (seu wrapper sempre encaminhava delete_file; o handler aceitava apenas op_path, então toda chamada retornava um TypeError) e foi lançado através de duas versões verde, porque nenhum teste jamais invocou um wrapper de ferramenta registrado — agora corrigido e permanentemente protegido por uma suíte de conformidade de esquema de ferramenta que verifica todas as 54 ferramentas para três direções de deriva wrapper/handler. Fechou uma deleção silenciosa de .tdn em cada salvamento: checkOpsForContinuity usava um op() puro, que não pode resolver um annotateCOMP de utilidade, então uma linha legada em uma anotação lia como um operador desaparecido. Exportação de sequência TDN agora descobre via target.seq (descoberta baseada em pars perde sequências em um POP não cozido) e não pode mais emitir um name: [] não importável. Além disso, consolidação de cabeçalho duplicado .gitignore, duas migrações de configuração silenciosas que nunca rodaram, e um flag crash_detected que ficou preso para sempre após um relançamento externo do TD. 2.400 testes (108 suítes).
  • 6.0.157: Roteamento de ponte por sessão — a ponte de cada sessão fixa a uma instância TD por nome (churn de registro não pode re-mirar; a mudança de porta de uma instância fixada ainda se auto-cura), switch_instance move apenas a sessão chamadora (all_sessions=true + active_epoch para o movimento explícito de usuário inteiro), e o registro é adotar-se-vago — uma instância nova não pode mais puxar a ponte de toda sessão viva (verificado ao vivo: segunda instância registrada, cinco sessões, zero pontes movidas). Tarefas de worktree obtêm reivindicações duráveis (sobrevivem à morte da sessão + reinícios do Envoy, visíveis via get_sessions.worktrees) e a nova ferramenta preflight_landing verifica um diff de worktree contra sujeira da árvore principal, território de pares e estado TDN não salvo antes de aterrissar. Guarda de desfazer-bloqueio auto-cura um par begin/end cortado. 2.357 testes (104 suítes).
  • 6.0.156: Revisão do contexto de orientação de IA — as regras mais pesadas sempre carregadas tornam-se invariantes enxutos com receitas completas realocadas nas habilidades sob demanda que carregam no ponto de uso (/create-operator ganha a receita canônica de posicionamento e cobre toda criação/movimento; /td-api-reference ganha padrões de referência, pegadinhas de modelo de cozimento e uma seção de Segurança de Build Pesado), cortando o contexto residente ~50%. Docstrings de ferramentas do Envoy agora declaram seus pré-requisitos de habilidade e 7 parâmetros tornaram-se enums Literal aplicados por esquema (valores documentados inalterados). Uma auditoria de conflito em nível de linha com 5 revisores corrigiu 11 derivações em regras/habilidades (glslMAT ancora vertex/pixel/info, modelo de cozimento dependente de tempo, exemplos de caminho absoluto, redação YAML do TDN, project.dirty -> project.modified, ...). Harness de smoke falha alto em limpeza bloqueada. 2.337 testes (104 suítes).
  • 6.0.154: Exportações TDN grandes ganham diálogo de progressoExportNetworkAsync (atrás do botão de exportação da barra de ferramentas, o atalho de exportação e a exportação TDN de projeto inteiro) agora abre uma pequena janela centralizada para exportações de >= 500 operadores: título, uma linha de status ao vivo N / total operators (pct), uma barra de progresso e um botão Cancelar (consumido no próximo limite de lote — nenhum arquivo escrito, worker desenrola limpo). O trabalho já era agrupado em frames (agora ajustável via batch_size), então o TD permanece responsivo — verificado ao vivo em 10.260 operadores (manteve 60fps) e uma rede pesada de conteúdo de 3.060 ops que serializou para um .tdn de 3 MB, onde uma exportação síncrona bloqueia ~1,5s. O frame de conclusão não empilha mais teardown de janela + rastreamento + reconstrução de lista (rajada de queda pós-exportação desapareceu). Além disso, duas correções de untag: TDN untag não deixa mais uma linha fantasma (remove_externalization_tag roteia via RemoveTDNEntry, limpando a linha da tabela + breadcrumb _tdn_rel_path que a varredura de atualização continuava ressuscitando; novo flag delete_file, desligado por padrão), e externalize_op reporta o nome de arquivo .tdn real para tag_type='tdn'. 2.337 testes (104 suítes).
  • 6.0.153: Scanner de porta do Envoy sobrevive a um TD zumbi segurando uma porta_findAvailablePort agora testa candidatos com um bind() real em vez de um connect() TCP. Um TouchDesigner sem janela pode segurar uma porta vinculada + LISTENING com um loop de accept morto, então conexões são recusadas (sonda antiga lia "livre") enquanto o bind() do uvicorn ainda falha com WinError 10048 — e o loop de retry re-eleita a mesma porta envenenada por toda a janela de 30 min (observado: um segundo .toe em um repo crash-loopava em uma porta que uma instância de dev de horas ainda acampava). A sonda de bind faz exatamente o que o uvicorn faz, então um listener morto não pode enganá-la (e elimina o timeout de conexão de 1s por porta ocupada). Além disso, uma blacklist de falha de bind de 10 minutos para que uma corrida sonda/bind avance para a próxima porta em vez de loopar; um bind confirmado a limpa. 2.327 testes (103 suítes).
  • 6.0.152: Hooks de lançamento para Export Portable Tox (issue #74) — pre_release roda em uma cópia temporária encenada (modelo do Private Investigator: moldar o artefato, comp vivo intocado, código de hook nunca é enviado), post_release roda no original após o salvamento com o caminho + flag de sucesso; pré-hooks falhos mantêm a cópia encenada para inspeção. OpenCode é um cliente de IA de primeira classeopencode.json gerado spawna a mesma ponte STDIO, carrega as regras geradas e desinstala limpo; nova página de docs Modelos Locais & Clientes Abertos. Assistente de configuração pergunta sobre git (inicializar ou pular — sem mais manuseio silencioso) e lista OpenCode. ReleaseAll() exporta em lote todo componente rastreado com hook; alternância Mostrar Pars Integrados (Avançado) revela as páginas de parâmetros do TD. localhost127.0.0.1 em todas as superfícies enviadas/máquina. 2.321 testes (103 suítes).
  • 6.0.149: Controles de Auto-Update movidos para a página SobreAutoupdate/Checkforupdate/Updatestatus agora ficam com as informações de versão (quebra de seção abaixo de Data), devolvendo Avançado à sua forma focada. Comportamento inalterado. 2.225 testes (101 suítes).
  • 6.0.148: Diálogo de parâmetros apenas com páginas personalizadas (o padrão POPX) — showCustomOnly no Embody COMP mostra as 9 páginas Embody em vez dessas mais as páginas integradas Layout/Panel/Look/... do TD (ainda funcionais, apenas filtradas); aplicado em EmbodyExt.__init__ para que instalações existentes convirjam após atualizar. Referência de Parâmetros sincronizada com a verdade para a ajuda de par do componente (padrão Update Status é Disabled). 2.225 testes (101 suítes).
  • 6.0.147: Diálogo de atualização disponível enxuto — par de versões, link de notas de lançamento, Instalar / Não Agora; o corpo de notas de 600 caracteres embutido desapareceu (um prompt sim/não é uma decisão, não uma tarefa de leitura). Renderiza a partir do updater instalado, então se aplica a verificações feitas na v6.0.147+. 2.223 testes (100 suítes).
  • 6.0.146: Update Status nunca está em branco — permanece em Disabled sempre que Auto-Update está Desligado: em uma instalação nova (v6.0.145 enviou um campo vazio, que lia como quebrado), em cada abertura de projeto (substituindo resultados obsoletos de sessões com verificações ligadas), e no momento em que a preferência é alternada. Smoke de instalação nova .tox agora é uma etapa de lançamento obrigatória — a falha que enviou o campo vazio. 2.223 testes (100 suítes).
  • 6.0.145: Anotações nunca são externalizadas por operação (relatório externo: todos os quatro problemas verificados e corrigidos) — anotações criadas por código podiam ser varridas para limites falsos de TDN/fonte por operação, cuja reconstrução destruía os internos gerenciados por TD do widget (erros de cook float(None)) e deixava arquivos órfãos; a marcação agora recusa anotações e seus interiores em todas as camadas, linhas legadas ficam inertes com re-verificações em cold-open, e create_annotation cria utility=True (paridade com TD-UI — verificado ao vivo que varreduras não conseguem ver subárvores de utilitários). Todo caminho de operação da ferramenta Envoy resolve anotações de utilitários via um resolvedor compartilhado (~34 ferramentas; delete_op não diz mais "Operator not found" em um caminho get_annotations que acabou de listar), e a exclusão de anotações é durável (purga + checkpoint removem a entrada semântica; sem mais ressurreição — exclua via delete_op, nunca via .destroy() bruto). Self-update incluído: controlado por manifesto (embody-release.json: sha256/tamanho/min_td_build), download em segundo plano + verificação, backup + rollback, configurações preservadas — Autoupdate padrão Desligado. Correção do gate de salvamento em teste destrutivo (project.modified; project.dirty não existe no TD 2025). Revisão adversarial de 5 lentes + smoke test de reinício cold-open. 2.220 testes (100 suítes).
  • 6.0.141: O congelamento do MCP create_op do Issue #57 corrigido na sua causa — no TD 2025.32460 de um relator, a primeira chamada mutante de uma sessão travava permanentemente a thread principal do TD (verificado por dump: trabalho do editor viz no mesmo frame da mutação de rede); dois gates de ativação agora garantem que a resposta do MCP seja entregue antes de qualquer trabalho do editor Embot/câmera, e a primeira ativação após dormência apenas pisca a cor do nó (nova suíte test_envoy_viz_gates; painel adversarial: sem defeitos). Avisos de conteúdo bloqueado do TDN colapsam em um diálogo combinado com preferência "Não mostrar novamente" (Tdnlockedwarn). Badges sujos não desaparecem mais após edições no código-fonte da extensão (cache de fingerprint sobrevive à reinicialização). O filtro do gerenciador ganha uma palavra-chave dirty + expansão forçada. Diffs de git .tdn são seguros para UTF-8, e o armazenamento em runtime (git_status, expand_order, _tdn_fingerprints, _suppress_dialogs) fica fora das exportações .tdn. 2.171 testes passando (98 suítes).
  • 6.0.138: Nova skill incluída /brief — um compilador de briefs de tarefa: /brief <conversational request> transforma inglês simples em um contrato revisável em briefs/ (as skills a carregar, âncoras descobertas ao vivo, critérios de sucesso verificáveis, gates de performance/multi-sessão/worktree) do qual o trabalho então executa — portável para sub-agentes e sessões novas; incluída nos projetos do usuário como a 14ª skill, com uma seção Task Briefs no CLAUDE.md gerado. Launch AI Client agora percorre a instalação de uma CLI ausente no terminal aberto — o comando oficial por SO na sua própria linha de copiar/colar, correto para shell zsh e cmd.exe (test_launch_aiclient 29 → 42). Novo gate de sincronização: toda entrada de template-map deve resolver para um DAT de template vivo e não vazio (uma lacuna de envio silencioso pega na revisão). 2.142 testes passando (93 suítes).
  • 6.0.136: Correções de triggers de recarga externa-tox no TD 2025reloadtoxpulse não existe no TD 2025 (o passe de reconciliação abortava em tdAttributeError), alternar enableexternaltox de desligado→ligado não relê o .tox (o "Reload from disk" do gerenciador era um no-op silencioso), e definir externaltox no meio da sessão não carrega automaticamente (RestoreTOXComps restaurava shells vazios). Todos os três caminhos agora pulsam enableexternaltoxpulse (verificado empiricamente em 2025.32820 + 2025.33070), restaurações falham alto via externalTimeStamp (um shell morto é destruído, nunca mantido silenciosamente onde um salvamento posterior poderia exportá-lo vazio), e ReconcileMetadata protege cada linha. Causa raiz encontrada durante a investigação de restauração de tox obsoleto, que estabeleceu que no TD 2025 o arquivo externalizado vence sobre snapshots de DAT embutidos em tox em todo caminho de carga. Nova suíte TestTOXRestoration (6 testes); smoke test de instalação limpa a partir do .tox incluído. 2.123 testes passando (97 suítes).
  • 6.0.135: O diálogo de Skip/Re-scan do upgrade sumiu — soltar um novo .tox em um projeto existente agora valida operadores rastreados silenciosamente (migração de schema, normalização de caminho, continuidade por linha, re-exportação apenas de sujos) em vez do antigo "Re-scan", que deletava todo arquivo rastreado e re-exportava o projeto inteiro em um único frame síncrono — um congelamento de minutos em projetos grandes com uma janela de crash de zero arquivos no disco. Uma reconstrução completa continua disponível via Disable → Enable, que revela a exclusão. Build mínimo do TD agora é 2025.33070. Nova suíte de regressão test_verify_upgrade; 2.122 testes passando (97 suítes).
  • 6.0.134: Congelamento de scan de paleta no primeiro launch do TD 2025.33070 (carregar geoPanel.tox/chromaKey.tox pode travar o loop de frames do novo build dentro de um frame de loadTox retornar — uma race do lado do TD, reproduzida sem código Embody e reportada upstream) corrigido estruturalmente: o scan não carrega mais componentes no TD — um worker em segundo plano roda o toeexpand embutido do TD por paleta .tox e lê tipo + contagem de filhos da expansão (zero quedas de frame; o caminho antigo estourava o orçamento de 60fps em 78 dos seus primeiros 91 loads); linhas de bootstrap 33070 incluídas pré-assadas (267 componentes — instalações atuais nunca escaneiam); um sentinel de congelamento condena e pula qualquer componente que cause travamento futuro após um relaunch em vez de loop de congelamento; scan legado loadTox é apenas fallback, endurecido com allowCooking=False + blocklist. Uma regressão de save-wedge na primeira iteração do sentinel (chamada cross-extension de teardown durante a reinicialização disparada por strip do ExportPortableTox) foi pega e corrigida antes do envio. 2.117+ testes passando (19 novos).
  • 6.0.131: Issue #57 (transporte MCP no Windows) — a ponte STDIO e o alvo de configuração de fallback HTTP 127.0.0.1 em vez de localhost (o Windows resolve localhost para ::1 primeiro enquanto o Envoy liga apenas IPv4; em firewalls que derrubam silenciosamente SYNs de loopback, toda chamada MCP queimava ~2s e uma queda completa virava o hang de create_op de vários minutos reportado — medido 2,1s -> 0,07-0,27s por chamada após a correção); o Envoy não faz mais restart-storm quando sua porta base está ocupada por outra instância do TD (loop observado de 575 tentativas: agendamento de restart com geração, guards de início em voo, force-close com verificação de propriedade, diagnósticos altos de dead-on-arrival); a liveness da ponte é ciente de instância — o PID registrado verificado por imagem da instância ativa ou sua porta que responde, nunca "qualquer processo TouchDesigner existe" — e restart_td não pode mais sair do TD de um projeto diferente em máquinas multi-instância; delete_op purga linhas e arquivos de rastreamento para toda estratégia (clone/shared-file protegido); renames de TDN não vazam mais o antigo .tdn no Windows (paridade de sobrescrita Path.replace); a augmentação tools/list da ponte é idempotente (drift de template/fallback curado); scripts de launch emitem caminhos com barra normal em toda plataforma. Suíte completa do Windows verde pela primeira vez: 2.085 passados / 0 falhas (7 skips de plataforma). Smoke test de instalação limpa a partir do .tox incluído. 92 suítes / 2.092 testes.
  • 6.0.128: Issue #60 (Embody em um arquivo de startup padrão) — o scan de catálogo de paleta no primeiro launch não despausa mais uma timeline que o usuário pausou no meio do scan (bracket de snapshot por chunk), faz checkpoint a cada 25 componentes e retoma no próximo launch em vez de reiniciar do zero quando o TD é fechado no meio do scan (escritas atômicas; não pode travar, não pode reativar um Embody Desabilitado); a varredura "Dropped .tox Expression Detected" e Externalize Full Project agora honram tdn_exclude em toda a ancestralidade, Ignore simples vale para a sessão, e Toxdropexpr persiste para que respostas "Always" sobrevivam a novos projetos sem título (o opt-in do Envoy honra a configuração restaurada da mesma forma); a sonda venv roda uma vez por sessão por caminho de venv e um timeout não deleta mais um venv saudável. Nova regra incluída: worktree-td-safety. 92 suítes / 2.090+ testes.

Contribuidores

Originalmente derivado de External Tox Saver por Tim Franklin. Refatorado inteiramente por Dylan Roscover, com inspiração e orientação de Elburz Sorkhabi, Matthew Ragan e Wieland Hilker.

Quer ajudar? Comece com CONTRIBUTING.md — este repositório funciona de forma diferente de um projeto Python típico (o TouchDesigner escreve muitos dos arquivos), e essa página explica o que é seguro alterar e como executar os testes.

Licença

MIT License