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
| Harness | Eventos com hook | O que sai por evento | Arquivo de config |
|---|---|---|---|
| Claude Code | SessionStart, UserPromptSubmit, Stop | iní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 |
| Codex | SessionStart, UserPromptSubmit, Stop | igual ao Claude Code, mas o transcript da sessão (opt-in) exige connect ≥ 0.12.0 | ~/.codex/hooks.json |
| Gemini CLI | SessionStart, BeforeAgent, AfterAgent | igual ao Claude Code, mas o transcript da sessão (opt-in) exige connect ≥ 0.12.0 | ~/.gemini/settings.json |
| Kiro | SessionStart, 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) |
| Cursor | sessionStart, stop | iní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 CLI | Stop | só 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 |
| OpenCode | plugin: chat.message; session.idle só com o transcript ligado | prompt: 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 Agent | plugin MemoryProvider: início, cada turno, compressão, fim de sessão | o 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
| Momento | Campos enviados |
|---|---|
| Início de sessão | harness, session_id, event: "session_start" e source quando o harness manda esse campo |
| Prompt | harness, session_id, event: "prompt", prompt (os primeiros 8.000 caracteres) e source quando presente |
| Stop | harness, 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.
| Harnesses | Claude 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 sai | o 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 |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/run, duas chamadas por envio: episode-extractor e depois decision-extractor |
| Quando | no 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 |
| Como | um 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:
| Harness | Arquivo |
|---|---|
| Claude Code | transcript_path do payload |
| Grok CLI | transcriptPath do payload |
| Codex | transcript_path do payload: o rollout em ~/.codex/sessions/ |
| Gemini CLI | transcript_path do AfterAgent: ~/.gemini/tmp/<projeto>/chats/session-*.jsonl (versões antigas: um arquivo .json único) |
| Cursor | transcript_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 |
| Kiro | o 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 |
| OpenCode | o 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_ENTRYPOINTcomeçando comsdk) 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 levasessionAttended: "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 linhasession_metado 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=trueouGITHUB_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 passaCInemGITHUB_ACTIONSao 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. Ostopdo Cursor só dispara para a conversa principal; subagentes têm osubagentStop, 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:
--token=na linha de comando (só instalações anteriores ao protocolo v2; o self-heal migra para o arquivo).- Variável de ambiente
VALORBRAIN_TOKEN. - A entrada deste harness em
~/.valorbrain/connect.json(arquivo 0600, uma entrada por harness). É o tokenvbm_…que o instalador gravou. api_keyem~/.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_MSmuda 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_idnão chama. - Limite no servidor: 300 chamadas a cada 10 min por token
(
VALORBRAIN_HOOK_CUE_MAX_PER_10MINno 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çalhosX-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/registercom o token, em até 2,5 s. Enviaruntime_key(<harness>:<hostname>:<caminho do home>),agent_platform,display_name,hostname,plugin_version: "0.9.0"ecapabilities(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
| Eventos | SessionStart, UserPromptSubmit, Stop (timeout de 10 s cada) |
| O que sai | iní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) |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/cue |
| Credencial | Bearer com o token vbm_… da entrada claude-code em ~/.valorbrain/connect.json (ordem completa acima) |
| Ritmo | 1 chamada por início de sessão e por prompt; stop segundo a política |
| Desligar | só 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
| Eventos | SessionStart, UserPromptSubmit, Stop (timeout de 10 s cada) |
| O que sai | igual 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) |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/cue |
| Credencial | entrada codex em ~/.valorbrain/connect.json |
| Ritmo | igual ao Claude Code |
| Desligar | só 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
| Eventos | SessionStart, BeforeAgent (prompt), AfterAgent (stop), timeout de 10.000 ms cada |
| O que sai | igual 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) |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/cue |
| Credencial | entrada 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 |
| Ritmo | igual ao Claude Code |
| Desligar | só 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: truenosettings.jsondo Gemini: saem as variáveis com nome de segredo (TOKEN,KEY,SECRET,AUTH,PASSWORD…), alguns nomes fixos e as listadas emblocked; - num runner do GitHub (
GITHUB_SHAdefinido, ouSURFACE=Github): só passa uma lista curta (PATH,HOME,TERM…) e as listadas emallowed.
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
| Eventos | Engine 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 sai | igual 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) |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/cue |
| Credencial | entrada kiro em ~/.valorbrain/connect.json |
| Ritmo | igual 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 |
| Desligar | só 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
| Eventos | sessionStart, stop (timeout de 10 s cada). Não há hook de prompt: beforeSubmitPrompt pode bloquear um prompt, mas não adicionar contexto |
| O que sai | iní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) |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/cue |
| Credencial | entrada cursor em ~/.valorbrain/connect.json |
| Ritmo | 1 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) |
| Desligar | só 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
| Eventos | Stop (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 sai | só 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) |
| Endpoint | POST https://valorbrain-api.valor.digital/api/v1/hooks/cue |
| Credencial | entrada grok em ~/.valorbrain/connect.json |
| Ritmo | stop segundo a política |
| Desligar | só 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
| Eventos | plugin: 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 sai | o 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 |
| Endpoint | POST 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 |
| Credencial | entrada opencode em ~/.valorbrain/connect.json |
| Ritmo | 1 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 |
| Desligar | VALORBRAIN_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.
| Eventos | iní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 sai | nos 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 |
| Endpoint | POST <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 |
| Credencial | Authorization: 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 |
| Ritmo | timeouts: 30 s nos hooks de ciclo de vida, 90 s no context-surfacing, 5 s nas chamadas REST |
| Desligar | prompt: 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.
| Eventos | session_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 sai | iní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 |
| Endpoint | contexto 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) |
| Credencial | VALORBRAIN_TOKEN, depois a entrada omp em ~/.valorbrain/connect.json, depois api_key em ~/.valorbrain/config.json. A ponte só lê esses arquivos, nunca escreve |
| Ritmo | 1 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 |
| Desligar | prompt: 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(ouVALORBRAIN_SEND_TRANSCRIPT=off) impede. - Diretório de trabalho e o resto do payload:
cwd,transcript_pathe os demais campos que o harness entrega ficam na máquina. Ocwdsó 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 ocwd(comoworkingDir) vão no envio do transcript; um hook de extração ligado à mão envia também ocwd, 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-onlypõe os hooks de volta. Hooks que você editou à mão só saem com--forceou 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(gravacheckpoint: falsena entrada do harness;--checkpoint onreliga). Na máquina inteira:VALORBRAIN_CHECKPOINT=off(ou0, oufalse) 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 offfunciona; 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(gravasend_prompt: falsena entrada do harness em~/.valorbrain/connect.json;--prompt onreliga). Na máquina inteira:VALORBRAIN_SEND_PROMPT=offno 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 comVALORBRAIN_SEND_TRANSCRIPT=onno ambiente do harness, que vence o arquivo nos dois sentidos.--transcript offdesliga. - À mão: apague as entradas cujo comando contém
@valorbrain/connectno arquivo do harness (tabela abaixo). Apagar só~/.valorbrain/connect.jsonnão basta se~/.valorbrain/config.jsontiverapi_key, porque o hook usa essa chave como último recurso.
Como verificar
npx -y @valorbrain/connect --statusmostra, por harness, se os hooks estão ligados, em qual protocolo e para qual engine, e o modo (mcp-onlyouhooks).npx -y @valorbrain/connect --token <vbm_…> --dry-runmostra o que seria escrito, sem escrever nada.- Os arquivos que você pode abrir:
| Harness | Onde 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 |