Conceitos

O que sai da sua máquina

Por harness, o que os hooks do @valorbrain/connect enviam, para onde, com qual credencial, em que ritmo e como desligar. Tudo extraído do código.

Esta página descreve o tráfego automático que o @valorbrain/connect (versão 0.9.0, protocolo de hook v2) instala em cada harness: o que os hooks mandam sem o agente pedir. As chamadas de ferramenta MCP que o próprio agente faz (memory_store, memory_retrieve…) levam o que o modelo decidir enviar e não estão cobertas aqui.

Hooks instalados por versões anteriores passam para a 0.9.0 pelo self-heal (abaixo), menos os do Codex: o self-heal não reescreve hooks do Codex sem mudança de contrato, então uma instalação do Codex anterior à 0.9.0 continua com os hooks da 0.8.1 até você rodar o instalador de novo (e confiar nos hooks em /hooks). Enquanto isso, o --checkpoint off salvo não vale no Codex; só VALORBRAIN_CHECKPOINT=off desliga o checkpoint ali.

Cada número abaixo vem do código-fonte. Quando o código não determina algo, a página diz não determinado no código.

Resumo

HarnessEventos com hookO que sai por eventoArquivo de config
Claude CodeSessionStart, UserPromptSubmit, Stopinício: ids; prompt: até 8.000 caracteres; stop: só contadores. Com opt-in (--transcript on, connect ≥ 0.10.1), o stop também envia o transcript da sessão (até 8 MiB), no máximo a cada 10 min~/.claude/settings.json
CodexSessionStart, UserPromptSubmit, Stopigual ao Claude Code, mas o transcript da sessão (opt-in) exige connect ≥ 0.12.0~/.codex/hooks.json
Gemini CLISessionStart, BeforeAgent, AfterAgentigual ao Claude Code, mas o transcript da sessão (opt-in) exige connect ≥ 0.12.0~/.gemini/settings.json
KiroSessionStart, UserPromptSubmit, Stop (V3) ou agentSpawn, userPromptSubmit, stop (legado)igual ao Claude Code, mas o transcript da sessão (opt-in) exige connect ≥ 0.12.0~/.kiro/hooks/valorbrain.json (V3) ou ~/.kiro/agents/valorbrain.json (legado)
CursorsessionStart, stopinício: ids; stop: só contadores. Sem hook de prompt. Com opt-in (--transcript on, connect ≥ 0.12.0), o stop também envia o transcript da sessão (até 8 MiB), no máximo a cada 10 min~/.cursor/hooks.json
Grok CLIStopsó contadores. Com opt-in (--transcript on, connect ≥ 0.10.1), também o transcript da sessão (até 8 MiB), no máximo a cada 10 min~/.grok/hooks/valorbrain.json
OpenCodeplugin: chat.message; session.idle só com o transcript ligadoprompt: até 8.000 caracteres. Com opt-in (--transcript on, plugin v2 com connect ≥ 0.12.0), também o transcript da sessão principal (até 8 MiB), no máximo a cada 10 min~/.config/opencode/plugins/valorbrain.ts
Hermes Agentplugin MemoryProvider: início, cada turno, compressão, fim de sessãoo prompt de cada turno; o transcript da sessão (até 8 MiB) só com opt-in (--transcript on)~/.hermes/config.yaml + ~/.hermes/plugins/valorbrain/__init__.py
Oh My Pi (OMP)ponte própria (session_start, cada turno, fim de turno, fim de sessão)início: ids; prompt: até 8.000 caracteres; fim de turno: só contadores; o transcript da sessão (até 8 MiB) só com opt-in (--transcript on)~/.omp/agent/hooks/pre/valorbrain.ts

OpenClaw não é instalado pelo @valorbrain/connect e fica fora desta página.

O cliente de hook comum

Claude Code, Codex, Gemini CLI, Kiro, Cursor, Grok e OpenCode rodam o mesmo cliente: npx -y @valorbrain/connect@0.9.0 hook <evento> --harness=<id>. A versão é fixa (nunca latest): o hook roda a cada prompt, então só uma versão revisada entra na sua máquina. Ele lê o JSON que o harness entrega no stdin e envia somente os campos abaixo.

Endpoint

POST https://valorbrain-api.valor.digital/api/v1/hooks/cue, com Authorization: Bearer <token> e content-type: application/json.

Se a rota responder 404 ou 405 (engine sem hooks/cue; o resultado fica em cache por 6 horas) ou 403 (engine antigo que trata o POST como escrita), o cliente usa o caminho legado: uma chamada MCP memory_prepare em POST https://valorbrain-api.valor.digital/mcp com message (o prompt cortado em 8.000 caracteres, ou "session start") e fast_mode: true.

Corpo por evento

MomentoCampos enviados
Início de sessãoharness, session_id, event: "session_start" e source quando o harness manda esse campo
Promptharness, session_id, event: "prompt", prompt (os primeiros 8.000 caracteres) e source quando presente
Stopharness, session_id, event: "stop" e state com cinco números: turns, busy_ms, checkpoints, session_started_at, last_checkpoint_at

O stop não manda texto da conversa. Quando o servidor responde com um checkpoint, o cliente entrega esse texto ao modelo do próprio harness, que decide o que gravar pelo MCP. O que o modelo gravar sai por essa chamada MCP, não pelo hook. A única exceção é o envio do transcript abaixo, que só existe com opt-in.

Transcript (opt-in: Claude Code e Grok com connect ≥ 0.10.1; Codex, Gemini CLI, Kiro, Cursor e OpenCode com connect ≥ 0.12.0)

Desligado por padrão. Liga por harness com npx -y @valorbrain/connect --harness <id> --transcript on (grava send_transcript: true na entrada do harness em ~/.valorbrain/connect.json; --transcript off grava false) ou na máquina inteira com VALORBRAIN_SEND_TRANSCRIPT=on, que vence o arquivo nos dois sentidos (off, 0, false, no / on, 1, true, yes). Só um "ligado" explícito envia. Este envio no stop existe do hook 0.10.1 em diante no Claude Code e no Grok, e do 0.12.0 em diante no Codex, Gemini CLI, Kiro, Cursor e OpenCode: o hook roda a versão fixada pelo engine, e um hook de versão anterior não faz este envio mesmo com a chave ligada.

HarnessesClaude Code, Grok CLI, Codex, Gemini CLI, Kiro, Cursor e OpenCode. Um stop só envia pelo arquivo de hooks do próprio harness: o Cursor rodando o settings.json do Claude Code, ou o Grok rodando o hooks.json do Cursor, não envia com a credencial do outro harness. (A exceção dos hooks de extração ligados à mão, em qualquer harness, está logo abaixo)
O que saio arquivo de transcript da sessão (onde o hook o acha, por harness, está na tabela seguinte), com o conteúdo inteiro como o harness o grava, até 8 MiB. Acima disso, num arquivo JSONL vai só o final do arquivo, e cada linha cortada do começo vira uma linha vazia; um transcript em JSON de arquivo único (Gemini CLI antigo) acima de 8 MiB não é cortado e não é enviado. Junto: sessionId, hookEventName: "Stop", workingDir (o diretório da sessão) e, só no Claude Code com CLAUDE_CODE_SESSION_ATTENDED=1, sessionAttended: "1". O OpenCode não grava arquivo de transcript: o plugin v2 monta um a cada session.idle em ~/.valorbrain/state/opencode/<sessão>.jsonl (só no seu disco, 0600), com o texto que você digitou, o texto do assistente e as chamadas de tool. A entrada de cada tool (em JSON) e a saída vão cortadas em 2.000 caracteres, com a marca …[truncated N chars]: um edit ou write leva o arquivo inteiro na entrada, e esse conteúdo não sai inteiro. Raciocínio do modelo, arquivos anexados e partes sintéticas ficam de fora. É esse arquivo que vai, pelas mesmas regras. O plugin apaga desse diretório os arquivos parados há mais de 7 dias
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/run, duas chamadas por envio: episode-extractor e depois decision-extractor
Quandono stop, depois de 3 stops da sessão; os seguintes só se o arquivo cresceu e passaram 10 min desde o último envio. No máximo 8 envios a cada 10 min por harness. Só a sessão principal de uma pessoa envia: as execuções que ficam de fora estão na lista abaixo da tabela. Também não envia em stop de continuação (stop_hook_active), em turno do Grok que não terminou com end_turn, nem em turno do Cursor ou do OpenCode que não terminou como completed. Um 401, 403 ou 413 pausa os envios do harness por 6 h; um 429, por 30 min
Comoum processo separado (destacado) faz o envio; o hook não espera por ele. Cada requisição é cortada em 180 s. Falhas vão para ~/.valorbrain/connect.log, uma linha, sem conteúdo

Onde o hook acha o arquivo:

HarnessArquivo
Claude Codetranscript_path do payload
Grok CLItranscriptPath do payload
Codextranscript_path do payload: o rollout em ~/.codex/sessions/
Gemini CLItranscript_path do AfterAgent: ~/.gemini/tmp/<projeto>/chats/session-*.jsonl (versões antigas: um arquivo .json único)
Cursortranscript_path do payload ou CURSOR_TRANSCRIPT_PATH; sem eles, pelo conversation_id em ~/.cursor/projects/<workspace>/agent-transcripts/ (<id>.jsonl ou <id>/<id>.jsonl). Só arquivo .jsonl
Kiroo payload não traz caminho, só session_id e cwd. Kiro CLI 3.0 / --v3: ~/.kiro/sessions/<sha256 do cwd, 16 caracteres>/<sess_…>/messages.jsonl, e, se o hash do cwd não bater, o mesmo <sess_…>/messages.jsonl em qualquer diretório de ~/.kiro/sessions/. Motor legado: ~/.kiro/sessions/cli/<id>.jsonl
OpenCodeo JSONL que o plugin grava em ~/.valorbrain/state/opencode/

Execuções que nunca enviam, mesmo com a chave ligada:

  • Claude Code: sessão dirigida por SDK (CLAUDE_CODE_ENTRYPOINT começando com sdk) e toda sessão que o Claude Code marca como sem ninguém (CLAUDE_CODE_SESSION_ATTENDED=0: -p/SDK, sessões em segundo plano e um claude aberto por outro). Com =1, o envio leva sessionAttended: "1", e o engine só tira fatos dos turnos digitados por uma pessoa. Sem a variável, o campo não vai.
  • Codex: codex exec (é o que o SDK do Codex roda), codex mcp-server, clientes SDK do app-server e threads de sub-agente. O hook lê isso na linha session_meta do rollout (source, thread_source, originator); um rollout sem essa linha também não envia.
  • Gemini CLI: gemini -p / --prompt, Gemini com a pergunta na linha de comando (sem -i) e Gemini em CI (CI=true ou GITHUB_ACTIONS=true), a mesma regra de "headless" do Gemini; sessões de sub-agente (kind: "subagent" no arquivo). Num runner do GitHub o Gemini não passa CI nem GITHUB_ACTIONS ao hook (veja a seção do Gemini CLI); ali vale só a checagem da linha de comando.
  • Kiro: kiro-cli chat --no-interactive; no motor legado, as sessões que um cliente ACP abriu (session_created_reason: "subagent" em ~/.kiro/sessions/cli/<id>.json).
  • Cursor: cursor-agent -p / --print. O stop do Cursor só dispara para a conversa principal; subagentes têm o subagentStop, que o connect não liga.
  • OpenCode: sessões de subagente (com parentID) nunca são lidas.

Gemini CLI, Kiro e Cursor não dizem no payload nem no ambiente que a execução é não interativa. O hook roda um ps (Linux e macOS), sobe a árvore de processos a partir do pai e lê a linha de comando do processo do harness. Nada disso sai da máquina. Onde não há ps (Windows) ou ele falha, essa checagem não acontece e a execução conta como interativa: só vale o mínimo de 3 stops.

Hooks de extração legados ligados à mão (decision-extractor, episode-extractor, handoff-generator, feedback-loop, precompact-extract) continuam enviando o transcript quando a chave não foi escolhida: ligá-los à mão já é o opt-in. Com --transcript off (ou VALORBRAIN_SEND_TRANSCRIPT=off), um hook 0.10.1 ou posterior não lê nem envia o transcript, e os que só leem o transcript nem são chamados.

Credencial

O token é procurado nesta ordem, e o primeiro encontrado vence:

  1. --token= na linha de comando (só instalações anteriores ao protocolo v2; o self-heal migra para o arquivo).
  2. Variável de ambiente VALORBRAIN_TOKEN.
  3. A entrada deste harness em ~/.valorbrain/connect.json (arquivo 0600, uma entrada por harness). É o token vbm_… que o instalador gravou.
  4. api_key em ~/.valorbrain/config.json (o arquivo da CLI).

A base da API é --api=, depois VALORBRAIN_API_URL, depois a base salva com o token e, por fim, https://valorbrain-api.valor.digital. Sem token, o hook não faz nenhuma chamada de rede e escreve uma linha no stderr.

Ritmo

  • Síncrono, não fire-and-forget: o harness espera a resposta, porque ela vira contexto. O cliente corta cada requisição em 4 s (VALORBRAIN_HOOK_TIMEOUT_MS muda esse valor). O harness corta o processo em 10 s (Gemini: 10.000 ms).
  • Início de sessão: uma chamada. Um segundo início na mesma sessão em menos de 20 s não chama a rede.
  • Prompt: uma chamada por prompt. Prompt vazio não chama. Com o envio de prompt desligado para o harness (--prompt off, abaixo), o hook de prompt não chama a rede.
  • Stop: na maioria dos stops nada sai. A decisão é local, e o cliente só chama o servidor quando um checkpoint está devido. Política padrão (a resposta do servidor substitui): no mínimo 3 turnos, ou 2 turnos somando 8 min de trabalho; intervalo mínimo de 10 min (nunca menos de 1 min); no máximo 6 checkpoints por sessão. Stop sem session_id não chama.
  • Limite no servidor: 300 chamadas a cada 10 min por token (VALORBRAIN_HOOK_CUE_MAX_PER_10MIN no engine).
  • Qualquer erro sai com código 0 e no máximo uma linha no stderr; o prompt nunca é bloqueado pelo hook.

Tráfego de manutenção (self-heal)

Toda execução do hook também tenta um self-heal, limitado a uma vez a cada 6 horas por máquina (marcado em ~/.valorbrain/connect-state.json; VALORBRAIN_HEAL_INTERVAL_MS muda o intervalo) e a 2,5 s de espera no caminho do hook:

  • GET https://valorbrain-api.valor.digital/setup/artifacts?agent=<id>&hooks=2, sem credencial. O manifesto só é usado se trouxer uma assinatura ed25519 válida de uma das chaves embutidas no connect (a ativa ou a reserva; cabeçalhos X-ValorBrain-Manifest-*; a chave pública em uso está em /setup/manifest-keys); sem ela, nada é escrito. Se o contrato mudou, reescreve localmente as regras e os hooks do harness (o Codex fica fora da migração automática de hooks), menos os arquivos que você editou à mão: esses ficam como estão e o aviso vai para o stderr e para ~/.valorbrain/connect.log. Rodar o instalador de novo mostra o diff e pergunta antes de sobrescrever.
  • POST https://valorbrain-api.valor.digital/api/v1/runtimes/register com o token, em até 2,5 s. Envia runtime_key (<harness>:<hostname>:<caminho do home>), agent_platform, display_name, hostname, plugin_version: "0.9.0" e capabilities (harness, versão do contrato instalada, connector: "connect", self_heal: true, protocolo de hook).

A mesma declaração sai uma vez ao final de cada instalação.

Durante a instalação

Sem --token, o instalador abre a aprovação do computador: POST https://valorbrain.valor.digital/api/v1/cli/device/code com client: "connect", a lista de harnesses, device_label (<hostname> (<sistema operacional>), até 80 caracteres) e install_id (16 caracteres hexadecimais aleatórios guardados em ~/.valorbrain/install-id). Em seguida consulta /api/v1/cli/device/token até a aprovação.

Fonte: /www/valorbrain-cli/packages/connect/hook.mjs, /www/valorbrain-cli/packages/connect/index.mjs, /www/valorbrain-cli/packages/connect/login.mjs, /opt/valorbrain/src/hooks/cue.ts, /opt/valorbrain/src/server.ts

Por harness

Claude Code

EventosSessionStart, UserPromptSubmit, Stop (timeout de 10 s cada)
O que saiinício: ids; prompt: até 8.000 caracteres; stop: só contadores, e só quando há checkpoint devido. Com o transcript ligado (opt-in), o stop também envia o transcript da sessão (veja "Transcript" acima)
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue
CredencialBearer com o token vbm_… da entrada claude-code em ~/.valorbrain/connect.json (ordem completa acima)
Ritmo1 chamada por início de sessão e por prompt; stop segundo a política
Desligarsó os hooks: npx -y @valorbrain/connect --token <vbm_…> --harness claude-code --mcp-only; tudo (MCP, regras, hooks, credencial): npx -y @valorbrain/connect --harness claude-code --remove; ou apague as entradas com @valorbrain/connect em ~/.claude/settings.json; só o checkpoint: npx -y @valorbrain/connect --harness claude-code --checkpoint off ou VALORBRAIN_CHECKPOINT=off; transcript (desligado por padrão): --transcript on / --transcript off ou VALORBRAIN_SEND_TRANSCRIPT

Sessões do Claude Code dirigidas por SDK (CLAUDE_CODE_ENTRYPOINT começando com sdk) nunca recebem checkpoint e não chamam a rede no stop. Com o transcript ligado, uma sessão com CLAUDE_CODE_SESSION_ATTENDED=0 também não envia o transcript, e com =1 o envio leva sessionAttended: "1" (connect ≥ 0.12.0; veja "Transcript" acima).

Fonte: /opt/valorbrain/src/harness/adapters.ts (adapter claude-code), /www/valorbrain-cli/packages/connect/hook.mjs

Codex

EventosSessionStart, UserPromptSubmit, Stop (timeout de 10 s cada)
O que saiigual ao Claude Code. Com o transcript ligado (opt-in, connect ≥ 0.12.0), o stop também envia o rollout da sessão; codex exec, codex mcp-server, clientes SDK e sub-agentes nunca enviam (veja "Transcript" acima)
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue
Credencialentrada codex em ~/.valorbrain/connect.json
Ritmoigual ao Claude Code
Desligarsó os hooks: npx -y @valorbrain/connect --token <vbm_…> --harness codex --mcp-only; tudo (MCP, regras, hooks, credencial): npx -y @valorbrain/connect --harness codex --remove; ou apague as entradas com @valorbrain/connect em ~/.codex/hooks.json; só o checkpoint: npx -y @valorbrain/connect --harness codex --checkpoint off (hooks da 0.9.0) ou VALORBRAIN_CHECKPOINT=off; transcript (desligado por padrão): --transcript on / --transcript off ou VALORBRAIN_SEND_TRANSCRIPT

O Codex pede que você revise e confie nos hooks alterados uma vez, em /hooks. Por isso o self-heal não migra os hooks do Codex sozinho: uma instalação anterior à 0.9.0 fica com os hooks da 0.8.1, que não leem o --checkpoint off salvo, até você rodar o instalador de novo.

Fonte: /opt/valorbrain/src/harness/adapters.ts (codexHooksArtifact), /opt/valorbrain/src/harness/hosted.ts

Gemini CLI

EventosSessionStart, BeforeAgent (prompt), AfterAgent (stop), timeout de 10.000 ms cada
O que saiigual ao Claude Code. Com o transcript ligado (opt-in, connect ≥ 0.12.0), o AfterAgent também envia o arquivo da sessão; gemini -p, pergunta na linha de comando, CI e sub-agentes nunca enviam (veja "Transcript" acima)
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue
Credencialentrada gemini-cli em ~/.valorbrain/connect.json (ordem completa acima). Com a redação de ambiente do Gemini ligada, VALORBRAIN_TOKEN não chega ao hook (o nome tem TOKEN), e o arquivo é o que vale
Ritmoigual ao Claude Code
Desligarsó os hooks: npx -y @valorbrain/connect --token <vbm_…> --harness gemini-cli --mcp-only; tudo (MCP, regras, hooks, credencial): npx -y @valorbrain/connect --harness gemini-cli --remove; ou apague as entradas valorbrain-* em hooks de ~/.gemini/settings.json; prompt: npx -y @valorbrain/connect --harness gemini-cli --prompt off; checkpoint: npx -y @valorbrain/connect --harness gemini-cli --checkpoint off; transcript (desligado por padrão): --transcript on / --transcript off. As variáveis VALORBRAIN_SEND_PROMPT, VALORBRAIN_CHECKPOINT e VALORBRAIN_SEND_TRANSCRIPT também valem, menos num runner do GitHub (abaixo)

O Gemini CLI (0.43) passa aos hooks o ambiente do próprio processo, mais as variáveis GEMINI_*. Ele só filtra esse ambiente em dois casos:

  • com security.environmentVariableRedaction.enabled: true no settings.json do Gemini: saem as variáveis com nome de segredo (TOKEN, KEY, SECRET, AUTH, PASSWORD…), alguns nomes fixos e as listadas em blocked;
  • num runner do GitHub (GITHUB_SHA definido, ou SURFACE=Github): só passa uma lista curta (PATH, HOME, TERM…) e as listadas em allowed.

Por isso VALORBRAIN_SEND_PROMPT, VALORBRAIN_CHECKPOINT e VALORBRAIN_SEND_TRANSCRIPT chegam ao hook e valem como nos outros harnesses, menos num runner do GitHub. As escolhas salvas em ~/.valorbrain/connect.json (--prompt, --checkpoint, --transcript) valem sempre. Num runner do GitHub também não chegam CI nem GITHUB_ACTIONS; ali, o que impede o envio do transcript é a checagem da linha de comando (-p ou pergunta no argv).

Fonte: /opt/valorbrain/src/harness/adapters.ts (geminiHooksArtifact), /opt/valorbrain/src/harness/hosted.ts

Kiro

EventosEngine V3 (padrão): SessionStart, UserPromptSubmit, Stop no arquivo avulso. Engine legado (--kiro-engine=legacy): agentSpawn, userPromptSubmit, stop na config de agente, com timeout: 10000
O que saiigual ao Claude Code. Com o transcript ligado (opt-in, connect ≥ 0.12.0), o stop também envia o arquivo da sessão, que o hook acha pelo session_id em ~/.kiro/sessions/; kiro-cli chat --no-interactive e, no motor legado, sessões abertas por um cliente ACP nunca enviam (veja "Transcript" acima)
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue
Credencialentrada kiro em ~/.valorbrain/connect.json
Ritmoigual ao Claude Code. O timeout do arquivo V3 não é definido pelo connect; o valor padrão do Kiro é não determinado no código
Desligarsó os hooks: npx -y @valorbrain/connect --token <vbm_…> --harness kiro --mcp-only; tudo: npx -y @valorbrain/connect --harness kiro --remove (MCP, regras, credencial e os arquivos dos dois modos); ou apague ~/.kiro/hooks/valorbrain.json e ~/.kiro/agents/valorbrain.json; só o checkpoint: npx -y @valorbrain/connect --harness kiro --checkpoint off ou VALORBRAIN_CHECKPOINT=off; transcript (desligado por padrão): --transcript on / --transcript off ou VALORBRAIN_SEND_TRANSCRIPT

Com --scope workspace, o arquivo vai para .kiro/ dentro do projeto.

Fonte: /opt/valorbrain/src/harness/adapters.ts (adapter kiro), /www/valorbrain-cli/packages/connect/index.mjs (scopedManifest)

Cursor

EventossessionStart, stop (timeout de 10 s cada). Não há hook de prompt: beforeSubmitPrompt pode bloquear um prompt, mas não adicionar contexto
O que saiinício: ids; stop: só contadores. Com o transcript ligado (opt-in, connect ≥ 0.12.0), o stop também envia o transcript .jsonl da conversa; cursor-agent -p e turnos que não terminaram como completed nunca enviam (veja "Transcript" acima)
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue
Credencialentrada cursor em ~/.valorbrain/connect.json
Ritmo1 chamada por início de sessão; stop segundo a política. O próprio Cursor limita follow-ups por conversa (loop_limit, padrão 5)
Desligarsó os hooks: npx -y @valorbrain/connect --token <vbm_…> --harness cursor --mcp-only; tudo (MCP, regras, hooks, credencial): npx -y @valorbrain/connect --harness cursor --remove; ou apague as entradas com valorbrain em ~/.cursor/hooks.json; só o checkpoint: npx -y @valorbrain/connect --harness cursor --checkpoint off ou VALORBRAIN_CHECKPOINT=off; transcript (desligado por padrão): --transcript on / --transcript off ou VALORBRAIN_SEND_TRANSCRIPT

O Cursor também carrega ~/.claude/settings.json. Quando ele dispara o hook de prompt do Claude Code, o cliente reconhece o Cursor pelo payload e não chama o hooks/cue. Um stop do Cursor que chega por esse arquivo não envia o transcript: só o ~/.cursor/hooks.json envia, com a credencial cursor.

Fonte: /opt/valorbrain/src/harness/adapters.ts (cursorHooksArtifact), /www/valorbrain-cli/packages/connect/hook.mjs

Grok CLI

EventosStop (timeout de 10 s). O Grok descarta a saída dos eventos passivos, por isso início e prompt não são ligados
O que saisó contadores, e só quando há checkpoint devido e o turno terminou com end_turn. Com o transcript ligado (opt-in), também o transcript da sessão (veja "Transcript" acima)
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue
Credencialentrada grok em ~/.valorbrain/connect.json
Ritmostop segundo a política
Desligarsó os hooks: npx -y @valorbrain/connect --token <vbm_…> --harness grok --mcp-only; tudo (MCP, regras, hooks, credencial): npx -y @valorbrain/connect --harness grok --remove; ou apague ~/.grok/hooks/valorbrain.json; só o checkpoint: npx -y @valorbrain/connect --harness grok --checkpoint off ou VALORBRAIN_CHECKPOINT=off; transcript (desligado por padrão): --transcript on / --transcript off ou VALORBRAIN_SEND_TRANSCRIPT

O Grok também carrega ~/.cursor/hooks.json. O início de sessão que chega por esse arquivo com o payload do Grok não chama o hooks/cue.

Fonte: /opt/valorbrain/src/harness/adapters.ts (adapter grok), /www/valorbrain-cli/packages/connect/hook.mjs

OpenCode

Eventosplugin: chat.message (cada mensagem do usuário). Com o transcript ligado, também session.idle (fim de cada turno) da sessão principal. Não há início de sessão
O que saio texto da mensagem, cortado em 8.000 caracteres no plugin e de novo no cliente, mais o session_id. Com o transcript ligado (opt-in, plugin v2 e connect ≥ 0.12.0), o stop também envia o transcript da sessão principal (veja "Transcript" acima). Desligado, o plugin não lê a sessão
EndpointPOST https://valorbrain-api.valor.digital/api/v1/hooks/cue (o plugin executa o cliente de hook do connect: hook context-surfacing --format=text --harness=opencode). Com o transcript ligado, o plugin executa também hook stop --harness=opencode, que envia a POST …/api/v1/hooks/run
Credencialentrada opencode em ~/.valorbrain/connect.json
Ritmo1 chamada por mensagem; o plugin mata o processo após 9 s. Com o transcript ligado, 1 stop por turno da sessão principal, e o envio segue as regras de "Transcript" acima
DesligarVALORBRAIN_OPENCODE_DISABLE=true; só o plugin: npx -y @valorbrain/connect --token <vbm_…> --harness opencode --mcp-only; tudo (MCP, regras, plugin, credencial): npx -y @valorbrain/connect --harness opencode --remove; ou apague ~/.config/opencode/plugins/valorbrain.ts; transcript (desligado por padrão): --transcript on / --transcript off ou VALORBRAIN_SEND_TRANSCRIPT

Uma vez por carregamento, o plugin também busca GET https://valorbrain-api.valor.digital/setup/artifacts?agent=opencode (ou a base em VALORBRAIN_URL), sem credencial, e envia POST <origem da URL MCP em opencode.json>/api/v1/runtimes/register com o token do opencode.json, hostname, o caminho do home e a versão do contrato (timeout de 2,5 s). VALORBRAIN_OPENCODE_DISABLE=true desliga isso também.

Fonte: /opt/valorbrain/src/harness/adapters.ts (opencodePluginSource)

Hermes Agent

O Hermes não usa o cliente de hook comum. O connect grava um plugin MemoryProvider em Python que, sem o binário valorbrain local, roda os hooks no engine.

Eventosinício de sessão (session-bootstrap); cada turno com 5 ou mais caracteres (context-surfacing, em thread de fundo); compressão (precompact-extract, e postcompact-inject no turno seguinte); fim de sessão (decision-extractor, handoff-generator, feedback-loop em paralelo)
O que sainos turnos: hook, sessionId, hookEventName e o prompt inteiro (sem corte no cliente). O transcript da sessão (~/.hermes/valorbrain-transcripts/<sessão>.jsonl, até 8 MiB, cada mensagem do usuário e cada resposta do assistente) só sai com opt-in: sem ele o plugin nem grava o arquivo, e a extração de fim de sessão e de compressão não roda
EndpointPOST <VALORBRAIN_ENGINE_URL>/api/v1/hooks/run. Fallbacks: GET /api/v1/memory/working-context?format=md no início e POST /api/v1/memory/prepare (prompt, recall_budget: 600, fast_mode: true) no turno
CredencialAuthorization: Bearer com VALORBRAIN_API_TOKEN, que o instalador grava em env de ~/.hermes/config.yaml (o mesmo vbm_… do MCP). Cabeçalhos extras: X-Source-Agent, X-Source-System (padrão hermes) e, se definidos, X-Tenant-ID e X-User-ID
Ritmotimeouts: 30 s nos hooks de ciclo de vida, 90 s no context-surfacing, 5 s nas chamadas REST
Desligarprompt: npx -y @valorbrain/connect --harness hermes --prompt off ou VALORBRAIN_SEND_PROMPT=off no env de ~/.hermes/config.yaml (sem recall por turno). Transcript (opt-in): --transcript on ou VALORBRAIN_SEND_TRANSCRIPT=on. Tudo: npx -y @valorbrain/connect --harness hermes --remove (remove mcp_servers.valorbrain, memory.provider, as chaves de env e o plugin); ou troque memory.provider em ~/.hermes/config.yaml

O Hermes não tem hooks no manifesto: --mcp-only não muda nada nele. O plugin de memória continua instalado e envia o prompt de cada turno; para parar, use --prompt off (ou --remove, que tira tudo).

Outras chamadas do plugin: GET /foundations?limit=10 e GET /health no início; POST /api/v1/runtimes/register no início (com hostname); POST /api/v1/runtimes/heartbeat no máximo a cada 300 s; e GET /setup/instructions quando a mensagem pede setup do ValorBrain.

Contextos que não são o principal (subagente, cron, flush) não gravam transcript nem rodam a extração de fim de sessão e de compressão.

O engine aceita no máximo 40 chamadas de hooks/run a cada 10 min por tenant.

Fonte: /opt/valorbrain/src/hermes/__init__.py, /opt/valorbrain/src/harness/adapters.ts (adapter hermes), /www/valorbrain-cli/packages/connect/index.mjs (mergeYaml)

Oh My Pi (OMP)

O OMP não tem hook por comando: carrega fábricas TS de ~/.omp/agent/hooks/pre/. No modo hospedado (manifesto hooks=2, a partir do engine que publica a ponte hospedada), o connect grava a ponte em ~/.omp/agent/hooks/pre/valorbrain.ts. Ela fala HTTP direto com o engine (fetch), sem npx por evento. Antes dessa versão do engine, o connect grava só a entrada MCP e as regras, e não há tráfego automático.

Eventossession_start, before_agent_start (cada turno do usuário, só a sessão principal), session_stop (fim de cada turno), session_shutdown (fim da sessão)
O que saiinício: ids; prompt: os primeiros 8.000 caracteres; fim de turno: só contadores, e só quando há checkpoint devido. O transcript da sessão só sai com opt-in: cada mensagem do usuário e cada resposta do assistente (só as partes de texto; saídas de ferramenta cortadas em 500 caracteres; o raciocínio interno fica de fora), com o horário de cada turno, até 8 MiB (acima disso, as linhas mais antigas vão vazias). Subagente nunca envia
Endpointcontexto e checkpoint: POST https://valorbrain-api.valor.digital/api/v1/hooks/cue; transcript (opt-in): POST https://valorbrain-api.valor.digital/api/v1/hooks/run com episode-extractor e depois decision-extractor, e input com sessionId, hookEventName e workingDir (o diretório da sessão)
CredencialVALORBRAIN_TOKEN, depois a entrada omp em ~/.valorbrain/connect.json, depois api_key em ~/.valorbrain/config.json. A ponte só lê esses arquivos, nunca escreve
Ritmo1 chamada por início de sessão e por prompt, cada uma cortada em 4 s; checkpoint segundo a política. Transcript (opt-in): o primeiro envio e o envio do fim da sessão só depois de pelo menos 3 turnos do usuário desde o envio anterior, então uma execução curta nunca envia; no meio da sessão, os seguintes com pelo menos 10 min de intervalo e conversa nova. 2 chamadas por envio. omp -p (modos print e json) nunca envia. O envio roda num processo bun separado, para não segurar o fim do OMP; o token vai pelo ambiente desse processo, nunca para o disco; um 401, 403, 413 ou 429 interrompe o envio
Desligarprompt: npx -y @valorbrain/connect --harness omp --prompt off ou VALORBRAIN_SEND_PROMPT=off; checkpoint: --checkpoint off ou VALORBRAIN_CHECKPOINT=off; transcript (opt-in, desligado por padrão): liga com --transcript on ou VALORBRAIN_SEND_TRANSCRIPT=on, e --transcript off ou VALORBRAIN_SEND_TRANSCRIPT=off desligam; só a ponte: npx -y @valorbrain/connect --token <vbm_…> --harness omp --mcp-only; tudo: npx -y @valorbrain/connect --harness omp --remove; ou apague ~/.omp/agent/hooks/pre/valorbrain.ts

Falhas vão para ~/.omp/agent/valorbrain-hooks.log (0600), uma linha por falha ou por envio, sem conteúdo e sem token. A ponte não roda o cliente do connect, então o self-heal não a atualiza: uma versão nova chega quando você roda o instalador de novo.

Fonte: /opt/valorbrain/src/harness/omp-bridge-hosted.ts, /opt/valorbrain/src/harness/adapters.ts (adapter omp)

O que não sai

Isto vale para o cliente de hook comum (todos os harnesses acima, menos o Hermes e o OMP, que têm cliente próprio). Na ponte do OMP, com o transcript desligado (o padrão), o mesmo vale: nada além dos três corpos do hooks/cue.

  • Transcript: os hooks que o instalador liga (session-start, prompt, stop) não leem o arquivo de transcript enquanto a chave não estiver ligada. Além dos três corpos acima, do fallback legado e do self-heal, eles não enviam nada. Com --transcript on, o Claude Code e o Grok, e do connect 0.12.0 em diante o Codex, o Gemini CLI, o Kiro, o Cursor e o OpenCode, enviam o transcript como descrito em "Transcript" acima. Para achar o arquivo e decidir se a execução é de uma pessoa, o hook lê só na máquina: a primeira linha do rollout do Codex, o começo do arquivo do Gemini, ~/.kiro/sessions/ e ~/.cursor/projects/<workspace>/agent-transcripts/, e a linha de comando dos processos acima dele (ps). Exceção: com a chave sem escolha (o padrão), um hook de extração legado que você ligou à mão (decision-extractor, episode-extractor, handoff-generator, feedback-loop, precompact-extract), em qualquer harness, ainda lê e envia o transcript; só --transcript off (ou VALORBRAIN_SEND_TRANSCRIPT=off) impede.
  • Diretório de trabalho e o resto do payload: cwd, transcript_path e os demais campos que o harness entrega ficam na máquina. O cwd só entra num hash local que identifica a sessão (no Kiro, também no hash que acha o diretório da sessão). Com o transcript ligado, o arquivo de transcript e o cwd (como workingDir) vão no envio do transcript; um hook de extração ligado à mão envia também o cwd, o prompt e a última resposta do assistente, quando o harness os entrega.
  • Respostas do assistente e saídas de ferramentas: não fazem parte dos corpos do hooks/cue. Vão dentro do transcript quando ele é enviado (chave ligada, ou hook de extração ligado à mão com a chave sem escolha).
  • Token na linha de comando: no protocolo v2 o token fica em ~/.valorbrain/connect.json (0600), nunca no argv do hook.

No servidor, a trilha de leitura do hooks/cue guarda só o hash da consulta, não o texto.

Fonte: /www/valorbrain-cli/packages/connect/hook.mjs, /opt/valorbrain/src/harness/adapters.ts, /opt/valorbrain/src/server.ts, /opt/valorbrain/src/access-tracker.ts

Como desligar

  • Tudo: npx -y @valorbrain/connect --remove. Desfaz a instalação inteira dos harnesses detectados: entradas MCP, regras, hooks e as credenciais em ~/.valorbrain/connect.json.
  • Um harness: npx -y @valorbrain/connect --harness <id> --remove (o mesmo, só para ele).
  • Só os hooks, mantendo o MCP e as regras: rode a instalação de novo com --mcp-only (npx -y @valorbrain/connect --token <vbm_…> --harness <id> --mcp-only). Nada sai por turno; rodar de novo sem --mcp-only põe os hooks de volta. Hooks que você editou à mão só saem com --force ou com um sim na pergunta. A nova execução precisa do token (--token <vbm_…>, como na instalação): sem ninguém no teclado, como no shell de um agente, o connect para sem ele. No Hermes, que não tem hooks, a flag não muda nada (o plugin continua enviando o prompt); no OMP ela tira a ponte de hooks.
  • Só o checkpoint do stop, por harness: npx -y @valorbrain/connect --harness <id> --checkpoint off (grava checkpoint: false na entrada do harness; --checkpoint on religa). Na máquina inteira: VALORBRAIN_CHECKPOINT=off (ou 0, ou false) no ambiente do harness, que vence o arquivo nos dois sentidos. No Gemini CLI a variável não chega ao hook num runner do GitHub (veja a seção do Gemini CLI), e ali só o --checkpoint off funciona; no Codex instalado antes da 0.9.0, só a variável, até reinstalar.
  • Só o prompt, por harness: npx -y @valorbrain/connect --harness <id> --prompt off (grava send_prompt: false na entrada do harness em ~/.valorbrain/connect.json; --prompt on religa). Na máquina inteira: VALORBRAIN_SEND_PROMPT=off no ambiente do harness (num runner do GitHub o Gemini CLI não passa essa variável aos hooks; ali, use o --prompt off). Sem o prompt, o início de sessão e o checkpoint continuam; o recall por prompt para.
  • Transcript (Claude Code, Grok, Codex, Gemini CLI, Kiro, Cursor, OpenCode, Hermes e OMP): desligado por padrão; liga com npx -y @valorbrain/connect --harness <id> --transcript on, ou com VALORBRAIN_SEND_TRANSCRIPT=on no ambiente do harness, que vence o arquivo nos dois sentidos. --transcript off desliga.
  • À mão: apague as entradas cujo comando contém @valorbrain/connect no arquivo do harness (tabela abaixo). Apagar só ~/.valorbrain/connect.json não basta se ~/.valorbrain/config.json tiver api_key, porque o hook usa essa chave como último recurso.

Como verificar

  • npx -y @valorbrain/connect --status mostra, por harness, se os hooks estão ligados, em qual protocolo e para qual engine, e o modo (mcp-only ou hooks).
  • npx -y @valorbrain/connect --token <vbm_…> --dry-run mostra o que seria escrito, sem escrever nada.
  • Os arquivos que você pode abrir:
HarnessOnde ficam os hooks
Claude Code~/.claude/settings.json → hooks
Codex~/.codex/hooks.json
Gemini CLI~/.gemini/settings.json → hooks
Kiro~/.kiro/hooks/valorbrain.json (V3) ou ~/.kiro/agents/valorbrain.json (legado)
Cursor~/.cursor/hooks.json
Grok CLI~/.grok/hooks/valorbrain.json
OpenCode~/.config/opencode/plugins/valorbrain.ts
Hermes Agent~/.hermes/config.yaml e ~/.hermes/plugins/valorbrain/__init__.py
Oh My Pi (OMP)~/.omp/agent/hooks/pre/valorbrain.ts
Todos (credencial)~/.valorbrain/connect.json

Veja também Tokens e Hosts.

Nesta página