> ## Documentation Index
> Fetch the complete documentation index at: https://chatcli.edilsonfreitas.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Chat gateway

> Rode o ChatCLI como daemon de mensagens no Telegram, Slack, Discord, WhatsApp ou em qualquer sistema que fale HTTP: cada mensagem roda o agente completo com suas tools, e o progresso volta para o chat enquanto ele trabalha.

O **chat gateway** coloca o ChatCLI atrás de um bot. Você manda mensagem pelo **Telegram, Slack, Discord, WhatsApp** ou por um **webhook genérico**, e cada mensagem roda o mesmo motor do `/coder`, com suas tools (arquivos, shell, web, MCP) e a sua memória, enquanto o progresso e a resposta voltam para a conversa.

## Conecte um canal

Escolha um canal para ver configuração, variáveis e limites.

<div className="cc-channels">
  <a className="cc-channel" href="/pt/gateway/telegram"><span className="cc-channel-icon cc-ch-telegram"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z" /></svg></span><span className="cc-channel-name">Telegram</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/pt/gateway/slack"><span className="cc-channel-icon cc-ch-slack"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z" /></svg></span><span className="cc-channel-name">Slack</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/pt/gateway/discord"><span className="cc-channel-icon cc-ch-discord"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" /></svg></span><span className="cc-channel-name">Discord</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/pt/gateway/whatsapp"><span className="cc-channel-icon cc-ch-whatsapp"><svg viewBox="0 0 24 24" aria-hidden="true" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z" /></svg></span><span className="cc-channel-name">WhatsApp</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
  <a className="cc-channel" href="/pt/gateway/webhook"><span className="cc-channel-icon cc-ch-webhook"><svg viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" /><path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" /><path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" /></svg></span><span className="cc-channel-name">Webhook</span><svg className="cc-channel-arrow" viewBox="0 0 24 24" aria-hidden="true" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg></a>
</div>

| | Telegram | Slack | Discord | WhatsApp | Webhook |
| - | - | - | - | - | - |
| Precisa de URL pública | não | sim | não | sim | sim, para receber |
| Lista de remetentes permitidos | sim | não | não | não | segredo compartilhado |
| Voz recebida | sim | sim | sim | sim | sim |
| Respostas em voz | sim | não | não | não | não |
| Imagens recebidas | sim | sim | sim | sim | sim |
| Imagens enviadas | sim | sim | sim | sim | sim |
| "Trabalhando" | indicador de digitação | aviso em texto | aviso em texto | aviso em texto | aviso no callback |

<Warning>
  O agente roda **sem confirmações**, com suas tools e o shell. Trate o gateway como uma superfície remota privilegiada: só o Telegram tem lista de remetentes permitidos, então nos outros canais decida quem alcança o bot pelas permissões da própria plataforma, e endureça o agente com `CHATCLI_AGENT_SECURITY_MODE=strict` antes de expor. Veja [Segurança](/pt/security/overview).
</Warning>

## Iniciar e parar

O gateway roda como **daemon destacado**: `/gateway start` lança o `chatcli gateway` em segundo plano e devolve o prompt na hora, então você continua usando o ChatCLI normalmente.

```text theme={"system"}
/gateway start     # inicia todos os canais configurados em segundo plano (também: /gateway)
/gateway status    # pid, os canais rodando e o backend de transcrição de voz (também: /gateway platforms)
/gateway stop      # para o daemon
```

* Cada canal **só liga quando suas variáveis obrigatórias estão definidas**, então configure apenas os que quiser. Sem nenhum configurado, `/gateway start` avisa e nada roda.
* O daemon guarda o pid em `~/.chatcli/gateway.pid` (um segundo `start` com ele rodando é recusado) e escreve em `~/.chatcli/gateway.log`, o primeiro lugar a olhar quando um canal fica em silêncio.
* `chatcli gateway` roda o mesmo daemon em primeiro plano, para um gerenciador de serviços ou um container; ele para com `Ctrl+C` ou `SIGTERM`.
* Com `CHATCLI_GATEWAY_IN_SERVER=true`, o gateway roda dentro do [`chatcli server`](/pt/server/server-mode) e compartilha o Conversation Hub com os clientes conectados.

## Como uma mensagem é tratada

```text theme={"system"}
Adaptador do canal --mensagem--> Runner --> agente (o motor do /coder, sem supervisão) --> resposta
        ^                                      |
        └───── "trabalhando", progresso ───────┘
```

1. O **adaptador** recebe a mensagem pela API HTTP da própria plataforma (sem SDKs de terceiros), baixa voice note ou imagem e entrega ao runner. Cada chat é uma conversa, identificada por plataforma e chat.
2. Uma voice note é **transcrita primeiro**, então o agente sempre recebe texto; uma imagem é anexada ao turno para o modelo ver.
3. O **agente** executa o pedido com suas tools e sem confirmações, na voz conversacional do gateway e no idioma da mensagem.
4. Enquanto ele trabalha, a pessoa vê que está em andamento: o "digitando…" nativo no Telegram, ou um aviso curto (`gateway.thinking`, "🤔 Recebido — já estou processando…") nos outros canais, enviado só quando a resposta passa de uns 2 segundos. O progresso das chamadas de tools do agente é agrupado e enviado como mensagens novas no máximo a cada 3 segundos.
5. A **resposta** é a resposta final do agente, escrita como mensagem de chat; "✅" só é enviado se o agente terminou sem uma. Um erro volta como "⚠️" seguido do erro.

### Concorrência e contexto

As mensagens são recebidas em paralelo (até 64 na fila, 4 workers), mas **as execuções do agente acontecem uma por vez em todos os canais**, porque o agente usa estado compartilhado do ChatCLI. Cada turno recebe como contexto os últimos 12 turnos da conversa do remetente no [Conversation Hub](/pt/gateway/conversation-hub); o estado durável fica nos arquivos que o agente edita e nas [sessões nomeadas](#vínculo-de-sessão-pelo-canal).

### Limites comuns a todos os canais

* Uma resposta é cortada em **3500 caracteres** e termina com `…`.
* São usadas uma voice note e uma imagem por mensagem; os downloads são limitados por `CHATCLI_GATEWAY_MAX_AUDIO_BYTES` e `CHATCLI_GATEWAY_MAX_IMAGE_BYTES` (20 MB cada, por padrão).

## Modelo em runtime

O gateway **espelha o modelo (e o provider) que a sua sessão interativa está usando** — não o default do `.env`. Trocar de modelo ou de provider na REPL com `/switch`, `/model` ou `/max-tokens` propaga para o daemon: ele relê a escolha **antes de cada mensagem**, então uma conversa em andamento no Telegram passa a responder com o novo modelo sem reiniciar o gateway.

Como o daemon roda em um **processo separado**, a sincronização passa por um pequeno arquivo de estado em `~/.chatcli/runtime_model.json` que a sessão interativa escreve e o daemon lê. Isso resolve os dois casos: **subir o gateway depois** de trocar o modelo, e **trocar com o gateway já rodando**.

<Note>
  Ao trocar de **provider**, o daemon adota o provider novo já com o modelo correto dele — desde que as credenciais desse provider estejam no ambiente que o daemon herdou (normalmente o seu `.env`). Ajustes que vivem só em memória, como `/switch --realm` / `--agent-id` do StackSpot, **não** propagam por esse arquivo; defina-os via variável de ambiente ou reinicie o gateway.
</Note>

***

## Respostas conversacionais (não "tom de coder")

O gateway usa o mesmo motor do `/coder` — **todas as ferramentas** (ler/editar arquivos, shell, web, MCP) continuam disponíveis — mas com uma **voz própria, conversacional**. A resposta final é a **mensagem que a pessoa lê no chat**, não um resumo técnico de commit: texto direto e natural, sem tabelas, banners, ASCII art ou blocos de código longos (a menos que peçam código). Internamente isso é um system prompt dedicado do gateway, aplicado no lugar do prompt de coder, preservando a mecânica de tool-use.

### Idioma dinâmico (segue quem fala)

A resposta sai **no idioma da mensagem do usuário**, detectado **a cada turno** — e não preso à locale do daemon. Português → responde em português; espanhol → espanhol; e assim por diante. A diretiva de idioma dinâmica é aplicada em **todos** os caminhos do gateway (inclusive com persona ativa), então a resposta nunca fica estática num idioma só. No **CLI interativo**, a diretiva fixa por locale (`CHATCLI_LANG`) continua valendo — quem muda é só o gateway.

***

## Exemplo de uso

```text theme={"system"}
export LLM_PROVIDER=CLAUDEAI
export ANTHROPIC_API_KEY=sk-ant-...
export CHATCLI_TELEGRAM_BOT_TOKEN=123456:ABC...
export CHATCLI_TELEGRAM_ALLOWED_USERS=111111111
chatcli
> /gateway start
  OK Gateway iniciado (pid=4821) em: telegram. Logs: ~/.chatcli/gateway.log
```

No Telegram, o usuário `111111111` manda:

> *"liste os arquivos Go alterados no último commit e resuma o diff"*

O bot mostra "digitando…", manda o progresso enquanto o agente roda `git` e lê os arquivos, e termina com o resumo escrito como mensagem de chat. Uma mensagem de quem não está em `CHATCLI_TELEGRAM_ALLOWED_USERS` não recebe resposta.

***

## Mensagens de voz (transcrição)

O gateway aceita **voice notes e áudio** em todos os canais. A mensagem é **transcrita para texto antes do pipeline** — então funciona com **qualquer um dos 14 providers de chat** (eles só veem texto; não exige modelo multimodal nem redesenho de mensagem). O adapter baixa a mídia, transcreve, e o agente trata como um pedido em texto normal — a transcrição é inclusive gravada no [Conversation Hub](/pt/gateway/conversation-hub).

| Canal | Origem da voz |
| - | - |
| Telegram | nota de voz / áudio (`getFile` → download) |
| WhatsApp | mensagem de áudio (lookup da Graph media API) |
| Discord | anexo `audio/*` (CDN) |
| Slack | arquivo `audio/*` (`url_private`, com bearer token) |
| Webhook | `audio_b64` (inline base64) ou `audio_url` |

### Backend de transcrição (zero-config, local-first, keyless)

A seleção segue **local/sem-chave primeiro** — e desde a v1.135 tem um **piso embutido**: sem nada configurado, o gateway usa o **Whisper embarcado** (multilíngue, via [sherpa-onnx](/pt/gateway/text-to-speech) — o mesmo engine do TTS Kokoro), sem API key e sem cgo. O daemon **pré-baixa engine + modelo no startup**, então a primeira nota de voz já chega com tudo pronto.

1. **`CHATCLI_TRANSCRIPTION_CMD`** — um comando STT local seu (qualquer wrapper). Lê o transcript do **stdout**, ou do `.txt` escrito em `{output_dir}`.
2. **`CHATCLI_TRANSCRIPTION_URL`** — endpoint OpenAI-compatível **self-hosted** (whisper.cpp `whisper-server`, faster-whisper, Speaches). Keyless (a menos que `CHATCLI_TRANSCRIPTION_KEY`).
3. **Whisper embarcado já provisionado** — se o cache (`~/.cache/chatcli/stt/`) já tem engine + modelo, ele vence qualquer chave de cloud.
4. **whisper CLI no PATH** — se houver `whisper` (openai-whisper) ou `whisper-cli` (whisper.cpp), é usado **automaticamente, com zero config**. O modelo ggml é **baixado uma vez** para o cache (`~/.cache/chatcli/whisper/`), como o faster-whisper faz.
5. **`GROQ_API_KEY`** → Groq Whisper (free tier).
6. **`OPENAI_API_KEY`** → OpenAI Whisper.
7. **nada configurado** → **Whisper embarcado**: download único (engine \~25MB + modelo `base` \~200MB) na subida do daemon. Só plataformas sem engine prebuilt (fora de Linux/macOS/Windows x64/arm64) caem na dica de configuração.

`CHATCLI_TRANSCRIPTION_PROVIDER` fixa um backend (`embedded|command|url|groq|openai`) — `=embedded` força o motor embarcado mesmo com whisper/keys presentes. `CHATCLI_TRANSCRIPTION_MODEL` escolhe o tamanho do modelo embarcado (`tiny|base|small|medium|large-v3`, default `base`) ou o modelo cloud; `_LANG` fixa o idioma (default: auto-detecção do idioma falado); `CHATCLI_TRANSCRIPTION_CACHE_DIR` realoca o cache (path absoluto — útil para pré-seed air-gapped); `CHATCLI_GATEWAY_MAX_AUDIO_BYTES` limita o tamanho do download (default 20MB). O backend ativo aparece em `/config integrations`.

<Note>
  **Voice notes são OGG/Opus.** O motor embarcado decodifica WAV e OGG/Opus sozinho, então voice notes do Telegram, WhatsApp e Discord funcionam sem instalar mais nada; ele só precisa de **ffmpeg** para MP3, M4A/AAC, FLAC e WMA. Um **whisper.cpp** local não decodifica Opus e precisa de ffmpeg, que o gateway então usa para converter para WAV 16 kHz automaticamente. Backends cloud e self-hosted decodificam no servidor. O idioma é detectado pelo áudio, então a transcrição, e a resposta, seguem o idioma falado.
</Note>

#### Setup rápido

**Zero-config** (Whisper embarcado — recomendado):

```bash theme={"system"}
/gateway start             # o daemon baixa engine + modelo na 1ª subida
```

100% local com whisper.cpp (se preferir o engine ggml):

```bash theme={"system"}
brew install whisper-cpp ffmpeg          # macOS  (Linux: apt/dnf; Windows: scoop/winget); o ffmpeg decodifica Opus para ele
# nada mais: o chatcli detecta o whisper-cli, baixa o modelo no 1º uso e converte com o ffmpeg
```

Self-hosted (um servidor whisper que decodifica Opus):

```bash theme={"system"}
export CHATCLI_TRANSCRIPTION_URL="http://localhost:8080/v1"   # keyless
```

Cloud (decodifica Opus no servidor, nada instalado localmente):

```bash theme={"system"}
export CHATCLI_TRANSCRIPTION_PROVIDER=openai   # usa OPENAI_API_KEY (ou =groq com GROQ_API_KEY)
```

Depois de configurar, reinicie o daemon (`/gateway stop && /gateway start`) e mande um áudio.

***

## Respostas em voz

No **Telegram** o caminho de volta também fala: por padrão (`CHATCLI_GATEWAY_VOICE_REPLY=auto`) uma voice note recebe voice note e texto recebe texto, com qualquer backend TTS, incluindo o [motor embarcado Kokoro](/pt/gateway/text-to-speech) (offline, sem API key). Cada conversa liga ou desliga em linguagem natural ("responde em áudio", "para de mandar áudio") pela tool `@voice`, e a escolha fica salva por conversa. Os outros canais respondem em texto: o gateway não sintetiza áudio para eles. Detalhes em **[Respostas em voz](/pt/gateway/voice-replies)**.

## Imagens

Uma foto ou arquivo de imagem numa mensagem é anexado ao turno para o modelo ver, com visão nativa quando o modelo suporta; uma imagem enviada sem texto recebe uma instrução padrão para descrevê-la. Quando o agente **gera uma imagem** durante o turno, a primeira volta com a resposta em todos os canais; defina `CHATCLI_GATEWAY_IMAGE_REPLY=never` para enviar só texto.

O gateway também trata o **índice de memória** do usuário como conhecimento real: perguntas pessoais ("o que você sabe sobre mim?") consultam a [memória persistente](/pt/context/bootstrap-memory) via `@memory recall` antes de qualquer "não sei".

***

## Continuidade cross-channel

Quando o **[Conversation Hub](/pt/gateway/conversation-hub)** está ativo (padrão), o gateway compartilha a conversa com o chatcli do seu notebook: um assunto começado no Telegram continua no terminal e vice-versa. Cada mensagem recebida resolve o **principal** do remetente, lê o contexto recente e grava o turno no hub — então o que você falou no notebook aparece como contexto no Telegram, sem configurar nada (modo single-user). Para push em tempo real ao CLI conectado, rode o gateway **dentro do servidor** com `CHATCLI_GATEWAY_IN_SERVER=true`. Bots multi-usuário usam `CHATCLI_HUB_ISOLATE=true` + bindings. Detalhes em [Conversation Hub](/pt/gateway/conversation-hub).

***

## Vínculo de sessão pelo canal

Por cima do hub efêmero, usuários do canal podem vincular a conversa a uma **sessão nomeada salva** — a camada durável e cross-surface — enviando comandos `/session` no chat:

| Comando | Efeito |
| - | - |
| `/session attach <nome>` | Vincula o remetente à sessão nomeada (cria se ainda não existir). A thread do hub é rotacionada para o backlog antigo não se misturar com a sessão vinculada. |
| `/session detach` | Remove o vínculo; os turnos voltam ao contexto só do hub. |
| `/session status` | Mostra se o remetente está vinculado, e a qual sessão. |
| `/session save <nome>` | Tira um snapshot da conversa atual do hub para o store sob `<nome>` e vincula a ele. |
| `/session list` | Lista as sessões salvas. |
| `/session new` | Desvincula e rotaciona a thread do hub — uma conversa nova. |

Enquanto vinculado, o contexto do turno vem do **arquivo da sessão nomeada** — que carrega os turnos que outras superfícies (REPL do terminal, servidor MCP/ACP, outro canal) gravaram via write-through — e cada turno concluído do gateway é acrescentado a esse mesmo arquivo. Ou seja: `/session attach projeto-x` no WhatsApp continua exatamente a conversa que você começou com `/session attach projeto-x` no terminal ou na IDE. O binding é **por principal** (remetente) e persistido nas runtime settings do hub, então sobrevive a restarts do daemon.

<Note>
  `/session delete` deliberadamente **não** é exposto aos canais: uma conversa de gateway pode ser multi-usuário, e destruir estado do store continua sendo decisão de operador/REPL. E uma mensagem que apenas começa com `/` mas não é um comando de sessão flui para o modelo como texto normal do usuário — o input nunca é sequestrado.
</Note>

O modelo de write-through / last-writer-wins por trás disso está descrito em [Continuidade cross-surface](/pt/context/session-management#continuidade-cross-surface).

***

## Veja também

<CardGroup cols={2}>
  <Card title="Conversation Hub" icon="share-nodes" href="/pt/gateway/conversation-hub">
    Uma conversa só entre os canais e o seu terminal.
  </Card>

  <Card title="Mensagens proativas" icon="paper-plane" href="/pt/gateway/proactive-messaging">
    Deixe o agente mandar a primeira mensagem num canal com `@send`.
  </Card>

  <Card title="Gerenciamento de sessões" icon="clock-rotate-left" href="/pt/context/session-management">
    Sessões nomeadas compartilhadas por todas as superfícies.
  </Card>

  <Card title="Variáveis de ambiente" icon="rectangle-list" href="/pt/reference/environment-variables#chat-gateway-telegram-slack-discord-whatsapp-webhook">
    Todas as configurações do gateway numa tabela.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.