chore(i18n): refresh pt-BR translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-18 05:33:04 +00:00
parent cfa2d9c970
commit 7e561b7568
11 changed files with 2212 additions and 2288 deletions

View File

@ -1,34 +1,34 @@
---
read_when:
- Você precisa explicar o workspace do agente ou seu layout de arquivos
- Você quer fazer backup ou migrar um workspace de agente
summary: 'Workspace do agente: localização, layout e estratégia de backup'
title: Workspace do agente
- Você precisa explicar o espaço de trabalho do agente ou seu layout de arquivos
- Você quer fazer backup ou migrar um espaço de trabalho do agente
summary: 'Espaço de trabalho do agente: local, layout e estratégia de backup'
title: Espaço de trabalho do agente
x-i18n:
generated_at: "2026-04-05T12:39:17Z"
generated_at: "2026-04-18T05:24:44Z"
model: gpt-5.4
provider: openai
source_hash: 3735633f1098c733415369f9836fdbbc0bf869636a24ed42e95e6784610d964a
source_hash: dd2e74614d8d45df04b1bbda48e2224e778b621803d774d38e4b544195eb234e
source_path: concepts/agent-workspace.md
workflow: 15
---
# Workspace do agente
# Espaço de trabalho do agente
O workspace é a casa do agente. É o único diretório de trabalho usado para
ferramentas de arquivo e para o contexto do workspace. Mantenha-o privado e trate-o como memória.
O espaço de trabalho é a casa do agente. É o único diretório de trabalho usado para
ferramentas de arquivo e para o contexto do espaço de trabalho. Mantenha-o privado e trate-o como memória.
Isso é separado de `~/.openclaw/`, que armazena configuração, credenciais e
sessões.
**Importante:** o workspace é o **cwd padrão**, não um sandbox rígido. As ferramentas
resolvem caminhos relativos em relação ao workspace, mas caminhos absolutos ainda podem alcançar
outros locais no host, a menos que o sandboxing esteja habilitado. Se você precisar de isolamento, use
[`agents.defaults.sandbox`](/gateway/sandboxing) (e/ou configuração de sandbox por agente).
Quando o sandboxing está habilitado e `workspaceAccess` não é `"rw"`, as ferramentas operam
dentro de um workspace em sandbox em `~/.openclaw/sandboxes`, e não no workspace do seu host.
**Importante:** o espaço de trabalho é o **cwd padrão**, não um sandbox rígido. As ferramentas
resolvem caminhos relativos em relação ao espaço de trabalho, mas caminhos absolutos ainda podem alcançar
outras partes do host, a menos que o sandboxing esteja ativado. Se você precisar de isolamento, use
[`agents.defaults.sandbox`](/pt-BR/gateway/sandboxing) (e/ou a configuração de sandbox por agente).
Quando o sandboxing está ativado e `workspaceAccess` não é `"rw"`, as ferramentas operam
dentro de um espaço de trabalho em sandbox em `~/.openclaw/sandboxes`, e não no seu espaço de trabalho do host.
## Localização padrão
## Local padrão
- Padrão: `~/.openclaw/workspace`
- Se `OPENCLAW_PROFILE` estiver definido e não for `"default"`, o padrão passa a ser
@ -44,43 +44,42 @@ dentro de um workspace em sandbox em `~/.openclaw/sandboxes`, e não no workspac
```
`openclaw onboard`, `openclaw configure` ou `openclaw setup` criarão o
workspace e semearão os arquivos de bootstrap se estiverem ausentes.
Cópias de semente de sandbox aceitam apenas arquivos regulares dentro do workspace; aliases de symlink/hardlink
que resolvem fora do workspace de origem são ignorados.
espaço de trabalho e preencherão os arquivos de bootstrap se eles estiverem ausentes.
Cópias de seed de sandbox aceitam apenas arquivos regulares dentro do espaço de trabalho; aliases de symlink/hardlink
que resolvem para fora do espaço de trabalho de origem são ignorados.
Se você já gerencia os arquivos do workspace por conta própria, pode desabilitar
a criação de arquivos de bootstrap:
Se você já gerencia os arquivos do espaço de trabalho por conta própria, pode desativar a criação de arquivos de bootstrap:
```json5
{ agent: { skipBootstrap: true } }
```
## Pastas extras de workspace
## Pastas extras de espaço de trabalho
Instalações mais antigas podem ter criado `~/openclaw`. Manter vários diretórios de workspace
pode causar divergência confusa de autenticação ou estado, porque apenas um
workspace fica ativo por vez.
Instalações mais antigas podem ter criado `~/openclaw`. Manter vários diretórios de espaço de trabalho
pode causar deriva confusa de autenticação ou estado, porque apenas um
espaço de trabalho fica ativo por vez.
**Recomendação:** mantenha um único workspace ativo. Se você não usa mais as
**Recomendação:** mantenha um único espaço de trabalho ativo. Se você não usa mais as
pastas extras, arquive-as ou mova-as para a Lixeira (por exemplo `trash ~/openclaw`).
Se você intencionalmente mantém vários workspaces, verifique se
`agents.defaults.workspace` aponta para o que está ativo.
Se você intencionalmente mantém vários espaços de trabalho, certifique-se de que
`agents.defaults.workspace` aponte para o ativo.
`openclaw doctor` avisa quando detecta diretórios extras de workspace.
`openclaw doctor` avisa quando detecta diretórios extras de espaço de trabalho.
## Mapa de arquivos do workspace (o que cada arquivo significa)
## Mapa de arquivos do espaço de trabalho (o que cada arquivo significa)
Estes são os arquivos padrão que o OpenClaw espera dentro do workspace:
Estes são os arquivos padrão que o OpenClaw espera dentro do espaço de trabalho:
- `AGENTS.md`
- Instruções operacionais para o agente e como ele deve usar a memória.
- Carregado no início de cada sessão.
- Bom lugar para regras, prioridades e detalhes de "como se comportar".
- Carregado no início de toda sessão.
- Bom lugar para regras, prioridades e detalhes de “como se comportar”.
- `SOUL.md`
- Persona, tom e limites.
- Carregado em toda sessão.
- Guia: [Guia de personalidade do SOUL.md](/concepts/soul)
- Guia: [Guia de personalidade do SOUL.md](/pt-BR/concepts/soul)
- `USER.md`
- Quem é o usuário e como se dirigir a ele.
@ -91,72 +90,72 @@ Estes são os arquivos padrão que o OpenClaw espera dentro do workspace:
- Criado/atualizado durante o ritual de bootstrap.
- `TOOLS.md`
- Observações sobre suas ferramentas locais e convenções.
- Notas sobre suas ferramentas locais e convenções.
- Não controla a disponibilidade de ferramentas; é apenas orientação.
- `HEARTBEAT.md`
- Pequena checklist opcional para execuções de heartbeat.
- Mantenha-a curta para evitar gasto de tokens.
- Pequeno checklist opcional para execuções de Heartbeat.
- Mantenha-o curto para evitar consumo de tokens.
- `BOOT.md`
- Checklist opcional de inicialização executada na reinicialização do gateway quando hooks internos estão habilitados.
- Mantenha-a curta; use a ferramenta de mensagem para envios de saída.
- Checklist opcional de inicialização executado na reinicialização do gateway quando hooks internos estão ativados.
- Mantenha-o curto; use a ferramenta de mensagem para envios de saída.
- `BOOTSTRAP.md`
- Ritual único da primeira execução.
- Só é criado para um workspace totalmente novo.
- Exclua-o depois que o ritual for concluído.
- Criado apenas para um espaço de trabalho totalmente novo.
- Exclua-o depois que o ritual estiver concluído.
- `memory/YYYY-MM-DD.md`
- Log diário de memória (um arquivo por dia).
- Recomenda-se ler hoje + ontem no início da sessão.
- Recomenda-se ler o de hoje + o de ontem no início da sessão.
- `MEMORY.md` (opcional)
- Memória de longo prazo curada.
- Carregue apenas na sessão principal e privada (não em contextos compartilhados/de grupo).
Consulte [Memória](/concepts/memory) para o fluxo de trabalho e o flush automático de memória.
Consulte [Memória](/pt-BR/concepts/memory) para o fluxo de trabalho e o flush automático de memória.
- `skills/` (opcional)
- Skills específicas do workspace.
- Local de Skills com maior precedência para esse workspace.
- Substitui Skills de agente do projeto, Skills pessoais do agente, Skills gerenciadas, Skills incluídas e `skills.load.extraDirs` quando há colisão de nomes.
- Skills específicos do espaço de trabalho.
- Local de Skills com maior precedência para esse espaço de trabalho.
- Sobrescreve skills de agente do projeto, skills de agente pessoais, skills gerenciados, skills empacotados e `skills.load.extraDirs` quando os nomes entram em conflito.
- `canvas/` (opcional)
- Arquivos de UI de canvas para exibições de nós (por exemplo `canvas/index.html`).
- Arquivos da UI Canvas para exibições de Node (por exemplo `canvas/index.html`).
Se qualquer arquivo de bootstrap estiver ausente, o OpenClaw injeta um marcador de "arquivo ausente" na
Se algum arquivo de bootstrap estiver ausente, o OpenClaw injeta um marcador de “arquivo ausente” na
sessão e continua. Arquivos grandes de bootstrap são truncados quando injetados;
ajuste os limites com `agents.defaults.bootstrapMaxChars` (padrão: 20000) e
`agents.defaults.bootstrapTotalMaxChars` (padrão: 150000).
`openclaw setup` pode recriar padrões ausentes sem sobrescrever arquivos
existentes.
ajuste os limites com `agents.defaults.bootstrapMaxChars` (padrão: 12000) e
`agents.defaults.bootstrapTotalMaxChars` (padrão: 60000).
`openclaw setup` pode recriar padrões ausentes sem sobrescrever
arquivos existentes.
## O que NÃO está no workspace
## O que NÃO está no espaço de trabalho
Estes ficam em `~/.openclaw/` e NÃO devem ser commitados no repositório do workspace:
Estes ficam em `~/.openclaw/` e NÃO devem ser versionados no repositório do espaço de trabalho:
- `~/.openclaw/openclaw.json` (configuração)
- `~/.openclaw/agents/<agentId>/agent/auth-profiles.json` (perfis de autenticação de modelo: OAuth + chaves de API)
- `~/.openclaw/credentials/` (estado de canal/provedor mais dados legados de importação de OAuth)
- `~/.openclaw/credentials/` (estado de canal/provedor mais dados legados de importação OAuth)
- `~/.openclaw/agents/<agentId>/sessions/` (transcrições de sessão + metadados)
- `~/.openclaw/skills/` (Skills gerenciadas)
- `~/.openclaw/skills/` (skills gerenciados)
Se você precisar migrar sessões ou configuração, copie-as separadamente e mantenha-as
fora do controle de versão.
## Backup com Git (recomendado, privado)
Trate o workspace como memória privada. Coloque-o em um repositório git **privado** para que ele tenha
Trate o espaço de trabalho como memória privada. Coloque-o em um repositório git **privado** para que tenha
backup e possa ser recuperado.
Execute estas etapas na máquina em que o Gateway é executado (é lá que o
workspace fica).
Execute estas etapas na máquina em que o Gateway roda (é lá que o
espaço de trabalho fica).
### 1) Inicialize o repositório
Se o git estiver instalado, workspaces totalmente novos são inicializados automaticamente. Se este
workspace ainda não for um repositório, execute:
Se o git estiver instalado, espaços de trabalho totalmente novos são inicializados automaticamente. Se este
espaço de trabalho ainda não for um repositório, execute:
```bash
cd ~/.openclaw/workspace
@ -165,14 +164,14 @@ git add AGENTS.md SOUL.md TOOLS.md IDENTITY.md USER.md HEARTBEAT.md memory/
git commit -m "Add agent workspace"
```
### 2) Adicione um remoto privado (opções amigáveis para iniciantes)
### 2) Adicione um remote privado (opções amigáveis para iniciantes)
Opção A: interface web do GitHub
1. Crie um novo repositório **privado** no GitHub.
2. Não inicialize com um README (evita conflitos de merge).
3. Copie a URL remota HTTPS.
4. Adicione o remoto e faça push:
3. Copie a URL HTTPS do remote.
4. Adicione o remote e faça o push:
```bash
git branch -M main
@ -191,8 +190,8 @@ Opção C: interface web do GitLab
1. Crie um novo repositório **privado** no GitLab.
2. Não inicialize com um README (evita conflitos de merge).
3. Copie a URL remota HTTPS.
4. Adicione o remoto e faça push:
3. Copie a URL HTTPS do remote.
4. Adicione o remote e faça o push:
```bash
git branch -M main
@ -209,16 +208,16 @@ git commit -m "Update memory"
git push
```
## Não faça commit de segredos
## Não versione segredos
Mesmo em um repositório privado, evite armazenar segredos no workspace:
Mesmo em um repositório privado, evite armazenar segredos no espaço de trabalho:
- Chaves de API, tokens OAuth, senhas ou credenciais privadas.
- Qualquer coisa em `~/.openclaw/`.
- Dumps brutos de chats ou anexos sensíveis.
Se você precisar armazenar referências sensíveis, use placeholders e mantenha o
segredo real em outro lugar (gerenciador de senhas, variáveis de ambiente ou `~/.openclaw/`).
Se você precisar armazenar referências sensíveis, use placeholders e mantenha o segredo real em outro lugar
(gerenciador de senhas, variáveis de ambiente ou `~/.openclaw/`).
Sugestão de `.gitignore` inicial:
@ -230,24 +229,24 @@ Sugestão de `.gitignore` inicial:
**/secrets*
```
## Movendo o workspace para uma nova máquina
## Movendo o espaço de trabalho para uma nova máquina
1. Clone o repositório no caminho desejado (padrão `~/.openclaw/workspace`).
1. Clone o repositório para o caminho desejado (o padrão é `~/.openclaw/workspace`).
2. Defina `agents.defaults.workspace` para esse caminho em `~/.openclaw/openclaw.json`.
3. Execute `openclaw setup --workspace <path>` para semear qualquer arquivo ausente.
4. Se precisar de sessões, copie `~/.openclaw/agents/<agentId>/sessions/` da
3. Execute `openclaw setup --workspace <path>` para preencher quaisquer arquivos ausentes.
4. Se você precisar das sessões, copie `~/.openclaw/agents/<agentId>/sessions/` da
máquina antiga separadamente.
## Observações avançadas
## Notas avançadas
- O roteamento de múltiplos agentes pode usar workspaces diferentes por agente. Consulte
[Roteamento de canal](/channels/channel-routing) para configuração de roteamento.
- Se `agents.defaults.sandbox` estiver habilitado, sessões que não sejam a principal podem usar
workspaces por sessão em sandbox em `agents.defaults.sandbox.workspaceRoot`.
- O roteamento multiagente pode usar diferentes espaços de trabalho por agente. Consulte
[Roteamento de canais](/pt-BR/channels/channel-routing) para a configuração de roteamento.
- Se `agents.defaults.sandbox` estiver ativado, sessões que não sejam a principal podem usar
espaços de trabalho em sandbox por sessão em `agents.defaults.sandbox.workspaceRoot`.
## Relacionados
- [Standing Orders](/automation/standing-orders) — instruções persistentes em arquivos do workspace
- [Heartbeat](/gateway/heartbeat) — arquivo de workspace HEARTBEAT.md
- [Sessão](/concepts/session) — caminhos de armazenamento de sessão
- [Sandboxing](/gateway/sandboxing) — acesso ao workspace em ambientes com sandbox
- [Standing Orders](/pt-BR/automation/standing-orders) — instruções persistentes em arquivos do espaço de trabalho
- [Heartbeat](/pt-BR/gateway/heartbeat) — arquivo `HEARTBEAT.md` do espaço de trabalho
- [Sessão](/pt-BR/concepts/session) — caminhos de armazenamento de sessão
- [Sandboxing](/pt-BR/gateway/sandboxing) — acesso ao espaço de trabalho em ambientes com sandbox

View File

@ -1,40 +1,40 @@
---
read_when:
- Você quer entender o que “contexto” significa no OpenClaw
- Você está depurando por que o modelo “sabe” algo (ou se esqueceu disso)
- Você quer reduzir a sobrecarga de contexto (/context, /status, /compact)
summary: 'Contexto: o que o modelo vê, como ele é construído e como inspecioná-lo'
- Você está depurando por que o modelo “sabe” algo (ou esqueceu)
- Você quer reduzir a sobrecarga de contexto (`/context`, `/status`, `/compact`)
summary: 'Contexto: o que o modelo vê, como ele é criado e como inspecioná-lo'
title: Contexto
x-i18n:
generated_at: "2026-04-12T23:28:01Z"
generated_at: "2026-04-18T05:24:45Z"
model: gpt-5.4
provider: openai
source_hash: 3620db1a8c1956d91a01328966df491388d3a32c4003dc4447197eb34316c77d
source_hash: 477ccb1d9654968d0e904b6846b32b8c14db6b6c0d3d2ec2b7409639175629f9
source_path: concepts/context.md
workflow: 15
---
# Contexto
“Contexto” é **tudo o que o OpenClaw envia ao modelo para uma execução**. Ele é limitado pela **janela de contexto** do modelo (limite de tokens).
“Contexto” é **tudo o que o OpenClaw envia ao modelo em uma execução**. Ele é limitado pela **janela de contexto** do modelo (limite de tokens).
Modelo mental para iniciantes:
- **Prompt do sistema** (construído pelo OpenClaw): regras, ferramentas, lista de Skills, tempo/runtime e arquivos do workspace injetados.
- **Prompt de sistema** (criado pelo OpenClaw): regras, ferramentas, lista de Skills, hora/runtime e arquivos do workspace injetados.
- **Histórico da conversa**: suas mensagens + as mensagens do assistente nesta sessão.
- **Chamadas/resultados de ferramentas + anexos**: saída de comandos, leituras de arquivos, imagens/áudio etc.
Contexto _não é a mesma coisa_ que “memória”: a memória pode ser armazenada em disco e recarregada depois; contexto é o que está dentro da janela atual do modelo.
Contexto _não é a mesma coisa_ que “memória”: a memória pode ser armazenada em disco e recarregada depois; o contexto é o que está dentro da janela atual do modelo.
## Início rápido (inspecionar o contexto)
## Início rápido (inspecionar contexto)
- `/status` → visão rápida de “quão cheia está minha janela?” + configurações da sessão.
- `/context list` → o que está sendo injetado + tamanhos aproximados (por arquivo + totais).
- `/context detail` → detalhamento mais profundo: por arquivo, tamanhos de schema de ferramenta, tamanhos de entrada por skill e tamanho do prompt do sistema.
- `/context list` → o que é injetado + tamanhos aproximados (por arquivo + totais).
- `/context detail` → detalhamento mais profundo: tamanhos por arquivo, por schema de ferramenta, por entrada de Skill e tamanho do prompt de sistema.
- `/usage tokens` → adiciona um rodapé de uso por resposta às respostas normais.
- `/compact` → resume o histórico antigo em uma entrada compacta para liberar espaço na janela.
- `/compact` → resume o histórico mais antigo em uma entrada compacta para liberar espaço na janela.
Veja também: [Comandos de barra](/pt-BR/tools/slash-commands), [Uso de tokens e custos](/pt-BR/reference/token-use), [Compaction](/pt-BR/concepts/compaction).
Veja também: [Comandos slash](/pt-BR/tools/slash-commands), [Uso de tokens e custos](/pt-BR/reference/token-use), [Compaction](/pt-BR/concepts/compaction).
## Exemplo de saída
@ -45,23 +45,23 @@ Os valores variam conforme o modelo, provedor, política de ferramentas e o que
```
🧠 Detalhamento do contexto
Workspace: <workspaceDir>
Bootstrap máx./arquivo: 20,000 chars
Bootstrap máx./arquivo: 12,000 caracteres
Sandbox: mode=non-main sandboxed=false
Prompt do sistema (execução): 38,412 chars (~9,603 tok) (Contexto do projeto 23,901 chars (~5,976 tok))
Prompt de sistema (execução): 38,412 caracteres (~9,603 tok) (Contexto do Projeto 23,901 caracteres (~5,976 tok))
Arquivos do workspace injetados:
- AGENTS.md: OK | bruto 1,742 chars (~436 tok) | injetado 1,742 chars (~436 tok)
- SOUL.md: OK | bruto 912 chars (~228 tok) | injetado 912 chars (~228 tok)
- TOOLS.md: TRUNCADO | bruto 54,210 chars (~13,553 tok) | injetado 20,962 chars (~5,241 tok)
- IDENTITY.md: OK | bruto 211 chars (~53 tok) | injetado 211 chars (~53 tok)
- USER.md: OK | bruto 388 chars (~97 tok) | injetado 388 chars (~97 tok)
- AGENTS.md: OK | bruto 1,742 caracteres (~436 tok) | injetado 1,742 caracteres (~436 tok)
- SOUL.md: OK | bruto 912 caracteres (~228 tok) | injetado 912 caracteres (~228 tok)
- TOOLS.md: TRUNCADO | bruto 54,210 caracteres (~13,553 tok) | injetado 20,962 caracteres (~5,241 tok)
- IDENTITY.md: OK | bruto 211 caracteres (~53 tok) | injetado 211 caracteres (~53 tok)
- USER.md: OK | bruto 388 caracteres (~97 tok) | injetado 388 caracteres (~97 tok)
- HEARTBEAT.md: AUSENTE | bruto 0 | injetado 0
- BOOTSTRAP.md: OK | bruto 0 chars (~0 tok) | injetado 0 chars (~0 tok)
- BOOTSTRAP.md: OK | bruto 0 caracteres (~0 tok) | injetado 0 caracteres (~0 tok)
Lista de Skills (texto do prompt do sistema): 2,184 chars (~546 tok) (12 skills)
Lista de Skills (texto do prompt de sistema): 2,184 caracteres (~546 tok) (12 Skills)
Ferramentas: read, edit, write, exec, process, browser, message, sessions_send, …
Lista de ferramentas (texto do prompt do sistema): 1,032 chars (~258 tok)
Schemas de ferramentas (JSON): 31,988 chars (~7,997 tok) (contam para o contexto; não mostrados como texto)
Lista de ferramentas (texto do prompt de sistema): 1,032 caracteres (~258 tok)
Schemas das ferramentas (JSON): 31,988 caracteres (~7,997 tok) (contam para o contexto; não exibidos como texto)
Ferramentas: (mesmas acima)
Tokens da sessão (em cache): 14,250 total / ctx=32,000
@ -72,14 +72,14 @@ Tokens da sessão (em cache): 14,250 total / ctx=32,000
```
🧠 Detalhamento do contexto (detalhado)
Principais skills (tamanho da entrada no prompt):
- frontend-design: 412 chars (~103 tok)
- oracle: 401 chars (~101 tok)
… (+10 mais skills)
Principais Skills (tamanho da entrada no prompt):
- frontend-design: 412 caracteres (~103 tok)
- oracle: 401 caracteres (~101 tok)
… (+10 mais Skills)
Principais ferramentas (tamanho do schema):
- browser: 9,812 chars (~2,453 tok)
- exec: 6,240 chars (~1,560 tok)
- browser: 9,812 caracteres (~2,453 tok)
- exec: 6,240 caracteres (~1,560 tok)
… (+N mais ferramentas)
```
@ -87,27 +87,27 @@ Principais ferramentas (tamanho do schema):
Tudo o que o modelo recebe conta, incluindo:
- Prompt do sistema (todas as seções).
- Prompt de sistema (todas as seções).
- Histórico da conversa.
- Chamadas de ferramentas + resultados de ferramentas.
- Anexos/transcrições (imagens/áudio/arquivos).
- Resumos de compaction e artefatos de pruning.
- Resumos de Compaction e artefatos de pruning.
- “Wrappers” do provedor ou cabeçalhos ocultos (não visíveis, mas ainda contam).
## Como o OpenClaw constrói o prompt do sistema
## Como o OpenClaw cria o prompt de sistema
O prompt do sistema é **de propriedade do OpenClaw** e reconstruído a cada execução. Ele inclui:
O prompt de sistema é **de propriedade do OpenClaw** e reconstruído a cada execução. Ele inclui:
- Lista de ferramentas + descrições curtas.
- Lista de Skills (apenas metadados; veja abaixo).
- Local do workspace.
- Hora (UTC + hora do usuário convertida, se configurada).
- Lista de Skills (somente metadados; veja abaixo).
- Localização do workspace.
- Hora (UTC + hora convertida do usuário, se configurada).
- Metadados de runtime (host/OS/modelo/thinking).
- Arquivos bootstrap do workspace injetados em **Contexto do projeto**.
- Arquivos bootstrap do workspace injetados em **Contexto do Projeto**.
Detalhamento completo: [Prompt do sistema](/pt-BR/concepts/system-prompt).
Detalhamento completo: [Prompt de sistema](/pt-BR/concepts/system-prompt).
## Arquivos do workspace injetados (Contexto do projeto)
## Arquivos do workspace injetados (Contexto do Projeto)
Por padrão, o OpenClaw injeta um conjunto fixo de arquivos do workspace (se presentes):
@ -117,69 +117,71 @@ Por padrão, o OpenClaw injeta um conjunto fixo de arquivos do workspace (se pre
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (apenas na primeira execução)
- `BOOTSTRAP.md` (somente na primeira execução)
Arquivos grandes são truncados por arquivo usando `agents.defaults.bootstrapMaxChars` (padrão `20000` chars). O OpenClaw também impõe um limite total de injeção de bootstrap entre os arquivos com `agents.defaults.bootstrapTotalMaxChars` (padrão `150000` chars). `/context` mostra os tamanhos **bruto vs injetado** e se houve truncamento.
Arquivos grandes são truncados por arquivo usando `agents.defaults.bootstrapMaxChars` (padrão `12000` caracteres). O OpenClaw também aplica um limite total de injeção de bootstrap entre arquivos com `agents.defaults.bootstrapTotalMaxChars` (padrão `60000` caracteres). `/context` mostra os tamanhos **bruto vs injetado** e se houve truncamento.
Quando ocorre truncamento, o runtime pode injetar um bloco de aviso dentro do prompt em Contexto do projeto. Configure isso com `agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`; padrão `once`).
Quando ocorre truncamento, o runtime pode injetar um bloco de aviso no prompt em Contexto do Projeto. Configure isso com `agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`; padrão `once`).
## Skills: injetadas vs carregadas sob demanda
O prompt do sistema inclui uma **lista de Skills** compacta (nome + descrição + local). Essa lista tem uma sobrecarga real.
O prompt de sistema inclui uma **lista de Skills** compacta (nome + descrição + localização). Essa lista tem sobrecarga real.
As instruções de Skill _não_ são incluídas por padrão. Espera-se que o modelo use `read` no `SKILL.md` da skill **somente quando necessário**.
As instruções da Skill _não_ são incluídas por padrão. Espera-se que o modelo use `read` no `SKILL.md` da Skill **somente quando necessário**.
## Ferramentas: há dois custos
As ferramentas afetam o contexto de duas formas:
As ferramentas afetam o contexto de duas maneiras:
1. **Texto da lista de ferramentas** no prompt do sistema (o que você vê como “Tooling”).
1. **Texto da lista de ferramentas** no prompt de sistema (o que você vê como “Tooling”).
2. **Schemas de ferramentas** (JSON). Eles são enviados ao modelo para que ele possa chamar ferramentas. Eles contam para o contexto mesmo que você não os veja como texto simples.
`/context detail` detalha os maiores schemas de ferramentas para que você possa ver o que mais pesa.
## Comandos, diretivas e "atalhos inline"
Os comandos de barra são tratados pelo Gateway. Existem alguns comportamentos diferentes:
Os comandos slash são tratados pelo Gateway. Há alguns comportamentos diferentes:
- **Comandos autônomos**: uma mensagem que contém apenas `/...` é executada como comando.
- **Diretivas**: `/think`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/model`, `/queue` são removidos antes que o modelo veja a mensagem.
- Mensagens com apenas diretivas persistem as configurações da sessão.
- **Comandos independentes**: uma mensagem que contém apenas `/...` é executada como comando.
- **Diretivas**: `/think`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/model`, `/queue` são removidas antes que o modelo veja a mensagem.
- Mensagens compostas apenas por diretivas persistem as configurações da sessão.
- Diretivas inline em uma mensagem normal funcionam como dicas por mensagem.
- **Atalhos inline** (apenas remetentes permitidos): certos tokens `/...` dentro de uma mensagem normal podem ser executados imediatamente (exemplo: “hey /status”) e são removidos antes que o modelo veja o texto restante.
- **Atalhos inline** (somente remetentes permitidos): certos tokens `/...` dentro de uma mensagem normal podem ser executados imediatamente (exemplo: “hey /status”) e são removidos antes que o modelo veja o texto restante.
Detalhes: [Comandos de barra](/pt-BR/tools/slash-commands).
Detalhes: [Comandos slash](/pt-BR/tools/slash-commands).
## Sessões, compaction e pruning (o que persiste)
## Sessões, Compaction e pruning (o que persiste)
O que persiste entre mensagens depende do mecanismo:
- **Histórico normal** persiste na transcrição da sessão até ser compactado/removido pela política.
- **Histórico normal** persiste na transcrição da sessão até ser compactado/removido por política.
- **Compaction** persiste um resumo na transcrição e mantém intactas as mensagens recentes.
- **Pruning** remove resultados antigos de ferramentas do prompt _em memória_ de uma execução, mas não reescreve a transcrição.
- **Pruning** remove resultados antigos de ferramentas do prompt _em memória_ para uma execução, mas não reescreve a transcrição.
Documentação: [Sessão](/pt-BR/concepts/session), [Compaction](/pt-BR/concepts/compaction), [Session pruning](/pt-BR/concepts/session-pruning).
Docs: [Sessão](/pt-BR/concepts/session), [Compaction](/pt-BR/concepts/compaction), [Session pruning](/pt-BR/concepts/session-pruning).
Por padrão, o OpenClaw usa o mecanismo de contexto `legacy` integrado para montagem e
compaction. Se você instalar um plugin que fornece `kind: "context-engine"` e
selecioná-lo com `plugins.slots.contextEngine`, o OpenClaw delega a montagem do contexto, `/compact` e hooks relacionados ao ciclo de vida do contexto de subagentes a esse
mecanismo. `ownsCompaction: false` não faz fallback automático para o
mecanismo legado; o mecanismo ativo ainda precisa implementar `compact()` corretamente. Veja
[Context Engine](/pt-BR/concepts/context-engine) para a interface conectável completa,
hooks de ciclo de vida e configuração.
Compaction. Se você instalar um Plugin que forneça `kind: "context-engine"` e
selecioná-lo com `plugins.slots.contextEngine`, o OpenClaw delegará a montagem
de contexto, `/compact` e hooks relacionados do ciclo de vida do contexto de
subagentes para esse mecanismo. `ownsCompaction: false` não faz fallback
automático para o mecanismo legado; o mecanismo ativo ainda precisa implementar
`compact()` corretamente. Veja
[Context Engine](/pt-BR/concepts/context-engine) para a interface conectável
completa, hooks de ciclo de vida e configuração.
## O que `/context` realmente informa
`/context` prefere o relatório mais recente do prompt do sistema **construído na execução**, quando disponível:
`/context` prefere o relatório mais recente do prompt de sistema **criado na execução**, quando disponível:
- `System prompt (run)` = capturado da última execução embutida (com suporte a ferramentas) e persistido no armazenamento da sessão.
- `System prompt (estimate)` = calculado dinamicamente quando não existe relatório de execução (ou ao executar por um backend de CLI que não gera o relatório).
- `System prompt (run)` = capturado da última execução incorporada (com capacidade de ferramenta) e persistido no armazenamento da sessão.
- `System prompt (estimate)` = calculado em tempo real quando não existe relatório de execução (ou ao executar por um backend de CLI que não gera o relatório).
De qualquer forma, ele informa tamanhos e principais contribuintes; ele **não** exibe o prompt do sistema completo nem os schemas das ferramentas.
De qualquer forma, ele informa tamanhos e os principais contribuintes; ele **não** mostra o prompt de sistema completo nem os schemas das ferramentas.
## Relacionado
## Relacionados
- [Context Engine](/pt-BR/concepts/context-engine) — injeção de contexto personalizada via plugins
- [Compaction](/pt-BR/concepts/compaction) — resumindo conversas longas
- [Prompt do sistema](/pt-BR/concepts/system-prompt) — como o prompt do sistema é construído
- [Agent Loop](/pt-BR/concepts/agent-loop) — o ciclo completo de execução do agente
- [Context Engine](/pt-BR/concepts/context-engine) — injeção de contexto personalizada via Plugins
- [Compaction](/pt-BR/concepts/compaction) — resumo de conversas longas
- [Prompt de sistema](/pt-BR/concepts/system-prompt) — como o prompt de sistema é criado
- [Loop do agente](/pt-BR/concepts/agent-loop) — o ciclo completo de execução do agente

View File

@ -2,36 +2,32 @@
read_when:
- Estendendo o qa-lab ou o qa-channel
- Adicionando cenários de QA com suporte do repositório
- Criando uma automação de QA com maior realismo em torno do painel do Gateway
summary: Forma da automação privada de QA para qa-lab, qa-channel, cenários com seed e relatórios de protocolo
- Criando automação de QA com maior realismo em torno do painel do Gateway
summary: Formato privado de automação de QA para qa-lab, qa-channel, cenários com seed e relatórios de protocolo
title: Automação E2E de QA
x-i18n:
generated_at: "2026-04-17T05:36:09Z"
generated_at: "2026-04-18T05:24:45Z"
model: gpt-5.4
provider: openai
source_hash: 51f97293c184d7c04c95d9858305668fbc0f93273f587ec7e54896ad5d603ab0
source_hash: adf8c5f74e8fabdc8e9fd7ecd41afce8b60354c7dd24d92ac926d3c527927cd4
source_path: concepts/qa-e2e-automation.md
workflow: 15
---
# Automação E2E de QA
A stack privada de QA foi feita para exercitar o OpenClaw de uma forma mais realista,
no formato de canais, do que um único teste unitário consegue.
A pilha privada de QA foi projetada para exercitar o OpenClaw de uma forma mais realista e com formato de canal do que um único teste unitário consegue.
Peças atuais:
- `extensions/qa-channel`: canal de mensagens sintético com superfícies de DM, canal, thread,
reação, edição e exclusão.
- `extensions/qa-lab`: UI de depuração e barramento de QA para observar a transcrição,
injetar mensagens recebidas e exportar um relatório em Markdown.
- `qa/`: recursos seed com suporte do repositório para a tarefa inicial e cenários
básicos de QA.
- `extensions/qa-channel`: canal de mensagens sintético com superfícies de DM, canal, thread, reação, edição e exclusão.
- `extensions/qa-lab`: UI de depuração e barramento de QA para observar a transcrição, injetar mensagens de entrada e exportar um relatório em Markdown.
- `qa/`: recursos com seed mantidos no repositório para a tarefa inicial e cenários básicos de QA.
O fluxo atual do operador de QA é um site de QA com dois painéis:
- Esquerda: painel do Gateway (Control UI) com o agente.
- Direita: QA Lab, mostrando a transcrição em estilo Slack e o plano de cenário.
- Direita: QA Lab, mostrando a transcrição em estilo Slack e o plano do cenário.
Execute com:
@ -39,13 +35,9 @@ Execute com:
pnpm qa:lab:up
```
Isso compila o site de QA, inicia a lane do gateway com suporte de Docker e expõe a
página do QA Lab, onde um operador ou loop de automação pode dar ao agente uma
missão de QA, observar o comportamento real do canal e registrar o que funcionou,
falhou ou permaneceu bloqueado.
Isso compila o site de QA, inicia a lane do Gateway com Docker e expõe a página do QA Lab, onde um operador ou loop de automação pode dar ao agente uma missão de QA, observar o comportamento real do canal e registrar o que funcionou, falhou ou permaneceu bloqueado.
Para uma iteração mais rápida da UI do QA Lab sem reconstruir a imagem Docker a cada vez,
inicie a stack com um bundle do QA Lab montado por bind mount:
Para uma iteração mais rápida da UI do QA Lab sem recompilar a imagem Docker a cada vez, inicie a pilha com um bundle do QA Lab montado por bind:
```bash
pnpm openclaw qa docker-build-image
@ -54,144 +46,108 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast` mantém os serviços Docker em uma imagem pré-compilada e faz bind mount de
`extensions/qa-lab/web/dist` no contêiner `qa-lab`. `qa:lab:watch`
recompila esse bundle quando há mudanças, e o navegador recarrega automaticamente quando o hash
do recurso do QA Lab muda.
`qa:lab:up:fast` mantém os serviços Docker em uma imagem pré-compilada e monta por bind `extensions/qa-lab/web/dist` no contêiner `qa-lab`. `qa:lab:watch` recompila esse bundle a cada alteração, e o navegador recarrega automaticamente quando o hash de recursos do QA Lab muda.
Para uma lane de smoke do Matrix com transporte real, execute:
Para uma lane de smoke real de transporte com Matrix, execute:
```bash
pnpm openclaw qa matrix
```
Essa lane provisiona um homeserver Tuwunel descartável no Docker, registra usuários
temporários de driver, SUT e observador, cria uma sala privada e então executa
o Plugin real do Matrix dentro de um filho de gateway de QA. A lane de transporte ao vivo mantém
a configuração do filho restrita ao transporte em teste, então o Matrix roda sem
`qa-channel` na configuração do filho. Ela grava os artefatos do relatório estruturado e
um log combinado de stdout/stderr no diretório de saída de QA do Matrix selecionado. Para
capturar também a saída externa de compilação/launcher de `scripts/run-node.mjs`, defina
`OPENCLAW_RUN_NODE_OUTPUT_LOG=<path>` para um arquivo de log local ao repositório.
Essa lane provisiona um homeserver Tuwunel descartável no Docker, registra usuários temporários de driver, SUT e observador, cria uma sala privada e então executa o Plugin real do Matrix dentro de um processo filho de Gateway de QA. A lane de transporte ao vivo mantém a configuração filha restrita ao transporte em teste, para que o Matrix seja executado sem `qa-channel` na configuração filha. Ela grava os artefatos estruturados do relatório e um log combinado de stdout/stderr no diretório de saída de Matrix QA selecionado. Para capturar também a saída externa de compilação/inicialização de `scripts/run-node.mjs`, defina `OPENCLAW_RUN_NODE_OUTPUT_LOG=<path>` para um arquivo de log local ao repositório.
Para uma lane de smoke do Telegram com transporte real, execute:
Para uma lane de smoke real de transporte com Telegram, execute:
```bash
pnpm openclaw qa telegram
```
Essa lane usa um grupo privado real do Telegram em vez de provisionar um
servidor descartável. Ela exige `OPENCLAW_QA_TELEGRAM_GROUP_ID`,
`OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` e
`OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, além de dois bots distintos no mesmo
grupo privado. O bot SUT precisa ter um nome de usuário no Telegram, e a
observação bot-para-bot funciona melhor quando ambos os bots têm o Bot-to-Bot Communication Mode
ativado no `@BotFather`.
Essa lane mira em um grupo privado real do Telegram em vez de provisionar um servidor descartável. Ela requer `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN` e `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`, além de dois bots distintos no mesmo grupo privado. O bot SUT precisa ter um nome de usuário no Telegram, e a observação entre bots funciona melhor quando ambos os bots têm o Bot-to-Bot Communication Mode habilitado em `@BotFather`.
As lanes de transporte ao vivo agora compartilham um contrato menor em vez de cada uma
inventar o próprio formato de lista de cenários.
As lanes de transporte ao vivo agora compartilham um contrato menor em vez de cada uma inventar seu próprio formato de lista de cenários:
`qa-channel` continua sendo a suíte ampla de comportamento sintético do produto e não faz parte
da matriz de cobertura de transporte ao vivo.
`qa-channel` continua sendo a suíte ampla de comportamento sintético do produto e não faz parte da matriz de cobertura de transporte ao vivo.
| Lane | Canary | Bloqueio por menção | Bloqueio por allowlist | Resposta de nível superior | Retomada após reinício | Acompanhamento em thread | Isolamento de thread | Observação de reação | Comando de ajuda |
| -------- | ------ | ------------------- | ---------------------- | -------------------------- | ---------------------- | ------------------------ | -------------------- | -------------------- | ---------------- |
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | | | | | | | | x |
| Lane | Canary | Bloqueio por menção | Bloqueio por allowlist | Resposta de nível superior | Retomada após reinício | Continuação em thread | Isolamento de thread | Observação de reação | Comando de ajuda |
| -------- | ------ | ------------------- | ---------------------- | -------------------------- | ---------------------- | -------------------- | -------------------- | -------------------- | ---------------- |
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | | | | | | | | x |
Isso mantém `qa-channel` como a suíte ampla de comportamento do produto, enquanto Matrix,
Telegram e futuros transportes ao vivo compartilham uma checklist explícita de contrato de transporte.
Isso mantém o `qa-channel` como a suíte ampla de comportamento do produto, enquanto Matrix, Telegram e futuros transportes ao vivo compartilham uma lista explícita de verificação do contrato de transporte.
Para uma lane de VM Linux descartável sem colocar Docker no caminho de QA, execute:
Para uma lane com VM Linux descartável sem trazer Docker para o fluxo de QA, execute:
```bash
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
```
Isso inicializa um guest novo do Multipass, instala dependências, compila o OpenClaw
dentro do guest, executa `qa suite` e então copia o relatório e
resumo normais de QA de volta para `.artifacts/qa-e2e/...` no host.
Isso reutiliza o mesmo comportamento de seleção de cenário de `qa suite` no host.
As execuções da suíte no host e no Multipass executam vários cenários selecionados em paralelo
com workers de gateway isolados por padrão, até 64 workers ou a contagem de cenários
selecionados. Use `--concurrency <count>` para ajustar a quantidade de workers, ou
`--concurrency 1` para execução serial.
As execuções ao vivo encaminham as entradas de autenticação de QA suportadas que são práticas para o
guest: chaves de provider via variável de ambiente, o caminho de configuração do provider ao vivo de QA e
`CODEX_HOME` quando presente. Mantenha `--output-dir` sob a raiz do repositório para que o guest
possa gravar de volta pelo workspace montado.
Isso inicializa um guest novo do Multipass, instala dependências, compila o OpenClaw dentro do guest, executa `qa suite` e então copia o relatório e o resumo normais de QA de volta para `.artifacts/qa-e2e/...` no host.
Ele reutiliza o mesmo comportamento de seleção de cenários de `qa suite` no host.
Execuções da suíte no host e no Multipass executam vários cenários selecionados em paralelo com workers isolados de Gateway por padrão, até 64 workers ou a contagem de cenários selecionada. Use `--concurrency <count>` para ajustar a quantidade de workers, ou `--concurrency 1` para execução serial.
Execuções ao vivo encaminham as entradas compatíveis de autenticação de QA que são práticas para o guest: chaves de provedor baseadas em env, o caminho de configuração do provedor ao vivo de QA e `CODEX_HOME` quando presente. Mantenha `--output-dir` sob a raiz do repositório para que o guest possa gravar de volta por meio do workspace montado.
## Seeds com suporte do repositório
## Seeds mantidos no repositório
Os recursos seed ficam em `qa/`:
Os recursos com seed ficam em `qa/`:
- `qa/scenarios/index.md`
- `qa/scenarios/*.md`
- `qa/scenarios/<theme>/*.md`
Eles ficam intencionalmente no git para que o plano de QA seja visível tanto para humanos
quanto para o agente.
Eles ficam intencionalmente no git para que o plano de QA seja visível tanto para humanos quanto para o agente.
`qa-lab` deve permanecer um executor genérico de Markdown. Cada arquivo Markdown de cenário é
a fonte da verdade para uma execução de teste e deve definir:
O `qa-lab` deve continuar sendo um executor genérico de Markdown. Cada arquivo Markdown de cenário é a fonte da verdade para uma execução de teste e deve definir:
- metadados do cenário
- referências de docs e código
- requisitos opcionais de plugin
- patch opcional de configuração do gateway
- metadados opcionais de categoria, capacidade, lane e risco
- referências de documentação e código
- requisitos opcionais de Plugin
- patch opcional de configuração do Gateway
- o `qa-flow` executável
A superfície de runtime reutilizável que dá suporte ao `qa-flow` pode permanecer genérica
e transversal. Por exemplo, cenários em Markdown podem combinar helpers do lado do transporte
com helpers do lado do navegador que controlam a Control UI embutida por meio da
superfície `browser.request` do Gateway sem adicionar um executor com caso especial.
A superfície de runtime reutilizável que dá suporte ao `qa-flow` pode continuar genérica e transversal. Por exemplo, cenários em Markdown podem combinar helpers do lado do transporte com helpers do lado do navegador que dirigem a Control UI incorporada por meio da interface `browser.request` do Gateway sem adicionar um executor com caso especial.
Os arquivos de cenário devem ser agrupados por capacidade do produto, e não pela pasta da árvore de código-fonte. Mantenha os IDs de cenário estáveis quando os arquivos forem movidos; use `docsRefs` e `codeRefs` para rastreabilidade de implementação.
A lista básica deve permanecer ampla o suficiente para cobrir:
- chat em DM e em canal
- chat em DM e canal
- comportamento de thread
- ciclo de vida de ações de mensagem
- callbacks de Cron
- recuperação de memória
- troca de modelo
- handoff para subagente
- leitura do repositório e de docs
- leitura do repositório e da documentação
- uma pequena tarefa de compilação, como Lobster Invaders
## Lanes de mock de provider
## Lanes de mock de provedor
`qa suite` tem duas lanes locais de mock de provider:
`qa suite` tem duas lanes locais de mock de provedor:
- `mock-openai` é o mock do OpenClaw sensível ao cenário. Ele continua sendo a
lane de mock determinística padrão para QA com suporte do repositório e gates de paridade.
- `aimock` inicia um servidor de provider com suporte do AIMock para cobertura experimental de protocolo,
fixture, gravação/reprodução e caos. Ele é aditivo e não substitui o dispatcher
de cenários do `mock-openai`.
- `mock-openai` é o mock do OpenClaw sensível ao cenário. Ele continua sendo a lane de mock determinística padrão para QA com suporte do repositório e gates de paridade.
- `aimock` inicia um servidor de provedor baseado em AIMock para cobertura experimental de protocolo, fixture, gravação/reprodução e caos. Ele é aditivo e não substitui o despachante de cenários de `mock-openai`.
A implementação da lane de provider fica em `extensions/qa-lab/src/providers/`.
Cada provider é dono dos próprios padrões, inicialização do servidor local, configuração
de modelo do gateway, necessidades de preparação de perfil de autenticação e flags de capacidade
ao vivo/mock. O código compartilhado da suíte e do gateway deve rotear pelo registro de providers em vez de
ramificar com base em nomes de providers.
A implementação da lane de provedor fica em `extensions/qa-lab/src/providers/`.
Cada provedor é responsável por seus padrões, inicialização de servidor local, configuração de modelo do Gateway, necessidades de preparação de perfil de autenticação e flags de capacidade de live/mock. O código compartilhado de suíte e Gateway deve rotear pelo registro de provedores em vez de ramificar pelos nomes dos provedores.
## Adaptadores de transporte
`qa-lab` é dono de uma superfície genérica de transporte para cenários de QA em Markdown.
`qa-channel` é o primeiro adaptador nessa superfície, mas o objetivo do design é mais amplo:
canais futuros, reais ou sintéticos, devem se conectar ao mesmo executor de suíte em vez de
adicionar um executor de QA específico para cada transporte.
O `qa-lab` é responsável por uma interface genérica de transporte para cenários de QA em Markdown.
`qa-channel` é o primeiro adaptador nessa interface, mas o objetivo do design é mais amplo:
canais futuros, reais ou sintéticos, devem se conectar ao mesmo executor de suíte em vez de adicionar um executor de QA específico de transporte.
No nível de arquitetura, a divisão é:
No nível da arquitetura, a divisão é:
- `qa-lab` é dono da execução genérica de cenários, concorrência de workers, gravação de artefatos e relatórios.
- o adaptador de transporte é dono da configuração do gateway, prontidão, observação de entrada e saída, ações de transporte e estado de transporte normalizado.
- arquivos de cenário em Markdown em `qa/scenarios/` definem a execução de teste; `qa-lab` fornece a superfície de runtime reutilizável que os executa.
- `qa-lab` é responsável pela execução genérica de cenários, concorrência de workers, gravação de artefatos e relatórios.
- o adaptador de transporte é responsável pela configuração do Gateway, prontidão, observação de entrada e saída, ações de transporte e estado de transporte normalizado.
- os arquivos de cenário em Markdown sob `qa/scenarios/` definem a execução de teste; o `qa-lab` fornece a superfície de runtime reutilizável que os executa.
A orientação de adoção voltada para maintainers para novos adaptadores de canal está em
A orientação de adoção voltada a mantenedores para novos adaptadores de canal está em
[Testing](/pt-BR/help/testing#adding-a-channel-to-qa).
## Relatórios
`qa-lab` exporta um relatório de protocolo em Markdown a partir da linha do tempo do barramento observado.
O `qa-lab` exporta um relatório de protocolo em Markdown a partir da linha do tempo observada no barramento.
O relatório deve responder:
- O que funcionou
@ -199,8 +155,7 @@ O relatório deve responder:
- O que permaneceu bloqueado
- Quais cenários de acompanhamento valem a pena adicionar
Para verificações de caráter e estilo, execute o mesmo cenário em várias refs de modelos ao vivo
e grave um relatório em Markdown avaliado:
Para verificações de personalidade e estilo, execute o mesmo cenário em várias refs de modelo ao vivo e grave um relatório em Markdown avaliado:
```bash
pnpm openclaw qa character-eval \
@ -219,40 +174,21 @@ pnpm openclaw qa character-eval \
--judge-concurrency 16
```
O comando executa processos filhos locais do gateway de QA, não Docker. Cenários de avaliação de caráter
devem definir a persona por meio de `SOUL.md` e então executar turnos normais de usuário
como chat, ajuda sobre o workspace e pequenas tarefas em arquivos. O modelo candidato
não deve ser informado de que está sendo avaliado. O comando preserva cada transcrição
completa, registra estatísticas básicas da execução e então pede que os modelos juízes, em modo fast com
raciocínio `xhigh`, classifiquem as execuções por naturalidade, vibe e humor.
Use `--blind-judge-models` ao comparar providers: o prompt do juiz ainda recebe
cada transcrição e status da execução, mas as refs candidatas são substituídas por rótulos neutros
como `candidate-01`; o relatório mapeia as classificações de volta para as refs reais após
o parsing.
As execuções dos candidatos usam por padrão `high` thinking, com `xhigh` para modelos OpenAI que
oferecem suporte. Substitua um candidato específico inline com
`--model provider/model,thinking=<level>`. `--thinking <level>` ainda define um fallback
global, e o formato mais antigo `--model-thinking <provider/model=level>` é
mantido por compatibilidade.
As refs candidatas da OpenAI usam o modo fast por padrão para que o processamento prioritário seja usado
quando o provider oferecer suporte. Adicione `,fast`, `,no-fast` ou `,fast=false` inline quando
um único candidato ou juiz precisar de uma substituição. Passe `--fast` apenas quando quiser
forçar o modo fast para todos os modelos candidatos. As durações de candidatos e juízes são
registradas no relatório para análise de benchmark, mas os prompts dos juízes dizem explicitamente
para não classificar com base em velocidade.
As execuções dos modelos candidatos e dos juízes usam concorrência 16 por padrão. Reduza
`--concurrency` ou `--judge-concurrency` quando limites do provider ou pressão no gateway local
tornarem uma execução muito ruidosa.
Quando nenhum `--model` candidato é passado, a avaliação de caráter usa por padrão
O comando executa processos filhos locais de Gateway de QA, não Docker. Os cenários de avaliação de personalidade devem definir a persona por meio de `SOUL.md` e então executar turnos normais de usuário, como chat, ajuda com workspace e pequenas tarefas em arquivos. O modelo candidato não deve ser informado de que está sendo avaliado. O comando preserva cada transcrição completa, registra estatísticas básicas da execução e depois solicita aos modelos juízes, em modo fast, com raciocínio `xhigh`, que classifiquem as execuções por naturalidade, vibe e humor.
Use `--blind-judge-models` ao comparar provedores: o prompt do juiz ainda recebe cada transcrição e status de execução, mas as refs dos candidatos são substituídas por rótulos neutros como `candidate-01`; o relatório remapeia as classificações para as refs reais após o parsing.
As execuções candidatas usam `high` thinking por padrão, com `xhigh` para modelos OpenAI que oferecem suporte. Substitua um candidato específico inline com `--model provider/model,thinking=<level>`. `--thinking <level>` ainda define um fallback global, e o formato mais antigo `--model-thinking <provider/model=level>` é mantido por compatibilidade.
As refs candidatas de OpenAI usam modo fast por padrão para que o processamento prioritário seja usado quando o provedor oferecer suporte. Adicione `,fast`, `,no-fast` ou `,fast=false` inline quando um único candidato ou juiz precisar de substituição. Passe `--fast` apenas quando quiser forçar o modo fast para todos os modelos candidatos. As durações de candidatos e juízes são registradas no relatório para análise de benchmark, mas os prompts dos juízes dizem explicitamente para não classificar por velocidade.
As execuções de modelos candidatos e juízes usam concorrência 16 por padrão. Reduza `--concurrency` ou `--judge-concurrency` quando limites do provedor ou pressão no Gateway local tornarem uma execução muito ruidosa.
Quando nenhum `--model` candidato é informado, a avaliação de personalidade usa por padrão
`openai/gpt-5.4`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5` e
`google/gemini-3.1-pro-preview` quando nenhum `--model` é passado.
Quando nenhum `--judge-model` é passado, os juízes usam por padrão
`google/gemini-3.1-pro-preview` quando nenhum `--model` é informado.
Quando nenhum `--judge-model` é informado, os juízes usam por padrão
`openai/gpt-5.4,thinking=xhigh,fast` e
`anthropic/claude-opus-4-6,thinking=high`.
## Docs relacionadas
## Documentação relacionada
- [Testing](/pt-BR/help/testing)
- [QA Channel](/pt-BR/channels/qa-channel)

View File

@ -1,98 +1,98 @@
---
read_when:
- Editando o texto do prompt de sistema, a lista de ferramentas ou as seções de hora/Heartbeat
- Alterando o bootstrap do workspace ou o comportamento de injeção de Skills
summary: O que o prompt de sistema do OpenClaw contém e como ele é montado
title: Prompt de sistema
- Editar o texto do prompt do sistema, a lista de ferramentas ou as seções de hora/Heartbeat
- Alterar o comportamento de bootstrap do workspace ou de injeção de Skills
summary: O que o prompt do sistema do OpenClaw contém e como ele é montado
title: Prompt do sistema
x-i18n:
generated_at: "2026-04-15T19:41:35Z"
generated_at: "2026-04-18T05:24:44Z"
model: gpt-5.4
provider: openai
source_hash: c740e4646bc4980567338237bfb55126af0df72499ca00a48e4848d9a3608ab4
source_hash: e60705994cebdd9768926168cb1c6d17ab717d7ff02353a5d5e7478ba8191cab
source_path: concepts/system-prompt.md
workflow: 15
---
# Prompt de sistema
# Prompt do sistema
O OpenClaw monta um prompt de sistema personalizado para cada execução de agente. O prompt é **de propriedade do OpenClaw** e não usa o prompt padrão do pi-coding-agent.
O OpenClaw cria um prompt do sistema personalizado para cada execução de agente. O prompt é **de propriedade do OpenClaw** e não usa o prompt padrão do pi-coding-agent.
O prompt é montado pelo OpenClaw e injetado em cada execução de agente.
Plugins de provedor podem contribuir com orientações de prompt com reconhecimento de cache sem substituir todo o prompt de propriedade do OpenClaw. O runtime do provedor pode:
Plugins de provedor podem contribuir com orientações de prompt sensíveis ao cache sem substituir todo o prompt de propriedade do OpenClaw. O runtime do provedor pode:
- substituir um pequeno conjunto de seções centrais nomeadas (`interaction_style`,
- substituir um pequeno conjunto de seções principais nomeadas (`interaction_style`,
`tool_call_style`, `execution_bias`)
- injetar um **prefixo estável** acima do limite de cache do prompt
- injetar um **sufixo dinâmico** abaixo do limite de cache do prompt
Use contribuições de propriedade do provedor para ajustes específicos de famílias de modelos. Mantenha a mutação legada de prompt `before_prompt_build` para compatibilidade ou mudanças de prompt realmente globais, não para o comportamento normal do provedor.
Use contribuições de propriedade do provedor para ajustes específicos por família de modelo. Mantenha a mutação legada de prompt `before_prompt_build` para compatibilidade ou mudanças de prompt realmente globais, e não para comportamento normal de provedor.
## Estrutura
O prompt é intencionalmente compacto e usa seções fixas:
- **Ferramentas**: lembrete da fonte da verdade de ferramentas estruturadas, além de orientações de uso de ferramentas em runtime.
- **Segurança**: lembrete curto de proteção para evitar comportamento de busca de poder ou desvio de supervisão.
- **Ferramentas**: lembrete da fonte da verdade para ferramentas estruturadas, além de orientações de uso de ferramentas em tempo de execução.
- **Segurança**: lembrete curto de proteção para evitar comportamento de busca por poder ou desvio de supervisão.
- **Skills** (quando disponíveis): informa ao modelo como carregar instruções de skill sob demanda.
- **Autoatualização do OpenClaw**: como inspecionar a configuração com segurança usando
`config.schema.lookup`, aplicar patch na configuração com `config.patch`, substituir toda a
configuração com `config.apply` e executar `update.run` somente mediante solicitação explícita do usuário. A ferramenta `gateway`, restrita ao proprietário, também se recusa a reescrever
`config.schema.lookup`, aplicar patch na configuração com `config.patch`, substituir a configuração completa com `config.apply` e executar `update.run` apenas sob solicitação explícita do usuário. A ferramenta `gateway`, exclusiva do proprietário, também se recusa a reescrever
`tools.exec.ask` / `tools.exec.security`, incluindo aliases legados `tools.bash.*`
que são normalizados para esses caminhos protegidos de exec.
- **Workspace**: diretório de trabalho (`agents.defaults.workspace`).
- **Documentação**: caminho local para a documentação do OpenClaw (repositório ou pacote npm) e quando lê-la.
- **Arquivos do Workspace (injetados)**: indica que os arquivos de bootstrap estão incluídos abaixo.
- **Sandbox** (quando habilitado): indica runtime em sandbox, caminhos do sandbox e se exec elevado está disponível.
- **Sandbox** (quando habilitado): indica runtime em sandbox, caminhos do sandbox e se exec com privilégios elevados está disponível.
- **Data e hora atuais**: hora local do usuário, fuso horário e formato de hora.
- **Tags de resposta**: sintaxe opcional de tags de resposta para provedores compatíveis.
- **Heartbeats**: prompt de heartbeat e comportamento de confirmação, quando heartbeats estão habilitados para o agente padrão.
- **Heartbeats**: prompt de heartbeat e comportamento de ack, quando heartbeats estão habilitados para o agente padrão.
- **Runtime**: host, SO, node, raiz do repositório (quando detectada), nível de raciocínio (uma linha).
- **Raciocínio**: nível atual de visibilidade + dica de alternância com /reasoning.
- **Raciocínio**: nível atual de visibilidade + dica do alternador `/reasoning`.
A seção Ferramentas também inclui orientações de runtime para trabalhos de longa duração:
A seção Ferramentas também inclui orientações de runtime para trabalho de longa duração:
- use Cron para acompanhamento futuro (`check back later`, lembretes, trabalho recorrente)
em vez de loops de `exec` com sleep, truques de atraso com `yieldMs` ou polling repetido de `process`
- use `exec` / `process` apenas para comandos que começam agora e continuam rodando
- use cron para acompanhamento futuro (`verifique novamente mais tarde`, lembretes, trabalho recorrente)
em vez de loops de sleep com `exec`, truques de atraso com `yieldMs` ou polling repetido de `process`
- use `exec` / `process` apenas para comandos que começam agora e continuam em execução
em segundo plano
- quando o despertar automático na conclusão estiver habilitado, inicie o comando uma vez e confie no caminho de despertar baseado em push quando ele emitir saída ou falhar
- quando a ativação automática por conclusão estiver habilitada, inicie o comando uma vez e confie
no caminho de ativação baseado em push quando ele emitir saída ou falhar
- use `process` para logs, status, entrada ou intervenção quando precisar
inspecionar um comando em execução
- se a tarefa for maior, prefira `sessions_spawn`; a conclusão de subagentes é
baseada em push e anunciada automaticamente de volta ao solicitante
- se a tarefa for maior, prefira `sessions_spawn`; a conclusão de subagente é
baseada em push e se anuncia automaticamente de volta ao solicitante
- não faça polling de `subagents list` / `sessions_list` em loop apenas para esperar
a conclusão
pela conclusão
Quando a ferramenta experimental `update_plan` está habilitada, Ferramentas também informa ao
modelo para usá-la apenas em trabalhos não triviais de várias etapas, manter exatamente uma
etapa `in_progress` e evitar repetir o plano inteiro após cada atualização.
modelo para usá-la apenas em trabalho não trivial com várias etapas, manter exatamente uma etapa
`in_progress` e evitar repetir o plano inteiro após cada atualização.
As proteções de segurança no prompt de sistema são orientativas. Elas orientam o comportamento do modelo, mas não impõem política. Use política de ferramentas, aprovações de exec, sandboxing e allowlists de canais para imposição rígida; operadores podem desabilitar isso por design.
As proteções de segurança no prompt do sistema são consultivas. Elas orientam o comportamento do modelo, mas não impõem política. Use política de ferramenta, aprovações de exec, sandboxing e listas de permissão de canal para imposição rígida; operadores podem desabilitá-las por design.
Em canais com cartões/botões de aprovação nativos, o prompt de runtime agora instrui o
agente a confiar primeiro nessa interface nativa de aprovação. Ele só deve incluir um comando manual
`/approve` quando o resultado da ferramenta informar que aprovações no chat não estão disponíveis ou
que aprovação manual é o único caminho.
Em canais com cartões/botões de aprovação nativos, o prompt de runtime agora informa ao
agente para confiar primeiro nessa UI nativa de aprovação. Ele só deve incluir um comando manual
`/approve` quando o resultado da ferramenta disser que aprovações no chat não estão disponíveis ou
que a aprovação manual é o único caminho.
## Modos de prompt
O OpenClaw pode renderizar prompts de sistema menores para subagentes. O runtime define um
O OpenClaw pode renderizar prompts do sistema menores para subagentes. O runtime define um
`promptMode` para cada execução (não é uma configuração voltada ao usuário):
- `full` (padrão): inclui todas as seções acima.
- `minimal`: usado para subagentes; omite **Skills**, **Recordação de Memória**, **Autoatualização do OpenClaw**, **Aliases de modelos**, **Identidade do usuário**, **Tags de resposta**,
**Mensageria**, **Respostas silenciosas** e **Heartbeats**. Ferramentas, **Segurança**,
- `minimal`: usado para subagentes; omite **Skills**, **Recuperação de memória**, **Autoatualização do OpenClaw**, **Aliases de modelo**, **Identidade do usuário**, **Tags de resposta**,
**Mensagens**, **Respostas silenciosas** e **Heartbeats**. Ferramentas, **Segurança**,
Workspace, Sandbox, Data e hora atuais (quando conhecidas), Runtime e contexto
injetado continuam disponíveis.
injetado permanecem disponíveis.
- `none`: retorna apenas a linha base de identidade.
Quando `promptMode=minimal`, prompts extras injetados são rotulados como **Contexto do subagente**
em vez de **Contexto de chat em grupo**.
em vez de **Contexto do chat em grupo**.
## Injeção de bootstrap do workspace
Os arquivos de bootstrap são recortados e anexados em **Contexto do projeto** para que o modelo veja o contexto de identidade e perfil sem precisar de leituras explícitas:
Arquivos de bootstrap são aparados e anexados em **Contexto do projeto** para que o modelo veja o contexto de identidade e perfil sem precisar de leituras explícitas:
- `AGENTS.md`
- `SOUL.md`
@ -100,49 +100,49 @@ Os arquivos de bootstrap são recortados e anexados em **Contexto do projeto** p
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (somente em workspaces totalmente novos)
- `MEMORY.md` quando presente, caso contrário `memory.md` como fallback em minúsculas
- `BOOTSTRAP.md` (apenas em workspaces totalmente novos)
- `MEMORY.md` quando presente; caso contrário, `memory.md` como fallback em minúsculas
Todos esses arquivos são **injetados na janela de contexto** em toda rodada, a menos que
se aplique um bloqueio específico do arquivo. `HEARTBEAT.md` é omitido em execuções normais quando
Todos esses arquivos são **injetados na janela de contexto** em cada turno, a menos que
um bloqueio específico do arquivo se aplique. `HEARTBEAT.md` é omitido em execuções normais quando
heartbeats estão desabilitados para o agente padrão ou
`agents.defaults.heartbeat.includeSystemPromptSection` é false. Mantenha os arquivos injetados concisos — especialmente `MEMORY.md`, que pode crescer com o tempo e levar a uso de contexto inesperadamente alto e compaction mais frequente.
> **Observação:** arquivos diários `memory/*.md` **não** fazem parte do Contexto do projeto
> normal do bootstrap. Em rodadas comuns, eles são acessados sob demanda por meio das
> ferramentas `memory_search` e `memory_get`, portanto não contam contra a
> janela de contexto, a menos que o modelo os leia explicitamente. Rodadas simples de `/new` e
> `/reset` são a exceção: o runtime pode antepor memória diária recente
> como um bloco único de contexto inicial para essa primeira rodada.
> **Observação:** arquivos diários `memory/*.md` **não** fazem parte do bootstrap normal de
> Contexto do projeto. Em turnos comuns, eles são acessados sob demanda por meio das
> ferramentas `memory_search` e `memory_get`, então não contam contra a
> janela de contexto a menos que o modelo os leia explicitamente. Turnos simples `/new` e
> `/reset` são a exceção: o runtime pode prefixar memória diária recente
> como um bloco único de contexto de inicialização para esse primeiro turno.
Arquivos grandes são truncados com um marcador. O tamanho máximo por arquivo é controlado por
`agents.defaults.bootstrapMaxChars` (padrão: 20000). O conteúdo total de bootstrap injetado
entre arquivos é limitado por `agents.defaults.bootstrapTotalMaxChars`
(padrão: 150000). Arquivos ausentes injetam um marcador curto de arquivo ausente. Quando ocorre truncamento,
o OpenClaw pode injetar um bloco de aviso em Contexto do projeto; controle isso com
`agents.defaults.bootstrapMaxChars` (padrão: 12000). O conteúdo total de bootstrap injetado
entre os arquivos é limitado por `agents.defaults.bootstrapTotalMaxChars`
(padrão: 60000). Arquivos ausentes injetam um marcador curto de arquivo ausente. Quando ocorre
truncamento, o OpenClaw pode injetar um bloco de aviso em Contexto do projeto; controle isso com
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
padrão: `once`).
Sessões de subagentes injetam apenas `AGENTS.md` e `TOOLS.md` (outros arquivos de bootstrap
Sessões de subagente injetam apenas `AGENTS.md` e `TOOLS.md` (outros arquivos de bootstrap
são filtrados para manter pequeno o contexto do subagente).
Hooks internos podem interceptar esta etapa por meio de `agent:bootstrap` para mutar ou substituir
os arquivos de bootstrap injetados (por exemplo, trocando `SOUL.md` por uma persona alternativa).
Hooks internos podem interceptar esta etapa via `agent:bootstrap` para mutar ou substituir
os arquivos de bootstrap injetados (por exemplo, trocar `SOUL.md` por uma persona alternativa).
Se você quiser fazer o agente soar menos genérico, comece com
[Guia de personalidade do SOUL.md](/pt-BR/concepts/soul).
Para inspecionar quanto cada arquivo injetado contribui (bruto vs injetado, truncamento, além da sobrecarga do schema da ferramenta), use `/context list` ou `/context detail`. Veja [Contexto](/pt-BR/concepts/context).
Para inspecionar quanto cada arquivo injetado contribui (bruto vs. injetado, truncamento, além da sobrecarga do schema de ferramentas), use `/context list` ou `/context detail`. Veja [Contexto](/pt-BR/concepts/context).
## Tratamento de hora
## Tratamento de tempo
O prompt de sistema inclui uma seção dedicada **Data e hora atuais** quando o
fuso horário do usuário é conhecido. Para manter o cache do prompt estável, agora ela inclui apenas o
**fuso horário** (sem relógio dinâmico nem formato de hora).
O prompt do sistema inclui uma seção dedicada **Data e hora atuais** quando o
fuso horário do usuário é conhecido. Para manter o cache do prompt estável, ele agora inclui apenas
o **fuso horário** (sem relógio dinâmico nem formato de hora).
Use `session_status` quando o agente precisar da hora atual; o cartão de status
inclui uma linha de timestamp. A mesma ferramenta também pode opcionalmente definir uma substituição
de modelo por sessão (`model=default` a remove).
inclui uma linha de timestamp. A mesma ferramenta pode opcionalmente definir uma substituição de modelo por sessão
(`model=default` a limpa).
Configure com:
@ -154,12 +154,12 @@ Veja [Data e hora](/pt-BR/date-time) para detalhes completos do comportamento.
## Skills
Quando existem skills elegíveis, o OpenClaw injeta uma **lista compacta de skills disponíveis**
(`formatSkillsForPrompt`) que inclui o **caminho do arquivo** de cada skill. O
(`formatSkillsForPrompt`) que inclui o **caminho do arquivo** para cada skill. O
prompt instrui o modelo a usar `read` para carregar o SKILL.md no local listado
(workspace, gerenciado ou empacotado). Se não houver skills elegíveis, a
seção Skills é omitida.
A elegibilidade inclui bloqueios de metadados da skill, verificações de ambiente/configuração de runtime
A elegibilidade inclui bloqueios de metadados da skill, verificações de ambiente/configuração em runtime
e a allowlist efetiva de skills do agente quando `agents.defaults.skills` ou
`agents.list[].skills` está configurado.
@ -173,26 +173,26 @@ e a allowlist efetiva de skills do agente quando `agents.defaults.skills` ou
</available_skills>
```
Isso mantém o prompt base pequeno enquanto ainda permite uso direcionado de skills.
Isso mantém pequeno o prompt base e ainda possibilita uso direcionado de skills.
O orçamento da lista de skills pertence ao subsistema de skills:
- Padrão global: `skills.limits.maxSkillsPromptChars`
- Sobrescrita por agente: `agents.list[].skillsLimits.maxSkillsPromptChars`
- Substituição por agente: `agents.list[].skillsLimits.maxSkillsPromptChars`
Trechos genéricos limitados de runtime usam uma superfície diferente:
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
Essa separação mantém o dimensionamento de skills separado do dimensionamento de leitura/injeção de runtime, como
Essa divisão mantém o dimensionamento de skills separado do dimensionamento de leitura/injeção do runtime, como
`memory_get`, resultados de ferramentas ao vivo e atualizações de `AGENTS.md` após compaction.
## Documentação
Quando disponível, o prompt de sistema inclui uma seção **Documentação** que aponta para o
diretório local da documentação do OpenClaw (seja `docs/` no workspace do repositório ou a documentação do
pacote npm empacotado) e também menciona o espelho público, o repositório de origem, o Discord da comunidade e o
Quando disponível, o prompt do sistema inclui uma seção **Documentação** que aponta para o
diretório local de documentação do OpenClaw (seja `docs/` no workspace do repositório ou a documentação do
pacote npm empacotado) e também menciona o espelho público, o repositório-fonte, o Discord da comunidade e o
ClawHub ([https://clawhub.ai](https://clawhub.ai)) para descoberta de skills. O prompt instrui o modelo a consultar primeiro a documentação local
para comportamento, comandos, configuração ou arquitetura do OpenClaw, e a executar
`openclaw status` por conta própria quando possível (pedindo ao usuário apenas quando não tiver acesso).
`openclaw status` por conta própria quando possível (perguntando ao usuário apenas quando não tiver acesso).

File diff suppressed because it is too large Load Diff

View File

@ -2,23 +2,23 @@
read_when:
- Implementando ou atualizando clientes WS do Gateway
- Depurando incompatibilidades de protocolo ou falhas de conexão
- Regenerando esquema/modelos de protocolo
summary: 'Protocolo WebSocket do Gateway: handshake, frames, controle de versão'
- Regenerando schema/modelos do protocolo
summary: 'Protocolo WebSocket do Gateway: handshake, frames, versionamento'
title: Protocolo do Gateway
x-i18n:
generated_at: "2026-04-16T05:37:37Z"
generated_at: "2026-04-18T05:24:49Z"
model: gpt-5.4
provider: openai
source_hash: 683e61ebe993a2d739bc34860060b0e3eda36b5c57267a2bcc03d177ec612fb3
source_hash: 4f0eebcfdd8c926c90b4753a6d96c59e3134ddb91740f65478f11eb75be85e41
source_path: gateway/protocol.md
workflow: 15
---
# Protocolo do Gateway (WebSocket)
O protocolo WS do Gateway é o **plano de controle único + transporte de nós** do
OpenClaw. Todos os clientes (CLI, interface web, app para macOS, nós iOS/Android,
s headless) se conectam por WebSocket e declaram seu **papel** + **escopo** no
O protocolo WS do Gateway é o **plano de controle único + transporte de Node** para o
OpenClaw. Todos os clientes (CLI, interface web, app macOS, Nodes iOS/Android,
Nodes headless) se conectam por WebSocket e declaram seu **papel** + **escopo** no
momento do handshake.
## Transporte
@ -26,7 +26,7 @@ momento do handshake.
- WebSocket, frames de texto com payloads JSON.
- O primeiro frame **deve** ser uma requisição `connect`.
## Handshake (connect)
## Handshake (`connect`)
Gateway → Cliente (desafio pré-conexão):
@ -95,8 +95,22 @@ Gateway → Cliente:
}
```
`server`, `features`, `snapshot` e `policy` são todos obrigatórios pelo esquema
(`src/gateway/protocol/schema/frames.ts`). `auth` e `canvasHostUrl` são opcionais.
`server`, `features`, `snapshot` e `policy` são todos obrigatórios pelo schema
(`src/gateway/protocol/schema/frames.ts`). `canvasHostUrl` é opcional. `auth`
informa o papel/escopos negociados quando disponíveis, e inclui `deviceToken`
quando o gateway emite um.
Quando nenhum token de dispositivo é emitido, `hello-ok.auth` ainda pode informar as
permissões negociadas:
```json
{
"auth": {
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
```
Quando um token de dispositivo é emitido, `hello-ok` também inclui:
@ -110,8 +124,8 @@ Quando um token de dispositivo é emitido, `hello-ok` também inclui:
}
```
Durante a transferência confiável de bootstrap, `hello-ok.auth` também pode incluir
entradas de papel adicionais delimitadas em `deviceTokens`:
Durante o handoff de bootstrap confiável, `hello-ok.auth` também pode incluir
entradas de papel adicionais limitadas em `deviceTokens`:
```json
{
@ -130,14 +144,14 @@ entradas de papel adicionais delimitadas em `deviceTokens`:
}
```
Para o fluxo de bootstrap integrado de node/operator, o token principal do nó permanece com
`scopes: []` e qualquer token de operador transferido permanece delimitado à allowlist
do operador de bootstrap (`operator.approvals`, `operator.read`,
`operator.talk.secrets`, `operator.write`). As verificações de escopo do bootstrap continuam
prefixadas por papel: entradas de operador só satisfazem requisições de operador, e papéis
não operadores ainda precisam de escopos sob o prefixo do seu próprio papel.
Para o fluxo de bootstrap integrado de node/operator, o token primário do node continua com
`scopes: []` e qualquer token de operador transferido continua limitado à allowlist do
operador de bootstrap (`operator.approvals`, `operator.read`,
`operator.talk.secrets`, `operator.write`). As verificações de escopo de bootstrap continuam
com prefixo por papel: entradas de operador só satisfazem requisições de operador, e
papéis que não são operador ainda precisam de escopos sob o prefixo do próprio papel.
### Exemplo de
### Exemplo de Node
```json
{
@ -178,13 +192,13 @@ não operadores ainda precisam de escopos sob o prefixo do seu próprio papel.
- **Resposta**: `{type:"res", id, ok, payload|error}`
- **Evento**: `{type:"event", event, payload, seq?, stateVersion?}`
Métodos com efeitos colaterais exigem **chaves de idempotência** (veja o esquema).
Métodos com efeitos colaterais exigem **chaves de idempotência** (veja o schema).
## Papéis + escopos
### Papéis
- `operator` = cliente do plano de controle (CLI/interface/automação).
- `operator` = cliente do plano de controle (CLI/UI/automação).
- `node` = host de capacidades (camera/screen/canvas/system.run).
### Escopos (operator)
@ -201,70 +215,70 @@ Escopos comuns:
`talk.config` com `includeSecrets: true` exige `operator.talk.secrets`
(ou `operator.admin`).
Métodos RPC do Gateway registrados por Plugin podem solicitar seu próprio escopo de operator, mas
prefixos administrativos reservados do núcleo (`config.*`, `exec.approvals.*`, `wizard.*`,
Métodos RPC do gateway registrados por Plugin podem solicitar seu próprio escopo de operador, mas
os prefixos admin centrais reservados (`config.*`, `exec.approvals.*`, `wizard.*`,
`update.*`) sempre são resolvidos para `operator.admin`.
O escopo do método é apenas o primeiro controle. Alguns comandos slash acessados por
`chat.send` aplicam verificações em nível de comando mais restritas além disso. Por exemplo, escritas
persistentes de `/config set` e `/config unset` exigem `operator.admin`.
O escopo do método é apenas a primeira barreira. Alguns comandos slash acessados por
`chat.send` aplicam verificações em nível de comando mais rígidas por cima. Por exemplo,
gravações persistentes com `/config set` e `/config unset` exigem `operator.admin`.
`node.pair.approve` também tem uma verificação de escopo adicional no momento da aprovação além do
escopo base do método:
`node.pair.approve` também tem uma verificação extra de escopo no momento da aprovação,
além do escopo base do método:
- requisições sem comando: `operator.pairing`
- requisições com comandos de nó sem exec: `operator.pairing` + `operator.write`
- requisições com comandos de node que não são exec: `operator.pairing` + `operator.write`
- requisições que incluem `system.run`, `system.run.prepare` ou `system.which`:
`operator.pairing` + `operator.admin`
### Caps/commands/permissions (node)
Nós declaram reivindicações de capacidade no momento da conexão:
Nodes declaram claims de capacidade no momento da conexão:
- `caps`: categorias de capacidade de alto nível.
- `commands`: allowlist de comandos para invoke.
- `permissions`: toggles granulares (por exemplo, `screen.record`, `camera.capture`).
O Gateway trata isso como **reivindicações** e aplica allowlists no lado do servidor.
O Gateway trata isso como **claims** e aplica allowlists no lado do servidor.
## Presença
- `system-presence` retorna entradas indexadas pela identidade do dispositivo.
- As entradas de presença incluem `deviceId`, `roles` e `scopes` para que as interfaces possam mostrar uma única linha por dispositivo
mesmo quando ele se conecta como **operator** e **node** ao mesmo tempo.
- As entradas de presença incluem `deviceId`, `roles` e `scopes`, para que as UIs possam mostrar uma única linha por dispositivo
mesmo quando ele se conecta tanto como **operator** quanto como **node**.
## Famílias comuns de métodos RPC
Esta página não é um dump completo gerado, mas a superfície WS pública é mais ampla
do que os exemplos de handshake/auth acima. Estas são as principais famílias de métodos que
o Gateway expõe atualmente.
do que os exemplos de handshake/autenticação acima. Estas são as principais famílias de métodos que
o Gateway expõe hoje.
`hello-ok.features.methods` é uma lista conservadora de descoberta construída a partir de
`src/gateway/server-methods-list.ts` mais as exportações de métodos de plugins/canais carregados.
Trate isso como descoberta de recursos, não como um dump gerado de todos os helpers chamáveis
`hello-ok.features.methods` é uma lista de descoberta conservadora construída a partir de
`src/gateway/server-methods-list.ts` mais exportações de métodos de plugins/canais carregados.
Trate-a como descoberta de recursos, não como um dump gerado de todos os helpers chamáveis
implementados em `src/gateway/server-methods/*.ts`.
### Sistema e identidade
- `health` retorna o snapshot de saúde do gateway em cache ou recém-sondado.
- `health` retorna o snapshot de integridade do gateway em cache ou recém-verificado.
- `status` retorna o resumo do gateway no estilo `/status`; campos sensíveis são
incluídos apenas para clientes operator com escopo de admin.
- `gateway.identity.get` retorna a identidade do dispositivo do gateway usada pelos fluxos de relay e
pareamento.
- `system-presence` retorna o snapshot de presença atual para dispositivos
incluídos apenas para clientes operator com escopo admin.
- `gateway.identity.get` retorna a identidade de dispositivo do gateway usada por fluxos de relay e
emparelhamento.
- `system-presence` retorna o snapshot atual de presença dos dispositivos
operator/node conectados.
- `system-event` acrescenta um evento de sistema e pode atualizar/transmitir contexto
- `system-event` anexa um evento de sistema e pode atualizar/transmitir o contexto
de presença.
- `last-heartbeat` retorna o evento Heartbeat persistido mais recente.
- `set-heartbeats` ativa ou desativa o processamento de Heartbeat no gateway.
- `set-heartbeats` alterna o processamento de Heartbeat no gateway.
### Modelos e uso
- `models.list` retorna o catálogo de modelos permitido em tempo de execução.
- `usage.status` retorna janelas de uso do provedor/resumos de cota restante.
- `models.list` retorna o catálogo de modelos permitido em runtime.
- `usage.status` retorna resumos de janelas de uso de provider/cota restante.
- `usage.cost` retorna resumos agregados de uso de custo para um intervalo de datas.
- `doctor.memory.status` retorna a prontidão de memória vetorial / embeddings para o
workspace padrão ativo do agente.
workspace do agente padrão ativo.
- `sessions.usage` retorna resumos de uso por sessão.
- `sessions.usage.timeseries` retorna séries temporais de uso para uma sessão.
- `sessions.usage.logs` retorna entradas de log de uso para uma sessão.
@ -272,76 +286,76 @@ implementados em `src/gateway/server-methods/*.ts`.
### Canais e helpers de login
- `channels.status` retorna resumos de status de canais/plugins integrados + empacotados.
- `channels.logout` desconecta uma conta/canal específico quando o canal
- `channels.logout` faz logout de um canal/conta específico quando o canal
oferece suporte a logout.
- `web.login.start` inicia um fluxo de login por QR/web para o provedor de canal web
atual com suporte a QR.
- `web.login.wait` aguarda a conclusão desse fluxo de login por QR/web e inicia o
- `web.login.start` inicia um fluxo de login QR/web para o provider de canal web com suporte a QR atual.
- `web.login.wait` aguarda a conclusão desse fluxo de login QR/web e inicia o
canal em caso de sucesso.
- `push.test` envia um push APNs de teste para um nó iOS registrado.
- `voicewake.get` retorna os gatilhos de palavra de ativação armazenados.
- `voicewake.set` atualiza os gatilhos de palavra de ativação e transmite a alteração.
- `push.test` envia um push APNs de teste para um node iOS registrado.
- `voicewake.get` retorna os triggers de wake-word armazenados.
- `voicewake.set` atualiza os triggers de wake-word e transmite a alteração.
### Mensageria e logs
### Mensagens e logs
- `send` é o RPC direto de entrega de saída para envios direcionados por canal/conta/thread
fora do executor de chat.
- `logs.tail` retorna a cauda configurada dos logs de arquivo do gateway com cursor/limite e
- `send` é o RPC direto de entrega de saída para envios direcionados a
canal/conta/thread fora do executor de chat.
- `logs.tail` retorna o tail configurado do log de arquivo do gateway com cursor/limite e
controles de bytes máximos.
### Talk e TTS
- `talk.config` retorna o payload efetivo de configuração do Talk; `includeSecrets`
- `talk.config` retorna o payload efetivo de configuração de Talk; `includeSecrets`
exige `operator.talk.secrets` (ou `operator.admin`).
- `talk.mode` define/transmite o estado atual do modo Talk para clientes
WebChat/Control UI.
- `talk.speak` sintetiza fala por meio do provedor de fala Talk ativo.
- `tts.status` retorna o estado de ativação do TTS, provedor ativo, provedores de fallback,
e o estado de configuração do provedor.
- `tts.providers` retorna o inventário visível de provedores de TTS.
- `talk.speak` sintetiza fala por meio do provider de fala de Talk ativo.
- `tts.status` retorna o estado habilitado de TTS, provider ativo, providers de fallback
e o estado de configuração do provider.
- `tts.providers` retorna o inventário visível de providers de TTS.
- `tts.enable` e `tts.disable` alternam o estado das preferências de TTS.
- `tts.setProvider` atualiza o provedor de TTS preferido.
- `tts.convert` executa conversão pontual de texto para fala.
- `tts.setProvider` atualiza o provider de TTS preferido.
- `tts.convert` executa uma conversão avulsa de texto para fala.
### Secrets, config, update e wizard
### Segredos, configuração, update e wizard
- `secrets.reload` resolve novamente os SecretRefs ativos e troca o estado de segredos em tempo de execução
- `secrets.reload` resolve novamente SecretRefs ativas e substitui o estado de segredo em runtime
apenas em caso de sucesso completo.
- `secrets.resolve` resolve atribuições de segredos direcionadas a comandos para um conjunto específico
de comando/alvo.
- `config.get` retorna o snapshot e hash da configuração atual.
- `secrets.resolve` resolve atribuições de segredos de destino de comando para um
conjunto específico de comando/destino.
- `config.get` retorna o snapshot e o hash da configuração atual.
- `config.set` grava um payload de configuração validado.
- `config.patch` mescla uma atualização parcial de configuração.
- `config.apply` valida + substitui o payload completo de configuração.
- `config.schema` retorna o payload do esquema de configuração em tempo de execução usado pela Control UI e
pelas ferramentas de CLI: esquema, `uiHints`, versão e metadados de geração, incluindo
metadados de esquema de plugins + canais quando o runtime pode carregá-los. O esquema
- `config.schema` retorna o payload do schema de configuração ativo usado pela Control UI e
por ferramentas de CLI: schema, `uiHints`, versão e metadados de geração, incluindo
metadados de schema de plugin + canal quando o runtime consegue carregá-los. O schema
inclui metadados de campo `title` / `description` derivados dos mesmos rótulos
e textos de ajuda usados pela interface, incluindo ramificações aninhadas de objeto, curinga, item de array
e composição `anyOf` / `oneOf` / `allOf` quando existe documentação de campo correspondente.
- `config.schema.lookup` retorna um payload de consulta com escopo de caminho para um caminho de configuração:
caminho normalizado, um nó raso do esquema, `hint` correspondente + `hintPath`, e
resumos imediatos dos filhos para detalhamento na interface/CLI.
- Nós de esquema de consulta mantêm a documentação voltada ao usuário e campos comuns de validação:
e textos de ajuda usados pela UI, incluindo objeto aninhado, curinga, item de array
e ramificações de composição `anyOf` / `oneOf` / `allOf` quando existe
documentação de campo correspondente.
- `config.schema.lookup` retorna um payload de lookup com escopo de caminho para um
caminho de configuração: caminho normalizado, um nó de schema raso, a dica correspondente + `hintPath`, e
resumos imediatos dos filhos para drill-down de UI/CLI.
- Os nós de schema do lookup mantêm a documentação voltada ao usuário e os campos comuns de validação:
`title`, `description`, `type`, `enum`, `const`, `format`, `pattern`,
limites numéricos/de string/de array/de objeto e flags booleanas como
`additionalProperties`, `deprecated`, `readOnly`, `writeOnly`.
- Resumos de filhos expõem `key`, `path` normalizado, `type`, `required`,
`hasChildren`, além do `hint` / `hintPath` correspondente.
- `update.run` executa o fluxo de atualização do gateway e agenda uma reinicialização apenas quando
a própria atualização foi bem-sucedida.
- Os resumos de filhos expõem `key`, `path` normalizado, `type`, `required`,
`hasChildren`, além da `hint` / `hintPath` correspondente.
- `update.run` executa o fluxo de update do gateway e agenda um reinício apenas quando
o próprio update foi bem-sucedido.
- `wizard.start`, `wizard.next`, `wizard.status` e `wizard.cancel` expõem o
assistente de onboarding por WS RPC.
wizard de onboarding por RPC WS.
### Famílias principais existentes
#### Helpers de agente e workspace
- `agents.list` retorna entradas de agentes configuradas.
- `agents.create`, `agents.update` e `agents.delete` gerenciam registros de agentes e
a ligação com o workspace.
- `agents.list` retorna entradas de agentes configurados.
- `agents.create`, `agents.update` e `agents.delete` gerenciam registros de agente e
o wiring do workspace.
- `agents.files.list`, `agents.files.get` e `agents.files.set` gerenciam os
arquivos do workspace de bootstrap expostos para um agente.
arquivos de workspace de bootstrap expostos para um agente.
- `agent.identity.get` retorna a identidade efetiva do assistente para um agente ou
sessão.
- `agent.wait` aguarda a conclusão de uma execução e retorna o snapshot terminal quando
@ -350,66 +364,66 @@ implementados em `src/gateway/server-methods/*.ts`.
#### Controle de sessão
- `sessions.list` retorna o índice atual de sessões.
- `sessions.subscribe` e `sessions.unsubscribe` ativam ou desativam assinaturas de eventos
de mudança de sessão para o cliente WS atual.
- `sessions.messages.subscribe` e `sessions.messages.unsubscribe` ativam ou desativam
assinaturas de eventos de transcrição/mensagens para uma sessão.
- `sessions.preview` retorna prévias delimitadas da transcrição para chaves específicas
de sessão.
- `sessions.resolve` resolve ou canonicaliza um destino de sessão.
- `sessions.subscribe` e `sessions.unsubscribe` alternam inscrições em eventos de alteração de sessão
para o cliente WS atual.
- `sessions.messages.subscribe` e `sessions.messages.unsubscribe` alternam
inscrições em eventos de transcrição/mensagem para uma sessão.
- `sessions.preview` retorna prévias de transcrição limitadas para chaves de sessão
específicas.
- `sessions.resolve` resolve ou canonicaliza um alvo de sessão.
- `sessions.create` cria uma nova entrada de sessão.
- `sessions.send` envia uma mensagem para uma sessão existente.
- `sessions.steer` é a variante de interrupção e redirecionamento para uma sessão ativa.
- `sessions.steer` é a variante de interromper e redirecionar para uma sessão ativa.
- `sessions.abort` aborta o trabalho ativo de uma sessão.
- `sessions.patch` atualiza metadados/substituições de sessão.
- `sessions.reset`, `sessions.delete` e `sessions.compact` executam manutenção
da sessão.
- `sessions.get` retorna a linha completa armazenada da sessão.
- `sessions.reset`, `sessions.delete` e `sessions.compact` executam manutenção de
sessão.
- `sessions.get` retorna a linha completa da sessão armazenada.
- a execução de chat ainda usa `chat.history`, `chat.send`, `chat.abort` e
`chat.inject`.
- `chat.history` é normalizado para exibição para clientes de interface: tags de diretiva inline são
- `chat.history` é normalizado para exibição para clientes de UI: tags de diretiva inline são
removidas do texto visível, payloads XML de chamada de ferramenta em texto simples (incluindo
`<tool_call>...</tool_call>`, `<function_call>...</function_call>`,
`<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` e
blocos truncados de chamada de ferramenta) e tokens de controle do modelo ASCII/full-width vazados
são removidos, linhas de assistente compostas apenas por tokens silenciosos, como `NO_REPLY` /
blocos truncados de chamada de ferramenta) e tokens de controle do modelo em ASCII/largura total que vazaram
são removidos, linhas do assistente compostas apenas por tokens silenciosos, como `NO_REPLY` /
`no_reply` exatos, são omitidas, e linhas grandes demais podem ser substituídas por placeholders.
#### Pareamento de dispositivos e tokens de dispositivo
#### Emparelhamento de dispositivo e tokens de dispositivo
- `device.pair.list` retorna dispositivos pareados pendentes e aprovados.
- `device.pair.list` retorna dispositivos emparelhados pendentes e aprovados.
- `device.pair.approve`, `device.pair.reject` e `device.pair.remove` gerenciam
registros de pareamento de dispositivos.
- `device.token.rotate` rotaciona um token de dispositivo pareado dentro dos limites
aprovados de papel e escopo.
- `device.token.revoke` revoga um token de dispositivo pareado.
registros de emparelhamento de dispositivo.
- `device.token.rotate` rotaciona um token de dispositivo emparelhado dentro dos limites aprovados de
papel e escopo.
- `device.token.revoke` revoga um token de dispositivo emparelhado.
#### Pareamento de nós, invoke e trabalho pendente
#### Emparelhamento de node, invoke e trabalho pendente
- `node.pair.request`, `node.pair.list`, `node.pair.approve`,
`node.pair.reject` e `node.pair.verify` cobrem pareamento de nós e verificação
de bootstrap.
- `node.list` e `node.describe` retornam o estado conhecido/conectado dos nós.
- `node.rename` atualiza um rótulo de nó pareado.
- `node.invoke` encaminha um comando para um nó conectado.
`node.pair.reject` e `node.pair.verify` cobrem o emparelhamento de node e a
verificação de bootstrap.
- `node.list` e `node.describe` retornam o estado conhecido/conectado de nodes.
- `node.rename` atualiza um rótulo de node emparelhado.
- `node.invoke` encaminha um comando para um node conectado.
- `node.invoke.result` retorna o resultado de uma requisição invoke.
- `node.event` transporta eventos originados no nó de volta para o gateway.
- `node.event` carrega eventos originados no node de volta para o gateway.
- `node.canvas.capability.refresh` atualiza tokens de capacidade de canvas com escopo.
- `node.pending.pull` e `node.pending.ack` são as APIs de fila de nós conectados.
- `node.pending.pull` e `node.pending.ack` são as APIs de fila de node conectado.
- `node.pending.enqueue` e `node.pending.drain` gerenciam trabalho pendente durável
para nós offline/desconectados.
para nodes offline/desconectados.
#### Famílias de aprovação
- `exec.approval.request`, `exec.approval.get`, `exec.approval.list` e
`exec.approval.resolve` cobrem requisições pontuais de aprovação de exec, além de
consulta/reexecução de aprovações pendentes.
`exec.approval.resolve` cobrem requisições avulsas de aprovação de exec mais
lookup/replay de aprovação pendente.
- `exec.approval.waitDecision` aguarda uma aprovação pendente de exec e retorna
a decisão final (ou `null` em caso de timeout).
- `exec.approvals.get` e `exec.approvals.set` gerenciam snapshots da política de aprovação
de exec do gateway.
- `exec.approvals.node.get` e `exec.approvals.node.set` gerenciam a política local de exec
do nó via comandos de relay do nó.
- `exec.approvals.get` e `exec.approvals.set` gerenciam snapshots da política de
aprovação de exec do gateway.
- `exec.approvals.node.get` e `exec.approvals.node.set` gerenciam a política local de exec do node
por meio de comandos de relay do node.
- `plugin.approval.request`, `plugin.approval.list`,
`plugin.approval.waitDecision` e `plugin.approval.resolve` cobrem
fluxos de aprovação definidos por Plugin.
@ -417,235 +431,239 @@ implementados em `src/gateway/server-methods/*.ts`.
#### Outras famílias principais
- automação:
- `wake` agenda uma injeção de texto imediata ou no próximo Heartbeat
- `wake` agenda uma injeção de texto de wake imediata ou no próximo Heartbeat
- `cron.list`, `cron.status`, `cron.add`, `cron.update`, `cron.remove`,
`cron.run`, `cron.runs`
- skills/ferramentas: `commands.list`, `skills.*`, `tools.catalog`, `tools.effective`
### Famílias comuns de eventos
- `chat`: atualizações de chat da interface, como `chat.inject` e outros eventos
de chat apenas de transcrição.
- `chat`: atualizações de chat da UI, como `chat.inject` e outros eventos de chat
apenas de transcrição.
- `session.message` e `session.tool`: atualizações de transcrição/fluxo de eventos para uma
sessão assinada.
- `sessions.changed`: o índice ou os metadados da sessão mudaram.
sessão inscrita.
- `sessions.changed`: o índice de sessões ou metadados mudaram.
- `presence`: atualizações do snapshot de presença do sistema.
- `tick`: evento periódico de keepalive / vivacidade.
- `health`: atualização do snapshot de saúde do gateway.
- `heartbeat`: atualização do fluxo de eventos Heartbeat.
- `cron`: evento de mudança de execução/trabalho do cron.
- `health`: atualização do snapshot de integridade do gateway.
- `heartbeat`: atualização do fluxo de eventos de Heartbeat.
- `cron`: evento de alteração de execução/job do Cron.
- `shutdown`: notificação de desligamento do gateway.
- `node.pair.requested` / `node.pair.resolved`: ciclo de vida do pareamento de nós.
- `node.invoke.request`: transmissão da requisição invoke de nó.
- `device.pair.requested` / `device.pair.resolved`: ciclo de vida do dispositivo pareado.
- `voicewake.changed`: a configuração do gatilho de palavra de ativação mudou.
- `exec.approval.requested` / `exec.approval.resolved`: ciclo de vida da aprovação
de exec.
- `node.pair.requested` / `node.pair.resolved`: ciclo de vida do emparelhamento de node.
- `node.invoke.request`: transmissão da requisição invoke do node.
- `device.pair.requested` / `device.pair.resolved`: ciclo de vida do dispositivo emparelhado.
- `voicewake.changed`: a configuração de triggers de wake-word mudou.
- `exec.approval.requested` / `exec.approval.resolved`: ciclo de vida da
aprovação de exec.
- `plugin.approval.requested` / `plugin.approval.resolved`: ciclo de vida da aprovação
de Plugin.
### Métodos helper de nó
### Métodos helper de node
- Nós podem chamar `skills.bins` para buscar a lista atual de executáveis de skill
- Nodes podem chamar `skills.bins` para buscar a lista atual de executáveis de skill
para verificações de auto-allow.
### Métodos helper de operator
- Operators podem chamar `commands.list` (`operator.read`) para buscar o inventário de comandos em runtime para um
agente.
- `agentId` é opcional; omita-o para ler o workspace padrão do agente.
- `agentId` é opcional; omita-o para ler o workspace do agente padrão.
- `scope` controla qual superfície o `name` primário segmenta:
- `text` retorna o token primário do comando de texto sem a `/` inicial
- `native` e o caminho padrão `both` retornam nomes nativos sensíveis ao provedor
- `native` e o caminho padrão `both` retornam nomes nativos sensíveis ao provider
quando disponíveis
- `textAliases` carrega aliases slash exatos, como `/model` e `/m`.
- `nativeName` carrega o nome nativo sensível ao provedor quando ele existe.
- `provider` é opcional e afeta apenas a nomenclatura nativa mais a disponibilidade
de comandos nativos de Plugin.
- `includeArgs=false` omite metadados serializados de argumentos da resposta.
- Operators podem chamar `tools.catalog` (`operator.read`) para buscar o catálogo de ferramentas em runtime para um
agente. A resposta inclui ferramentas agrupadas e metadados de procedência:
- `nativeName` carrega o nome nativo sensível ao provider quando ele existe.
- `provider` é opcional e afeta apenas a nomenclatura nativa mais a disponibilidade de
comandos nativos de Plugin.
- `includeArgs=false` omite metadados de argumentos serializados da resposta.
- Operators podem chamar `tools.catalog` (`operator.read`) para buscar o catálogo de ferramentas em runtime de um
agente. A resposta inclui ferramentas agrupadas e metadados de proveniência:
- `source`: `core` ou `plugin`
- `pluginId`: proprietário do Plugin quando `source="plugin"`
- `optional`: se uma ferramenta de Plugin é opcional
- Operators podem chamar `tools.effective` (`operator.read`) para buscar o inventário efetivo de ferramentas em runtime
para uma sessão.
- `pluginId`: owner do plugin quando `source="plugin"`
- `optional`: se uma ferramenta de plugin é opcional
- Operators podem chamar `tools.effective` (`operator.read`) para buscar o inventário efetivo de ferramentas em runtime para uma
sessão.
- `sessionKey` é obrigatório.
- O gateway deriva o contexto confiável de runtime do lado do servidor a partir da sessão, em vez de aceitar
- O gateway deriva contexto confiável de runtime do lado do servidor a partir da sessão, em vez de aceitar
autenticação ou contexto de entrega fornecidos pelo chamador.
- A resposta tem escopo de sessão e reflete o que a conversa ativa pode usar agora,
incluindo ferramentas de core, Plugin e canal.
- Operators podem chamar `skills.status` (`operator.read`) para buscar o inventário visível
de skills para um agente.
- `agentId` é opcional; omita-o para ler o workspace padrão do agente.
- A resposta tem escopo de sessão e reflete o que a conversa ativa pode usar neste momento,
incluindo ferramentas de core, plugin e canal.
- Operators podem chamar `skills.status` (`operator.read`) para buscar o inventário visível de
Skills para um agente.
- `agentId` é opcional; omita-o para ler o workspace do agente padrão.
- A resposta inclui elegibilidade, requisitos ausentes, verificações de configuração e
opções de instalação sanitizadas sem expor valores brutos de segredos.
- Operators podem chamar `skills.search` e `skills.detail` (`operator.read`) para metadados
de descoberta do ClawHub.
opções de instalação sanitizadas, sem expor valores brutos de segredos.
- Operators podem chamar `skills.search` e `skills.detail` (`operator.read`) para
metadados de descoberta do ClawHub.
- Operators podem chamar `skills.install` (`operator.admin`) em dois modos:
- Modo ClawHub: `{ source: "clawhub", slug, version?, force? }` instala uma
pasta de skill no diretório `skills/` do workspace padrão do agente.
pasta de skill no diretório `skills/` do workspace do agente padrão.
- Modo instalador do gateway: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }`
executa uma ação declarada `metadata.openclaw.install` no host do gateway.
- Operators podem chamar `skills.update` (`operator.admin`) em dois modos:
- O modo ClawHub atualiza um slug rastreado ou todas as instalações do ClawHub rastreadas no
workspace padrão do agente.
- O modo Config aplica patch em valores de `skills.entries.<skillKey>`, como `enabled`,
- O modo ClawHub atualiza um slug rastreado ou todas as instalações rastreadas do ClawHub no
workspace do agente padrão.
- O modo Config aplica patch em valores `skills.entries.<skillKey>`, como `enabled`,
`apiKey` e `env`.
## Aprovações de exec
- Quando uma requisição de exec precisa de aprovação, o gateway transmite `exec.approval.requested`.
- Clientes operator resolvem chamando `exec.approval.resolve` (exige escopo `operator.approvals`).
- Quando uma requisição exec precisa de aprovação, o gateway transmite `exec.approval.requested`.
- Clientes operator resolvem chamando `exec.approval.resolve` (exige o escopo `operator.approvals`).
- Para `host=node`, `exec.approval.request` deve incluir `systemRunPlan` (`argv`/`cwd`/`rawCommand`/metadados de sessão canônicos). Requisições sem `systemRunPlan` são rejeitadas.
- Após a aprovação, chamadas encaminhadas de `node.invoke system.run` reutilizam esse
`systemRunPlan` canônico como o contexto autoritativo de comando/cwd/sessão.
- Se um chamador modificar `command`, `rawCommand`, `cwd`, `agentId` ou
- Após a aprovação, chamadas encaminhadas `node.invoke system.run` reutilizam esse
`systemRunPlan` canônico como contexto autoritativo de comando/cwd/sessão.
- Se um chamador alterar `command`, `rawCommand`, `cwd`, `agentId` ou
`sessionKey` entre o prepare e o encaminhamento final aprovado de `system.run`, o
gateway rejeita a execução em vez de confiar no payload modificado.
gateway rejeita a execução em vez de confiar no payload alterado.
## Fallback de entrega do agente
- Requisições de `agent` podem incluir `deliver=true` para solicitar entrega de saída.
- `bestEffortDeliver=false` mantém o comportamento estrito: destinos de entrega não resolvidos ou apenas internos retornam `INVALID_REQUEST`.
- `bestEffortDeliver=true` permite fallback para execução apenas em sessão quando nenhuma rota externa entregável pode ser resolvida (por exemplo, sessões internas/webchat ou configurações ambíguas com múltiplos canais).
- Requisições `agent` podem incluir `deliver=true` para solicitar entrega de saída.
- `bestEffortDeliver=false` mantém o comportamento estrito: alvos de entrega não resolvidos ou apenas internos retornam `INVALID_REQUEST`.
- `bestEffortDeliver=true` permite fallback para execução somente em sessão quando nenhuma rota externa entregável pode ser resolvida (por exemplo, sessões internas/webchat ou configurações multicanal ambíguas).
## Controle de versão
## Versionamento
- `PROTOCOL_VERSION` fica em `src/gateway/protocol/schema/protocol-schemas.ts`.
- Clientes enviam `minProtocol` + `maxProtocol`; o servidor rejeita incompatibilidades.
- Esquemas + modelos são gerados a partir de definições TypeBox:
- Schemas + modelos são gerados a partir de definições TypeBox:
- `pnpm protocol:gen`
- `pnpm protocol:gen:swift`
- `pnpm protocol:check`
### Constantes do cliente
O cliente de referência em `src/gateway/client.ts` usa estes padrões. Os valores são
estáveis no protocolo v3 e são a linha de base esperada para clientes de terceiros.
O cliente de referência em `src/gateway/client.ts` usa estes valores padrão. Os valores são
estáveis em todo o protocolo v3 e são a linha de base esperada para clientes de terceiros.
| Constante | Padrão | Origem |
| ------------------------------------------ | ---------------------------------------------------- | ---------------------------------------------------------- |
| `PROTOCOL_VERSION` | `3` | `src/gateway/protocol/schema/protocol-schemas.ts` |
| Timeout de requisição (por RPC) | `30_000` ms | `src/gateway/client.ts` (`requestTimeoutMs`) |
| Timeout de pré-autenticação / connect-challenge | `10_000` ms | `src/gateway/handshake-timeouts.ts` (clamp `250``10_000`) |
| Backoff inicial de reconexão | `1_000` ms | `src/gateway/client.ts` (`backoffMs`) |
| Backoff máximo de reconexão | `30_000` ms | `src/gateway/client.ts` (`scheduleReconnect`) |
| Clamp de nova tentativa rápida após fechamento por token de dispositivo | `250` ms | `src/gateway/client.ts` |
| Tolerância de parada forçada antes de `terminate()` | `250` ms | `FORCE_STOP_TERMINATE_GRACE_MS` |
| Timeout padrão de `stopAndWait()` | `1_000` ms | `STOP_AND_WAIT_TIMEOUT_MS` |
| Intervalo padrão de tick (antes de `hello-ok`) | `30_000` ms | `src/gateway/client.ts` |
| Fechamento por timeout de tick | código `4000` quando o silêncio excede `tickIntervalMs * 2` | `src/gateway/client.ts` |
| `MAX_PAYLOAD_BYTES` | `25 * 1024 * 1024` (25 MB) | `src/gateway/server-constants.ts` |
| Constante | Padrão | Fonte |
| ------------------------------------------ | ----------------------------------------------------- | ---------------------------------------------------------- |
| `PROTOCOL_VERSION` | `3` | `src/gateway/protocol/schema/protocol-schemas.ts` |
| Timeout de requisição (por RPC) | `30_000` ms | `src/gateway/client.ts` (`requestTimeoutMs`) |
| Timeout de pré-autenticação / desafio de conexão | `10_000` ms | `src/gateway/handshake-timeouts.ts` (clamp `250``10_000`) |
| Backoff inicial de reconexão | `1_000` ms | `src/gateway/client.ts` (`backoffMs`) |
| Backoff máximo de reconexão | `30_000` ms | `src/gateway/client.ts` (`scheduleReconnect`) |
| Clamp de tentativa rápida após fechamento por token de dispositivo | `250` ms | `src/gateway/client.ts` |
| Grace de parada forçada antes de `terminate()` | `250` ms | `FORCE_STOP_TERMINATE_GRACE_MS` |
| Timeout padrão de `stopAndWait()` | `1_000` ms | `STOP_AND_WAIT_TIMEOUT_MS` |
| Intervalo padrão de tick (pré `hello-ok`) | `30_000` ms | `src/gateway/client.ts` |
| Fechamento por timeout de tick | código `4000` quando o silêncio excede `tickIntervalMs * 2` | `src/gateway/client.ts` |
| `MAX_PAYLOAD_BYTES` | `25 * 1024 * 1024` (25 MB) | `src/gateway/server-constants.ts` |
O servidor anuncia os valores efetivos de `policy.tickIntervalMs`, `policy.maxPayload`
e `policy.maxBufferedBytes` em `hello-ok`; os clientes devem respeitar esses valores
O servidor anuncia `policy.tickIntervalMs`, `policy.maxPayload` e
`policy.maxBufferedBytes` efetivos em `hello-ok`; os clientes devem respeitar esses valores,
em vez dos padrões de pré-handshake.
## Autenticação
- A autenticação do gateway por segredo compartilhado usa `connect.params.auth.token` ou
- A autenticação do gateway com segredo compartilhado usa `connect.params.auth.token` ou
`connect.params.auth.password`, dependendo do modo de autenticação configurado.
- Modos que carregam identidade, como Tailscale Serve
- Modos com identidade, como Tailscale Serve
(`gateway.auth.allowTailscale: true`) ou `gateway.auth.mode: "trusted-proxy"` fora de loopback,
satisfazem a verificação de autenticação de conexão a partir dos cabeçalhos da
satisfazem a verificação de autenticação do connect a partir dos headers da
requisição em vez de `connect.params.auth.*`.
- `gateway.auth.mode: "none"` para ingresso privado ignora completamente a autenticação de conexão por segredo compartilhado; não exponha esse modo em ingressos públicos/não confiáveis.
- Após o pareamento, o Gateway emite um **token de dispositivo** com escopo para o papel + escopos da conexão. Ele é retornado em `hello-ok.auth.deviceToken` e deve ser persistido pelo cliente para conexões futuras.
- O modo de ingresso privado `gateway.auth.mode: "none"` ignora completamente a autenticação
de connect com segredo compartilhado; não exponha esse modo em ingressos públicos/não confiáveis.
- Após o emparelhamento, o Gateway emite um **token de dispositivo** com escopo para o
papel + escopos da conexão. Ele é retornado em `hello-ok.auth.deviceToken` e deve ser
persistido pelo cliente para conexões futuras.
- Os clientes devem persistir o `hello-ok.auth.deviceToken` primário após qualquer
conexão bem-sucedida.
- Ao reconectar com esse token de dispositivo **armazenado**, também deve ser reutilizado o conjunto de escopos aprovados armazenado para esse token. Isso preserva o acesso de leitura/sondagem/status
que já foi concedido e evita reduzir silenciosamente as reconexões a um
escopo implícito mais restrito apenas de admin.
- Montagem da autenticação de conexão no lado do cliente (`selectConnectAuth` em
- Ao reconectar com esse token de dispositivo **armazenado**, também deve ser reutilizado o conjunto de
escopos aprovados armazenado para esse token. Isso preserva o acesso de leitura/probe/status
que já foi concedido e evita reduzir silenciosamente as reconexões para um
escopo implícito mais estreito, apenas de admin.
- Montagem da autenticação de connect no lado do cliente (`selectConnectAuth` em
`src/gateway/client.ts`):
- `auth.password` é ortogonal e sempre é encaminhado quando definido.
- `auth.token` é preenchido em ordem de prioridade: primeiro token compartilhado explícito,
depois um `deviceToken` explícito, depois um token armazenado por dispositivo (indexado por
`deviceId` + `role`).
- `auth.bootstrapToken` é enviado apenas quando nenhuma das opções acima resolve um
- `auth.bootstrapToken` é enviado apenas quando nenhum dos itens acima resolve um
`auth.token`. Um token compartilhado ou qualquer token de dispositivo resolvido o suprime.
- A promoção automática de um token de dispositivo armazenado na nova tentativa pontual
`AUTH_TOKEN_MISMATCH` é limitada apenas a **endpoints confiáveis** —
- A autopromoção de um token de dispositivo armazenado na tentativa única de retry
`AUTH_TOKEN_MISMATCH` é restrita a **endpoints confiáveis apenas** —
loopback, ou `wss://` com `tlsFingerprint` fixado. `wss://` público
sem pinning não se qualifica.
- Entradas adicionais em `hello-ok.auth.deviceTokens` são tokens de transferência de bootstrap.
Persista-as apenas quando a conexão tiver usado autenticação de bootstrap em um transporte confiável,
como `wss://` ou loopback/pareamento local.
- Entradas adicionais em `hello-ok.auth.deviceTokens` são tokens de handoff de bootstrap.
Persista-as apenas quando a conexão usou autenticação de bootstrap em um transporte confiável,
como `wss://` ou loopback/emparelhamento local.
- Se um cliente fornecer um `deviceToken` **explícito** ou `scopes` explícitos, esse
conjunto de escopos solicitado pelo chamador permanece autoritativo; escopos em cache só
são reutilizados quando o cliente estiver reutilizando o token armazenado por dispositivo.
são reutilizados quando o cliente está reutilizando o token armazenado por dispositivo.
- Tokens de dispositivo podem ser rotacionados/revogados via `device.token.rotate` e
`device.token.revoke` (exige escopo `operator.pairing`).
- A emissão/rotação de tokens permanece limitada ao conjunto de papéis aprovados registrado
na entrada de pareamento daquele dispositivo; rotacionar um token não pode expandir o dispositivo para um
papel que a aprovação de pareamento nunca concedeu.
- Para sessões com token de dispositivo pareado, o gerenciamento de dispositivos tem escopo próprio, a menos que o
chamador também tenha `operator.admin`: chamadores que não são admin só podem remover/revogar/rotacionar
sua **própria** entrada de dispositivo.
- `device.token.rotate` também verifica o conjunto de escopos de operator solicitado em relação aos
escopos da sessão atual do chamador. Chamadores que não são admin não podem rotacionar um token para
um conjunto de escopos de operator mais amplo do que o que já possuem.
- A emissão/rotação de token permanece limitada ao conjunto aprovado de papéis registrado na
entrada de emparelhamento daquele dispositivo; rotacionar um token não pode expandir o dispositivo para um
papel que a aprovação de emparelhamento nunca concedeu.
- Para sessões de token de dispositivo emparelhado, o gerenciamento de dispositivo é autoescopado, a menos que o
chamador também tenha `operator.admin`: chamadores sem admin só podem remover/revogar/rotacionar
a entrada do **próprio** dispositivo.
- `device.token.rotate` também verifica o conjunto de escopos de operador solicitado em relação aos
escopos atuais da sessão do chamador. Chamadores sem admin não podem rotacionar um token para
um conjunto de escopos de operador mais amplo do que já possuem.
- Falhas de autenticação incluem `error.details.code` mais dicas de recuperação:
- `error.details.canRetryWithDeviceToken` (boolean)
- `error.details.recommendedNextStep` (`retry_with_device_token`, `update_auth_configuration`, `update_auth_credentials`, `wait_then_retry`, `review_auth_configuration`)
- Comportamento do cliente para `AUTH_TOKEN_MISMATCH`:
- Clientes confiáveis podem tentar uma nova tentativa limitada com um token por dispositivo em cache.
- Se essa nova tentativa falhar, os clientes devem interromper loops automáticos de reconexão e exibir orientações de ação para o operator.
- Clientes confiáveis podem tentar um único retry limitado com um token armazenado por dispositivo em cache.
- Se esse retry falhar, os clientes devem interromper loops automáticos de reconexão e exibir orientação para ação do operador.
## Identidade do dispositivo + pareamento
## Identidade do dispositivo + emparelhamento
- Nós devem incluir uma identidade estável de dispositivo (`device.id`) derivada da
- Nodes devem incluir uma identidade de dispositivo estável (`device.id`) derivada da
impressão digital de um par de chaves.
- Gateways emitem tokens por dispositivo + papel.
- Aprovações de pareamento são necessárias para novos IDs de dispositivo, a menos que a aprovação automática local
- Aprovações de emparelhamento são necessárias para novos IDs de dispositivo, a menos que a autoaprovação local
esteja habilitada.
- A aprovação automática de pareamento é centrada em conexões diretas locais por loopback.
- O OpenClaw também tem um caminho restrito de autoconexão local de backend/container para
- A autoaprovação de emparelhamento é centrada em conexões diretas de loopback local.
- O OpenClaw também tem um caminho estreito de autoconexão local ao backend/container para
fluxos helper confiáveis com segredo compartilhado.
- Conexões no mesmo host por tailnet ou LAN ainda são tratadas como remotas para pareamento e
- Conexões tailnet ou LAN no mesmo host ainda são tratadas como remotas para fins de emparelhamento e
exigem aprovação.
- Todos os clientes WS devem incluir identidade `device` durante `connect` (operator + node).
- Todos os clientes WS devem incluir a identidade `device` durante `connect` (operator + node).
A Control UI só pode omiti-la nestes modos:
- `gateway.controlUi.allowInsecureAuth=true` para compatibilidade com HTTP inseguro apenas em localhost.
- autenticação bem-sucedida de operator da Control UI com `gateway.auth.mode: "trusted-proxy"`.
- `gateway.controlUi.dangerouslyDisableDeviceAuth=true` (break-glass, grave redução de segurança).
- autenticação operator bem-sucedida da Control UI com `gateway.auth.mode: "trusted-proxy"`.
- `gateway.controlUi.dangerouslyDisableDeviceAuth=true` (break-glass, downgrade grave de segurança).
- Todas as conexões devem assinar o nonce `connect.challenge` fornecido pelo servidor.
### Diagnósticos de migração de autenticação de dispositivo
Para clientes legados que ainda usam o comportamento de assinatura pré-desafio, `connect` agora retorna
Para clientes legados que ainda usam o comportamento de assinatura anterior ao challenge, `connect` agora retorna
códigos de detalhe `DEVICE_AUTH_*` em `error.details.code` com um `error.details.reason` estável.
Falhas comuns de migração:
| Mensagem | details.code | details.reason | Significado |
| --------------------------- | -------------------------------- | ------------------------ | -------------------------------------------------- |
| `device nonce required` | `DEVICE_AUTH_NONCE_REQUIRED` | `device-nonce-missing` | O cliente omitiu `device.nonce` (ou o enviou em branco). |
| `device nonce mismatch` | `DEVICE_AUTH_NONCE_MISMATCH` | `device-nonce-mismatch` | O cliente assinou com um nonce antigo/incorreto. |
| Mensagem | details.code | details.reason | Significado |
| --------------------------- | -------------------------------- | ------------------------ | --------------------------------------------------- |
| `device nonce required` | `DEVICE_AUTH_NONCE_REQUIRED` | `device-nonce-missing` | O cliente omitiu `device.nonce` (ou enviou vazio). |
| `device nonce mismatch` | `DEVICE_AUTH_NONCE_MISMATCH` | `device-nonce-mismatch` | O cliente assinou com um nonce antigo/incorreto. |
| `device signature invalid` | `DEVICE_AUTH_SIGNATURE_INVALID` | `device-signature` | O payload da assinatura não corresponde ao payload v2. |
| `device signature expired` | `DEVICE_AUTH_SIGNATURE_EXPIRED` | `device-signature-stale` | O timestamp assinado está fora da defasagem permitida. |
| `device signature expired` | `DEVICE_AUTH_SIGNATURE_EXPIRED` | `device-signature-stale` | O timestamp assinado está fora da tolerância permitida. |
| `device identity mismatch` | `DEVICE_AUTH_DEVICE_ID_MISMATCH` | `device-id-mismatch` | `device.id` não corresponde à impressão digital da chave pública. |
| `device public key invalid` | `DEVICE_AUTH_PUBLIC_KEY_INVALID` | `device-public-key` | O formato/canonicalização da chave pública falhou. |
| `device public key invalid` | `DEVICE_AUTH_PUBLIC_KEY_INVALID` | `device-public-key` | O formato/canonicalização da chave pública falhou. |
Destino da migração:
Alvo da migração:
- Sempre aguarde `connect.challenge`.
- Assine o payload v2 que inclui o nonce do servidor.
- Envie o mesmo nonce em `connect.params.device.nonce`.
- O payload de assinatura preferido é `v3`, que vincula `platform` e `deviceFamily`
além dos campos device/client/role/scopes/token/nonce.
- Assinaturas legadas `v2` continuam sendo aceitas por compatibilidade, mas o pinning de metadados
do dispositivo pareado ainda controla a política de comandos na reconexão.
além dos campos de dispositivo/cliente/papel/escopos/token/nonce.
- Assinaturas legadas `v2` continuam sendo aceitas por compatibilidade, mas o pinning de
metadados de dispositivo emparelhado ainda controla a política de comandos na reconexão.
## TLS + pinning
- TLS é compatível com conexões WS.
- Os clientes podem opcionalmente fixar a impressão digital do certificado do gateway (consulte a configuração `gateway.tls`
além de `gateway.remote.tlsFingerprint` ou a CLI `--tls-fingerprint`).
- Os clientes podem opcionalmente fixar a impressão digital do certificado do gateway (veja a configuração `gateway.tls`
mais `gateway.remote.tlsFingerprint` ou a CLI `--tls-fingerprint`).
## Escopo
Este protocolo expõe a **API completa do gateway** (status, canais, modelos, chat,
agente, sessões, nós, aprovações etc.). A superfície exata é definida pelos
esquemas TypeBox em `src/gateway/protocol/schema.ts`.
agent, sessões, nodes, aprovações etc.). A superfície exata é definida pelos
schemas TypeBox em `src/gateway/protocol/schema.ts`.

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +1,45 @@
---
read_when:
- Ao implementar recursos do app do macOS
- Ao alterar o ciclo de vida do gateway ou a ponte de nodes no macOS
summary: App complementar do OpenClaw para macOS (barra de menus + broker do Gateway)
title: App do macOS
- Implementando recursos do aplicativo para macOS
- Alterando o ciclo de vida do Gateway ou a ponte de Node no macOS
summary: Aplicativo complementar do OpenClaw para macOS (barra de menus + corretor do Gateway)
title: Aplicativo para macOS
x-i18n:
generated_at: "2026-04-05T12:48:34Z"
generated_at: "2026-04-18T05:24:46Z"
model: gpt-5.4
provider: openai
source_hash: bfac937e352ede495f60af47edf3b8e5caa5b692ba0ea01d9fb0de9a44bbc135
source_hash: d637df2f73ced110223c48ea3c934045d782e150a46495f434cf924a6a00baf0
source_path: platforms/macos.md
workflow: 15
---
# Companion do OpenClaw para macOS (barra de menus + broker do Gateway)
# Companion do OpenClaw para macOS (barra de menus + corretor do Gateway)
O app do macOS é o **companion da barra de menus** do OpenClaw. Ele controla permissões,
gerencia/se conecta ao Gateway localmente (launchd ou manual) e expõe recursos do macOS
O aplicativo para macOS é o **companion da barra de menus** do OpenClaw. Ele controla permissões,
gerencia/anexa ao Gateway localmente (launchd ou manualmente) e expõe recursos do macOS
ao agente como um node.
## O que ele faz
- Mostra notificações nativas e status na barra de menus.
- Controla prompts do TCC (Notificações, Acessibilidade, Gravação de Tela, Microfone,
- Exibe notificações nativas e status na barra de menus.
- Controla os prompts do TCC (Notificações, Acessibilidade, Gravação de Tela, Microfone,
Reconhecimento de Fala, Automação/AppleScript).
- Executa ou se conecta ao Gateway (local ou remoto).
- Expõe ferramentas exclusivas do macOS (Canvas, Câmera, Gravação de Tela, `system.run`).
- Inicia o serviço local de host de node no modo **remoto** (launchd) e o interrompe no modo **local**.
- Opcionalmente hospeda a **PeekabooBridge** para automação de UI.
- Instala a CLI global (`openclaw`) sob demanda via npm, pnpm ou bun (o app prefere npm, depois pnpm, depois bun; Node continua sendo o runtime recomendado para o Gateway).
- Opcionalmente hospeda o **PeekabooBridge** para automação de UI.
- Instala a CLI global (`openclaw`) sob demanda via npm, pnpm ou bun (o app prefere npm, depois pnpm, depois bun; Node continua sendo o runtime recomendado do Gateway).
## Modo local vs remoto
## Modo local vs. remoto
- **Local** (padrão): o app se conecta a um Gateway local em execução, se houver;
caso contrário, ele habilita o serviço launchd via `openclaw gateway install`.
- **Remoto**: o app se conecta a um Gateway por SSH/Tailscale e nunca inicia
- **Local** (padrão): o app se anexa a um Gateway local em execução, se presente;
caso contrário, ele ativa o serviço launchd via `openclaw gateway install`.
- **Remoto**: o app se conecta a um Gateway via SSH/Tailscale e nunca inicia
um processo local.
O app inicia o **serviço local de host de node** para que o Gateway remoto possa alcançar este Mac.
O app não inicia o Gateway como um processo filho.
A descoberta do Gateway agora prefere nomes MagicDNS do Tailscale a IPs brutos da tailnet,
para que o app do Mac se recupere com mais confiabilidade quando os IPs da tailnet mudarem.
O app inicia o **serviço de host de node** local para que o Gateway remoto possa alcançar este Mac.
O app não inicia o Gateway como processo filho.
A descoberta do Gateway agora prefere nomes Tailscale MagicDNS em vez de IPs brutos da tailnet,
então o app para Mac se recupera com mais confiabilidade quando os IPs da tailnet mudam.
## Controle do launchd
@ -51,26 +51,26 @@ launchctl kickstart -k gui/$UID/ai.openclaw.gateway
launchctl bootout gui/$UID/ai.openclaw.gateway
```
Substitua o rótulo por `ai.openclaw.<profile>` ao executar com um perfil nomeado.
Substitua o rótulo por `ai.openclaw.<profile>` ao executar um perfil nomeado.
Se o LaunchAgent não estiver instalado, habilite-o pelo app ou execute
Se o LaunchAgent não estiver instalado, ative-o pelo app ou execute
`openclaw gateway install`.
## Recursos do node (Mac)
## Recursos do node (mac)
O app do macOS se apresenta como um node. Comandos comuns:
O app para macOS se apresenta como um node. Comandos comuns:
- Canvas: `canvas.present`, `canvas.navigate`, `canvas.eval`, `canvas.snapshot`, `canvas.a2ui.*`
- Câmera: `camera.snap`, `camera.clip`
- Tela: `screen.record`
- Tela: `screen.snapshot`, `screen.record`
- Sistema: `system.run`, `system.notify`
O node informa um mapa `permissions` para que os agentes possam decidir o que é permitido.
O node relata um mapa `permissions` para que agentes possam decidir o que é permitido.
Serviço de node + IPC do app:
- Quando o serviço headless de host de node está em execução (modo remoto), ele se conecta ao WS do Gateway como um node.
- `system.run` é executado no app do macOS (contexto de UI/TCC) por um socket Unix local; prompts + saída permanecem no app.
- Quando o serviço headless de host de node está em execução (modo remoto), ele se conecta ao Gateway WS como um node.
- `system.run` é executado no app para macOS (contexto UI/TCC) por um socket Unix local; prompts + saída permanecem no app.
Diagrama (SCI):
@ -83,8 +83,8 @@ Gateway -> Node Service (WS)
## Aprovações de execução (`system.run`)
`system.run` é controlado por **aprovações de execução** no app do macOS (Configurações → Aprovações de execução).
Segurança + pergunta + allowlist são armazenados localmente no Mac em:
`system.run` é controlado por **Aprovações de execução** no app para macOS (Ajustes → Aprovações de execução).
Segurança + perguntar + allowlist são armazenados localmente no Mac em:
```
~/.openclaw/exec-approvals.json
@ -111,12 +111,12 @@ Exemplo:
Observações:
- Entradas de `allowlist` são padrões glob para caminhos de binários resolvidos.
- Entradas de `allowlist` são padrões glob para caminhos resolvidos de binários.
- Texto bruto de comando shell que contém sintaxe de controle ou expansão do shell (`&&`, `||`, `;`, `|`, `` ` ``, `$`, `<`, `>`, `(`, `)`) é tratado como ausência na allowlist e exige aprovação explícita (ou inclusão do binário do shell na allowlist).
- Escolher “Sempre permitir” no prompt adiciona esse comando à allowlist.
- Substituições de ambiente de `system.run` são filtradas (remove `PATH`, `DYLD_*`, `LD_*`, `NODE_OPTIONS`, `PYTHON*`, `PERL*`, `RUBYOPT`, `SHELLOPTS`, `PS4`) e depois mescladas com o ambiente do app.
- Para wrappers de shell (`bash|sh|zsh ... -c/-lc`), as substituições de ambiente no escopo da solicitação são reduzidas a uma pequena allowlist explícita (`TERM`, `LANG`, `LC_*`, `COLORTERM`, `NO_COLOR`, `FORCE_COLOR`).
- Para decisões de sempre permitir no modo allowlist, wrappers de despacho conhecidos (`env`, `nice`, `nohup`, `stdbuf`, `timeout`) persistem caminhos do executável interno em vez dos caminhos do wrapper. Se o desembrulho não for seguro, nenhuma entrada de allowlist é persistida automaticamente.
- As substituições de ambiente de `system.run` são filtradas (remove `PATH`, `DYLD_*`, `LD_*`, `NODE_OPTIONS`, `PYTHON*`, `PERL*`, `RUBYOPT`, `SHELLOPTS`, `PS4`) e então mescladas com o ambiente do app.
- Para wrappers de shell (`bash|sh|zsh ... -c/-lc`), as substituições de ambiente com escopo de solicitação são reduzidas a uma pequena allowlist explícita (`TERM`, `LANG`, `LC_*`, `COLORTERM`, `NO_COLOR`, `FORCE_COLOR`).
- Para decisões de sempre permitir no modo allowlist, wrappers de despacho conhecidos (`env`, `nice`, `nohup`, `stdbuf`, `timeout`) persistem os caminhos internos do executável em vez dos caminhos do wrapper. Se o desembrulho não for seguro, nenhuma entrada de allowlist será persistida automaticamente.
## Links profundos
@ -124,9 +124,9 @@ O app registra o esquema de URL `openclaw://` para ações locais.
### `openclaw://agent`
Aciona uma solicitação `agent` do Gateway.
Dispara uma solicitação `agent` do Gateway.
__OC_I18N_900004__
Parâmetros da query:
Parâmetros de consulta:
- `message` (obrigatório)
- `sessionKey` (opcional)
@ -143,18 +143,18 @@ Segurança:
## Fluxo de onboarding (típico)
1. Instale e execute o **OpenClaw.app**.
1. Instale e abra o **OpenClaw.app**.
2. Conclua a checklist de permissões (prompts do TCC).
3. Garanta que o modo **Local** esteja ativo e que o Gateway esteja em execução.
4. Instale a CLI se quiser acesso pelo terminal.
## Localização do diretório de estado (macOS)
## Posicionamento do diretório de estado (macOS)
Evite colocar seu diretório de estado do OpenClaw no iCloud ou em outras pastas sincronizadas pela nuvem.
Caminhos com sincronização em segundo plano podem adicionar latência e ocasionalmente causar condições de corrida de bloqueio de arquivo/sincronização para
Evite colocar seu diretório de estado do OpenClaw no iCloud ou em outras pastas sincronizadas com a nuvem.
Caminhos com sincronização podem adicionar latência e ocasionalmente causar condições de corrida de bloqueio de arquivo/sincronização para
sessões e credenciais.
Prefira um caminho de estado local sem sincronização, como:
Prefira um caminho de estado local não sincronizado, como:
__OC_I18N_900005__
Se `openclaw doctor` detectar estado em:
@ -163,60 +163,60 @@ Se `openclaw doctor` detectar estado em:
ele emitirá um aviso e recomendará voltar para um caminho local.
## Workflow de build e desenvolvimento (nativo)
## Fluxo de build e desenvolvimento (nativo)
- `cd apps/macos && swift build`
- `swift run OpenClaw` (ou Xcode)
- Empacotar o app: `scripts/package-mac-app.sh`
- Empacotar app: `scripts/package-mac-app.sh`
## Depurar conectividade com o Gateway (CLI do macOS)
## Depurar conectividade do Gateway (CLI do macOS)
Use a CLI de depuração para exercitar o mesmo handshake WebSocket do Gateway e a mesma lógica de descoberta
que o app do macOS usa, sem iniciar o app.
Use a CLI de depuração para exercitar o mesmo handshake e a mesma lógica de descoberta do Gateway WebSocket
que o app para macOS usa, sem abrir o app.
__OC_I18N_900006__
Opções de conexão:
- `--url <ws://host:port>`: substitui a configuração
- `--mode <local|remote>`: resolve a partir da configuração (padrão: configuração ou local)
- `--probe`: força uma sondagem de integridade nova
- `--probe`: força uma nova sondagem de saúde
- `--timeout <ms>`: tempo limite da solicitação (padrão: `15000`)
- `--json`: saída estruturada para comparação
- `--json`: saída estruturada para diff
Opções de descoberta:
- `--include-local`: inclui gateways que seriam filtrados como “locais”
- `--timeout <ms>`: janela geral de descoberta (padrão: `2000`)
- `--json`: saída estruturada para comparação
- `--timeout <ms>`: janela total de descoberta (padrão: `2000`)
- `--json`: saída estruturada para diff
Dica: compare com `openclaw gateway discover --json` para ver se o
pipeline de descoberta do app do macOS (`local.` mais o domínio de longa distância configurado, com
fallbacks de longa distância e Tailscale Serve) difere do
descobrimento baseado em `dns-sd` da CLI em Node.
pipeline de descoberta do app para macOS (`local.` mais o domínio de área ampla configurado, com
fallbacks de área ampla e Tailscale Serve) difere da
descoberta baseada em `dns-sd` da CLI do Node.
## Infraestrutura de conexão remota (túneis SSH)
## Infraestrutura da conexão remota (túneis SSH)
Quando o app do macOS é executado no modo **Remoto**, ele abre um túnel SSH para que componentes locais de UI
possam conversar com um Gateway remoto como se ele estivesse em localhost.
Quando o app para macOS é executado no modo **Remoto**, ele abre um túnel SSH para que componentes locais da UI
possam se comunicar com um Gateway remoto como se ele estivesse no localhost.
### Túnel de controle (porta WebSocket do Gateway)
- **Objetivo:** verificações de integridade, status, Chat Web, configuração e outras chamadas do plano de controle.
- **Finalidade:** verificações de integridade, status, Web Chat, configuração e outras chamadas do plano de controle.
- **Porta local:** a porta do Gateway (padrão `18789`), sempre estável.
- **Porta remota:** a mesma porta do Gateway no host remoto.
- **Comportamento:** sem porta local aleatória; o app reutiliza um túnel íntegro existente
ou o reinicia se necessário.
- **Formato do SSH:** `ssh -N -L <local>:127.0.0.1:<remote>` com BatchMode +
ExitOnForwardFailure + opções de keepalive.
- **Relato de IP:** o túnel SSH usa loopback, então o gateway verá o IP do node
como `127.0.0.1`. Use o transporte **Direct (ws/wss)** se quiser que o IP real do cliente
apareça (consulte [acesso remoto no macOS](/platforms/mac/remote)).
ou o reinicia, se necessário.
- **Formato do SSH:** `ssh -N -L <local>:127.0.0.1:<remote>` com opções BatchMode +
ExitOnForwardFailure + keepalive.
- **Relato de IP:** o túnel SSH usa loopback, então o gateway verá o
IP do node como `127.0.0.1`. Use o transporte **Direct (ws/wss)** se quiser que o IP real do cliente
apareça (veja [acesso remoto no macOS](/pt-BR/platforms/mac/remote)).
Para as etapas de configuração, consulte [acesso remoto no macOS](/platforms/mac/remote). Para detalhes
do protocolo, consulte [protocolo do Gateway](/pt-BR/gateway/protocol).
Para etapas de configuração, veja [acesso remoto no macOS](/pt-BR/platforms/mac/remote). Para detalhes do protocolo,
veja [protocolo do Gateway](/pt-BR/gateway/protocol).
## Documentação relacionada
- [Runbook do Gateway](/pt-BR/gateway)
- [Gateway (macOS)](/pt-BR/platforms/mac/bundled-gateway)
- [permissões do macOS](/platforms/mac/permissions)
- [Permissões do macOS](/pt-BR/platforms/mac/permissions)
- [Canvas](/pt-BR/platforms/mac/canvas)

View File

@ -2,113 +2,88 @@
read_when:
- Você está criando um novo Plugin de canal de mensagens
- Você quer conectar o OpenClaw a uma plataforma de mensagens
- Você precisa entender a superfície do adaptador `ChannelPlugin`
- Você precisa entender a superfície do adaptador ChannelPlugin
sidebarTitle: Channel Plugins
summary: Guia passo a passo para criar um Plugin de canal de mensagens para OpenClaw
summary: Guia passo a passo para criar um Plugin de canal de mensagens para o OpenClaw
title: Criando Plugins de canal
x-i18n:
generated_at: "2026-04-15T19:41:41Z"
generated_at: "2026-04-18T05:25:12Z"
model: gpt-5.4
provider: openai
source_hash: 80e47e61d1e47738361692522b79aff276544446c58a7b41afe5296635dfad4b
source_hash: 3dda53c969bc7356a450c2a5bf49fb82bf1283c23e301dec832d8724b11e724b
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
# Criando Plugins de canal
Este guia mostra como criar um Plugin de canal que conecta o OpenClaw a uma
plataforma de mensagens. Ao final, você terá um canal funcional com segurança em DM,
emparelhamento, encadeamento de respostas e mensagens de saída.
Este guia mostra passo a passo como criar um Plugin de canal que conecta o OpenClaw a uma plataforma de mensagens. Ao final, você terá um canal funcional com segurança de DM, emparelhamento, encadeamento de respostas e mensagens de saída.
<Info>
Se você ainda não criou nenhum Plugin do OpenClaw antes, leia
[Primeiros passos](/pt-BR/plugins/building-plugins) primeiro para entender a estrutura
básica do pacote e a configuração do manifesto.
Se você ainda não criou nenhum Plugin do OpenClaw, leia
[Primeiros passos](/pt-BR/plugins/building-plugins) primeiro para entender a
estrutura básica do pacote e a configuração do manifesto.
</Info>
## Como os Plugins de canal funcionam
Os Plugins de canal não precisam de suas próprias ferramentas de enviar/editar/reagir. O OpenClaw mantém uma
ferramenta `message` compartilhada no core. Seu Plugin é responsável por:
Plugins de canal não precisam de suas próprias ferramentas de enviar/editar/reagir. O OpenClaw mantém uma ferramenta `message` compartilhada no core. Seu Plugin é responsável por:
- **Configuração** — resolução de conta e assistente de configuração
- **Segurança** — política de DM e listas de permissão
- **Emparelhamento** — fluxo de aprovação de DM
- **Gramática de sessão** — como ids de conversa específicos do provedor são mapeados para chats base, ids de thread e fallbacks de pai
- **Gramática de sessão** — como IDs de conversa específicos do provedor são mapeados para chats-base, IDs de thread e fallbacks de pai
- **Saída** — envio de texto, mídia e enquetes para a plataforma
- **Encadeamento** — como as respostas são encadeadas
O core é responsável pela ferramenta de mensagem compartilhada, pela integração com o prompt, pelo formato externo da chave de sessão,
pela lógica genérica de `:thread:`, e pelo despacho.
O core é responsável pela ferramenta de mensagem compartilhada, ligação do prompt, o formato externo da chave de sessão, o controle genérico de `:thread:` e o despacho.
Se o seu canal adicionar parâmetros da ferramenta de mensagem que carregam fontes de mídia, exponha esses
nomes de parâmetro por meio de `describeMessageTool(...).mediaSourceParams`. O core usa
essa lista explícita para normalização de caminho em sandbox e política de acesso
a mídia de saída, para que os Plugins não precisem de casos especiais no core compartilhado para parâmetros específicos do provedor,
como avatar, anexo ou imagem de capa.
Se o seu canal adicionar parâmetros à ferramenta de mensagem que carreguem fontes de mídia, exponha esses nomes de parâmetros por meio de `describeMessageTool(...).mediaSourceParams`. O core usa essa lista explícita para normalização de caminhos do sandbox e para a política de acesso a mídia de saída, então os plugins não precisam de casos especiais no core compartilhado para parâmetros específicos do provedor, como avatar, anexo ou imagem de capa.
Prefira retornar um mapa indexado por ação, como
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, para que ações não relacionadas não
herdem os argumentos de mídia de outra ação. Um array simples ainda funciona para parâmetros que
são intencionalmente compartilhados entre todas as ações expostas.
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, para que ações não relacionadas não herdem os argumentos de mídia de outra ação. Um array simples ainda funciona para parâmetros compartilhados intencionalmente entre todas as ações expostas.
Se a sua plataforma armazenar escopo extra dentro dos ids de conversa, mantenha essa lógica de parsing
no Plugin com `messaging.resolveSessionConversation(...)`. Esse é o hook canônico para mapear
`rawId` para o id da conversa base, id opcional de thread,
`baseConversationId` explícito e quaisquer `parentConversationCandidates`.
Quando você retornar `parentConversationCandidates`, mantenha-os ordenados do
pai mais específico para a conversa base/mais ampla.
Se a sua plataforma armazenar escopo extra dentro dos IDs de conversa, mantenha essa análise no plugin com `messaging.resolveSessionConversation(...)`. Esse é o hook canônico para mapear `rawId` para o ID da conversa-base, ID de thread opcional, `baseConversationId` explícito e quaisquer `parentConversationCandidates`.
Ao retornar `parentConversationCandidates`, mantenha-os ordenados do pai mais específico para a conversa-pai mais ampla/base.
Plugins empacotados que precisam do mesmo parsing antes de o registro de canais ser inicializado
também podem expor um arquivo de nível superior `session-key-api.ts` com uma exportação
`resolveSessionConversation(...)` correspondente. O core usa essa superfície segura para bootstrap
apenas quando o registro de Plugins em runtime ainda não está disponível.
Plugins empacotados que precisem da mesma análise antes de o registro do canal ser inicializado também podem expor um arquivo `session-key-api.ts` de nível superior com uma exportação correspondente `resolveSessionConversation(...)`. O core usa essa superfície segura para bootstrap somente quando o registro de plugins em runtime ainda não está disponível.
`messaging.resolveParentConversationCandidates(...)` continua disponível como
fallback legado de compatibilidade quando um Plugin só precisa de fallbacks de pai
sobre o id genérico/raw. Se ambos os hooks existirem, o core usa
`resolveSessionConversation(...).parentConversationCandidates` primeiro e só
recorre a `resolveParentConversationCandidates(...)` quando o hook canônico
os omite.
`messaging.resolveParentConversationCandidates(...)` continua disponível como fallback legado de compatibilidade quando um plugin só precisa de fallbacks de pai sobre o ID genérico/bruto. Se ambos os hooks existirem, o core usa primeiro `resolveSessionConversation(...).parentConversationCandidates` e só faz fallback para `resolveParentConversationCandidates(...)` quando o hook canônico os omite.
## Aprovações e capacidades do canal
A maioria dos Plugins de canal não precisa de código específico para aprovações.
A maioria dos Plugins de canal não precisa de código específico para aprovação.
- O core é responsável por `/approve` no mesmo chat, payloads compartilhados de botão de aprovação e entrega genérica de fallback.
- Prefira um único objeto `approvalCapability` no Plugin de canal quando o canal precisar de comportamento específico para aprovações.
- `ChannelPlugin.approvals` foi removido. Coloque fatos de entrega/renderização/autorização nativa de aprovação em `approvalCapability`.
- `plugin.auth` é apenas para login/logout; o core não lê mais hooks de autorização de aprovação desse objeto.
- `approvalCapability.authorizeActorAction` e `approvalCapability.getActionAvailabilityState` são a superfície canônica para autorização de aprovação.
- Use `approvalCapability.getActionAvailabilityState` para disponibilidade de autorização de aprovação no mesmo chat.
- Se o seu canal expuser aprovações nativas de execução, use `approvalCapability.getExecInitiatingSurfaceState` para o estado da superfície iniciadora/cliente nativo quando ele diferir da autorização de aprovação no mesmo chat. O core usa esse hook específico de execução para distinguir `enabled` de `disabled`, decidir se o canal iniciador oferece suporte a aprovações nativas de execução e incluir o canal na orientação de fallback do cliente nativo. `createApproverRestrictedNativeApprovalCapability(...)` preenche isso para o caso comum.
- Use `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` para comportamento específico do canal no ciclo de vida do payload, como ocultar prompts locais duplicados de aprovação ou enviar indicadores de digitação antes da entrega.
- Use `approvalCapability.delivery` apenas para roteamento nativo de aprovação ou supressão de fallback.
- Use `approvalCapability.nativeRuntime` para fatos de aprovação nativa controlados pelo canal. Mantenha-o lazy em pontos de entrada críticos do canal com `createLazyChannelApprovalNativeRuntimeAdapter(...)`, que pode importar seu módulo de runtime sob demanda e ainda permitir que o core monte o ciclo de vida da aprovação.
- O core é responsável por `/approve` no mesmo chat, payloads compartilhados de botão de aprovação e entrega genérica por fallback.
- Prefira um único objeto `approvalCapability` no Plugin de canal quando o canal precisar de comportamento específico de aprovação.
- `ChannelPlugin.approvals` foi removido. Coloque fatos de entrega/aprovação nativa/renderização/autenticação em `approvalCapability`.
- `plugin.auth` é apenas para login/logout; o core não lê mais hooks de autenticação de aprovação desse objeto.
- `approvalCapability.authorizeActorAction` e `approvalCapability.getActionAvailabilityState` são a superfície canônica para autenticação de aprovação.
- Use `approvalCapability.getActionAvailabilityState` para disponibilidade de autenticação de aprovação no mesmo chat.
- Se o seu canal expõe aprovações nativas de exec, use `approvalCapability.getExecInitiatingSurfaceState` para o estado da superfície iniciadora/cliente nativo quando ele diferir da autenticação de aprovação no mesmo chat. O core usa esse hook específico de exec para distinguir `enabled` de `disabled`, decidir se o canal iniciador oferece suporte a aprovações nativas de exec e incluir o canal nas orientações de fallback do cliente nativo. `createApproverRestrictedNativeApprovalCapability(...)` preenche isso para o caso comum.
- Use `outbound.shouldSuppressLocalPayloadPrompt` ou `outbound.beforeDeliverPayload` para comportamentos específicos do ciclo de vida do payload no canal, como ocultar prompts locais de aprovação duplicados ou enviar indicadores de digitação antes da entrega.
- Use `approvalCapability.delivery` apenas para roteamento de aprovação nativa ou supressão de fallback.
- Use `approvalCapability.nativeRuntime` para fatos de aprovação nativa pertencentes ao canal. Mantenha-o lazy em pontos de entrada críticos do canal com `createLazyChannelApprovalNativeRuntimeAdapter(...)`, que pode importar seu módulo de runtime sob demanda enquanto ainda permite que o core monte o ciclo de vida de aprovação.
- Use `approvalCapability.render` apenas quando um canal realmente precisar de payloads de aprovação personalizados em vez do renderizador compartilhado.
- Use `approvalCapability.describeExecApprovalSetup` quando o canal quiser que a resposta do caminho desabilitado explique exatamente quais opções de configuração são necessárias para habilitar aprovações nativas de execução. O hook recebe `{ channel, channelLabel, accountId }`; canais com contas nomeadas devem renderizar caminhos com escopo de conta, como `channels.<channel>.accounts.<id>.execApprovals.*`, em vez de padrões de nível superior.
- Se um canal puder inferir identidades estáveis semelhantes a proprietário em DM a partir da configuração existente, use `createResolvedApproverActionAuthAdapter` de `openclaw/plugin-sdk/approval-runtime` para restringir `/approve` no mesmo chat sem adicionar lógica específica de aprovação ao core.
- Se um canal precisar de entrega nativa de aprovação, mantenha o código do canal focado em normalização de alvo mais fatos de transporte/apresentação. Use `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` e `createApproverRestrictedNativeApprovalCapability` de `openclaw/plugin-sdk/approval-runtime`. Coloque os fatos específicos do canal atrás de `approvalCapability.nativeRuntime`, idealmente por meio de `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, para que o core possa montar o handler e controlar filtragem de solicitações, roteamento, eliminação de duplicatas, expiração, assinatura do Gateway e avisos de roteamento para outro local. `nativeRuntime` é dividido em algumas superfícies menores:
- `availability` — se a conta está configurada e se uma solicitação deve ser tratada
- `presentation` — mapeia o modelo de visualização compartilhado de aprovação em payloads nativos pendentes/resolvidos/expirados ou ações finais
- `transport` — prepara alvos e envia/atualiza/remove mensagens nativas de aprovação
- Use `approvalCapability.describeExecApprovalSetup` quando o canal quiser que a resposta no caminho desabilitado explique exatamente quais controles de configuração são necessários para habilitar aprovações nativas de exec. O hook recebe `{ channel, channelLabel, accountId }`; canais com conta nomeada devem renderizar caminhos com escopo por conta, como `channels.<channel>.accounts.<id>.execApprovals.*`, em vez de padrões de nível superior.
- Se um canal puder inferir identidades de DM estáveis semelhantes a proprietário a partir da configuração existente, use `createResolvedApproverActionAuthAdapter` de `openclaw/plugin-sdk/approval-runtime` para restringir `/approve` no mesmo chat sem adicionar lógica específica de aprovação ao core.
- Se um canal precisar de entrega de aprovação nativa, mantenha o código do canal focado em normalização de destino mais fatos de transporte/apresentação. Use `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` e `createApproverRestrictedNativeApprovalCapability` de `openclaw/plugin-sdk/approval-runtime`. Coloque os fatos específicos do canal em `approvalCapability.nativeRuntime`, idealmente via `createChannelApprovalNativeRuntimeAdapter(...)` ou `createLazyChannelApprovalNativeRuntimeAdapter(...)`, para que o core possa montar o handler e ser responsável por filtragem de requisição, roteamento, deduplicação, expiração, inscrição no Gateway e avisos de roteamento alternativo. `nativeRuntime` é dividido em algumas superfícies menores:
- `availability` — se a conta está configurada e se uma requisição deve ser tratada
- `presentation` — mapeia o view model compartilhado de aprovação para payloads nativos pendentes/resolvidos/expirados ou ações finais
- `transport` — prepara destinos mais envio/atualização/exclusão de mensagens nativas de aprovação
- `interactions` — hooks opcionais de bind/unbind/clear-action para botões nativos ou reações
- `observe` — hooks opcionais de diagnóstico de entrega
- Se o canal precisar de objetos controlados pelo runtime, como um cliente, token, app Bolt ou receptor de Webhook, registre-os por meio de `openclaw/plugin-sdk/channel-runtime-context`. O registro genérico de contexto de runtime permite que o core inicialize handlers orientados por capacidade a partir do estado de inicialização do canal sem adicionar glue de wrapper específico para aprovação.
- Se o canal precisar de objetos pertencentes ao runtime, como um client, token, app Bolt ou receptor de webhook, registre-os por meio de `openclaw/plugin-sdk/channel-runtime-context`. O registro genérico de contexto de runtime permite que o core inicialize handlers orientados por capacidade a partir do estado de inicialização do canal sem adicionar cola wrapper específica de aprovação.
- Recorra a `createChannelApprovalHandler` ou `createChannelNativeApprovalRuntime` de nível mais baixo apenas quando a superfície orientada por capacidade ainda não for expressiva o suficiente.
- Canais com aprovação nativa devem rotear `accountId` e `approvalKind` por esses helpers. `accountId` mantém a política de aprovação multiconta restrita à conta de bot correta, e `approvalKind` mantém o comportamento de aprovação de execução vs Plugin disponível para o canal sem ramificações codificadas no core.
- O core agora também é responsável por avisos de redirecionamento de aprovação. Plugins de canal não devem enviar suas próprias mensagens de acompanhamento do tipo "a aprovação foi para DMs / outro canal" a partir de `createChannelNativeApprovalRuntime`; em vez disso, exponha roteamento preciso de origem + DM do aprovador por meio dos helpers compartilhados de capacidade de aprovação e deixe o core agregar as entregas reais antes de publicar qualquer aviso de volta no chat iniciador.
- Preserve a categoria do id de aprovação entregue de ponta a ponta. Clientes nativos não devem
inferir nem reescrever o roteamento de aprovação de execução vs Plugin com base no estado local do canal.
- Diferentes tipos de aprovação podem expor intencionalmente diferentes superfícies nativas.
Exemplos atuais empacotados:
- O Slack mantém o roteamento nativo de aprovação disponível tanto para ids de execução quanto de Plugin.
- O Matrix mantém o mesmo roteamento nativo por DM/canal e a mesma UX de reação para aprovações de execução
e de Plugin, ao mesmo tempo em que ainda permite que a autorização difira por tipo de aprovação.
- `createApproverRestrictedNativeApprovalAdapter` ainda existe como wrapper de compatibilidade, mas código novo deve preferir o builder de capacidade e expor `approvalCapability` no Plugin.
- Canais de aprovação nativa devem rotear `accountId` e `approvalKind` por esses helpers. `accountId` mantém a política de aprovação multiconta no escopo da conta de bot correta, e `approvalKind` mantém o comportamento de aprovação de exec vs plugin disponível para o canal sem ramificações hardcoded no core.
- O core agora também é responsável pelos avisos de redirecionamento de aprovação. Plugins de canal não devem enviar suas próprias mensagens de acompanhamento do tipo “a aprovação foi para DMs / outro canal” a partir de `createChannelNativeApprovalRuntime`; em vez disso, exponha roteamento preciso de origem + DM do aprovador por meio dos helpers compartilhados de capacidade de aprovação e deixe o core agregar as entregas reais antes de publicar qualquer aviso de volta no chat iniciador.
- Preserve o tipo de ID de aprovação entregue de ponta a ponta. Clients nativos não devem adivinhar nem reescrever o roteamento de aprovação de exec vs plugin a partir de estado local do canal.
- Diferentes tipos de aprovação podem intencionalmente expor diferentes superfícies nativas.
Exemplos empacotados atuais:
- O Slack mantém o roteamento de aprovação nativa disponível para IDs de exec e de plugin.
- O Matrix mantém o mesmo roteamento nativo de DM/canal e a mesma UX de reação para aprovações de exec e de plugin, ao mesmo tempo em que ainda permite que a autenticação varie por tipo de aprovação.
- `createApproverRestrictedNativeApprovalAdapter` ainda existe como wrapper de compatibilidade, mas código novo deve preferir o construtor de capacidade e expor `approvalCapability` no plugin.
Para pontos de entrada críticos do canal, prefira os subcaminhos de runtime mais específicos quando você só
precisar de uma parte dessa família:
Para pontos de entrada críticos do canal, prefira os subcaminhos de runtime mais específicos quando você precisar de apenas uma parte dessa família:
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -125,43 +100,34 @@ Da mesma forma, prefira `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/reply-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference` e
`openclaw/plugin-sdk/reply-chunking` quando você não precisar da superfície
guarda-chuva mais ampla.
`openclaw/plugin-sdk/reply-chunking` quando você não precisar da
superfície guarda-chuva mais ampla.
Especificamente para setup:
- `openclaw/plugin-sdk/setup-runtime` cobre os helpers de setup seguros para runtime:
adaptadores de patch de setup seguros para importação (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), saída de nota de consulta,
`promptResolvedAllowFrom`, `splitSetupEntries` e os builders
`createSetupInputPresenceValidator`), saída de nota de lookup,
`promptResolvedAllowFrom`, `splitSetupEntries` e os construtores
delegados de proxy de setup
- `openclaw/plugin-sdk/setup-adapter-runtime` é a superfície estreita de adaptador com reconhecimento de env
para `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` cobre os builders de setup com instalação opcional
além de algumas primitivas seguras para setup:
- `openclaw/plugin-sdk/setup-adapter-runtime` é a superfície estreita de adaptador com reconhecimento de ambiente para `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` cobre os construtores de setup de instalação opcional mais alguns primitivos seguros de setup:
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
Se o seu canal oferecer suporte a setup ou auth orientados por env e os fluxos genéricos de inicialização/configuração
precisarem conhecer esses nomes de env antes de o runtime ser carregado, declare-os no
manifesto do Plugin com `channelEnvVars`. Mantenha `envVars` do runtime do canal ou constantes locais apenas
para cópia voltada ao operador.
Se o seu canal oferecer suporte a setup ou autenticação orientados por ambiente e fluxos genéricos de inicialização/configuração precisarem conhecer esses nomes de variáveis de ambiente antes de o runtime ser carregado, declare-os no manifesto do plugin com `channelEnvVars`. Mantenha `envVars` do runtime do canal ou constantes locais apenas para cópia voltada ao operador.
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` e
`splitSetupEntries`
- use a superfície mais ampla `openclaw/plugin-sdk/setup` apenas quando você também precisar dos
helpers compartilhados mais pesados de setup/configuração, como
- use a superfície mais ampla `openclaw/plugin-sdk/setup` apenas quando você também precisar dos helpers compartilhados mais pesados de setup/configuração, como
`moveSingleAccountChannelSectionToDefaultAccount(...)`
Se o seu canal só quiser anunciar "instale este Plugin primeiro" em superfícies
de setup, prefira `createOptionalChannelSetupSurface(...)`. O
adaptador/assistente gerado falha em modo fechado em gravações de configuração e finalização, e reutiliza
a mesma mensagem de instalação obrigatória em validação, finalização e cópia
de link da documentação.
Se o seu canal quiser apenas anunciar “instale este plugin primeiro” em
superfícies de setup, prefira `createOptionalChannelSetupSurface(...)`. O
adaptador/assistente gerado falha de forma fechada em gravações de configuração e finalização, e reutiliza a mesma mensagem de instalação obrigatória em validação, finalização e cópia de link de documentação.
Para outros caminhos críticos do canal, prefira os helpers específicos em vez de superfícies
legadas mais amplas:
Para outros caminhos críticos do canal, prefira os helpers estreitos em vez das superfícies legadas mais amplas:
- `openclaw/plugin-sdk/account-core`,
`openclaw/plugin-sdk/account-id`,
@ -170,40 +136,44 @@ legadas mais amplas:
fallback de conta padrão
- `openclaw/plugin-sdk/inbound-envelope` e
`openclaw/plugin-sdk/inbound-reply-dispatch` para rota/envelope de entrada e
integração de registro e despacho
- `openclaw/plugin-sdk/messaging-targets` para parsing/correspondência de alvos
ligação entre registro e despacho
- `openclaw/plugin-sdk/messaging-targets` para análise/correspondência de destinos
- `openclaw/plugin-sdk/outbound-media` e
`openclaw/plugin-sdk/outbound-runtime` para carregamento de mídia mais delegados
de identidade/envio de saída
- `openclaw/plugin-sdk/thread-bindings-runtime` para ciclo de vida de vinculação de thread
e registro de adaptadores
- `openclaw/plugin-sdk/agent-media-payload` apenas quando um layout de campo legado de payload de agente/mídia
ainda for necessário
- `openclaw/plugin-sdk/telegram-command-config` para normalização de comandos personalizados do Telegram, validação de duplicatas/conflitos e um contrato de configuração de comando estável em fallback
`openclaw/plugin-sdk/outbound-runtime` para carregamento de mídia mais
delegados de identidade/envio de saída
- `openclaw/plugin-sdk/thread-bindings-runtime` para ciclo de vida de vínculo de thread
e registro de adaptador
- `openclaw/plugin-sdk/agent-media-payload` apenas quando um layout legado
de campo de payload de agente/mídia ainda for necessário
- `openclaw/plugin-sdk/telegram-command-config` para normalização de comandos
personalizados do Telegram, validação de duplicatas/conflitos e um contrato
de configuração de comando estável em fallback
Canais somente com auth normalmente podem ficar no caminho padrão: o core trata as aprovações e o Plugin apenas expõe capacidades de saída/auth. Canais com aprovação nativa, como Matrix, Slack, Telegram e transportes de chat personalizados, devem usar os helpers nativos compartilhados em vez de implementar seu próprio ciclo de vida de aprovação.
Canais somente de autenticação normalmente podem parar no caminho padrão: o core trata as aprovações e o plugin apenas expõe capacidades de saída/autenticação. Canais de aprovação nativa, como Matrix, Slack, Telegram e transportes de chat personalizados, devem usar os helpers nativos compartilhados em vez de implementar seu próprio ciclo de vida de aprovação.
## Política de menção de entrada
Mantenha o tratamento de menções de entrada dividido em duas camadas:
Mantenha o tratamento de menção de entrada dividido em duas camadas:
- coleta de evidências controlada pelo Plugin
- coleta de evidências pertencente ao plugin
- avaliação de política compartilhada
Use `openclaw/plugin-sdk/channel-inbound` para a camada compartilhada.
Use `openclaw/plugin-sdk/channel-mention-gating` para decisões de política de menção.
Use `openclaw/plugin-sdk/channel-inbound` apenas quando precisar da surface mais ampla de
helpers de entrada.
Bom encaixe para lógica local do Plugin:
Bom encaixe para lógica local do plugin:
- detecção de resposta ao bot
- detecção de citação do bot
- verificações de participação em thread
- exclusões de mensagens de serviço/sistema
- caches nativos da plataforma necessários para comprovar a participação do bot
- caches nativos da plataforma necessários para comprovar participação do bot
Bom encaixe para o helper compartilhado:
- `requireMention`
- resultado explícito de menção
- resultado de menção explícita
- lista de permissão de menção implícita
- bypass de comando
- decisão final de ignorar
@ -260,18 +230,23 @@ Plugins de canal empacotados que já dependem de injeção em runtime:
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
Os helpers mais antigos `resolveMentionGating*` permanecem em
`openclaw/plugin-sdk/channel-inbound` apenas como exports de compatibilidade. Código novo
deve usar `resolveInboundMentionDecision({ facts, policy })`.
Se você precisar apenas de `implicitMentionKindWhen` e
`resolveInboundMentionDecision`, importe de
`openclaw/plugin-sdk/channel-mention-gating` para evitar carregar helpers de
runtime de entrada não relacionados.
Os helpers mais antigos `resolveMentionGating*` continuam em
`openclaw/plugin-sdk/channel-inbound` apenas como exportações de compatibilidade. Código
novo deve usar `resolveInboundMentionDecision({ facts, policy })`.
## Passo a passo
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Pacote e manifesto">
Crie os arquivos padrão do Plugin. O campo `channel` em `package.json` é
o que torna este um Plugin de canal. Para a superfície completa de metadados do pacote,
veja [Setup e Configuração do Plugin](/pt-BR/plugins/sdk-setup#openclaw-channel):
Crie os arquivos padrão do plugin. O campo `channel` em `package.json` é
o que faz deste um plugin de canal. Para a surface completa de metadados do pacote,
veja [Setup e Configuração de Plugin](/pt-BR/plugins/sdk-setup#openclaw-channel):
<CodeGroup>
```json package.json
@ -285,7 +260,7 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
"channel": {
"id": "acme-chat",
"label": "Acme Chat",
"blurb": "Conecte o OpenClaw ao Acme Chat."
"blurb": "Connect OpenClaw to Acme Chat."
}
}
}
@ -297,7 +272,7 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
"kind": "channel",
"channels": ["acme-chat"],
"name": "Acme Chat",
"description": "Plugin de canal do Acme Chat",
"description": "Acme Chat channel plugin",
"configSchema": {
"type": "object",
"additionalProperties": false,
@ -320,8 +295,8 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
</Step>
<Step title="Crie o objeto do Plugin de canal">
A interface `ChannelPlugin` tem muitas superfícies de adaptador opcionais. Comece com
<Step title="Crie o objeto do plugin de canal">
A interface `ChannelPlugin` tem muitas surfaces de adaptador opcionais. Comece com
o mínimo — `id` e `setup` — e adicione adaptadores conforme necessário.
Crie `src/channel.ts`:
@ -419,14 +394,14 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
<Accordion title="O que `createChatChannelPlugin` faz por você">
Em vez de implementar manualmente interfaces de adaptador de baixo nível, você passa
opções declarativas e o builder as compõe:
opções declarativas e o builder faz a composição:
| Opção | O que ela conecta |
| --- | --- |
| `security.dm` | Resolvedor de segurança de DM com escopo a partir dos campos de configuração |
| `pairing.text` | Fluxo de emparelhamento por DM baseado em texto com troca de código |
| `threading` | Resolvedor de modo reply-to (fixo, com escopo de conta ou personalizado) |
| `outbound.attachedResults` | Funções de envio que retornam metadados do resultado (ids de mensagem) |
| `security.dm` | Resolver de segurança de DM com escopo a partir de campos de configuração |
| `pairing.text` | Fluxo de emparelhamento de DM baseado em texto com troca de código |
| `threading` | Resolver de modo de resposta (fixo, com escopo por conta ou personalizado) |
| `outbound.attachedResults` | Funções de envio que retornam metadados de resultado (IDs de mensagem) |
Você também pode passar objetos de adaptador brutos em vez das opções declarativas
se precisar de controle total.
@ -470,13 +445,13 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
});
```
Coloque descritores de CLI controlados pelo canal em `registerCliMetadata(...)` para que o OpenClaw
possa mostrá-los na ajuda raiz sem ativar o runtime completo do canal,
enquanto carregamentos completos normais ainda capturam os mesmos descritores para o registro
real de comandos. Mantenha `registerFull(...)` para trabalho somente de runtime.
Coloque descritores de CLI pertencentes ao canal em `registerCliMetadata(...)` para que o OpenClaw
possa exibi-los na ajuda raiz sem ativar o runtime completo do canal,
enquanto carregamentos completos normais ainda usem os mesmos descritores para registro real de comandos.
Mantenha `registerFull(...)` para trabalho exclusivo de runtime.
Se `registerFull(...)` registrar métodos RPC do Gateway, use um
prefixo específico do Plugin. Namespaces administrativos do core (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) permanecem reservados e sempre
prefixo específico do plugin. Namespaces administrativos do core (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) continuam reservados e sempre
resolvem para `operator.admin`.
`defineChannelPluginEntry` trata automaticamente a divisão de modo de registro. Veja
[Pontos de entrada](/pt-BR/plugins/sdk-entrypoints#definechannelpluginentry) para todas as
@ -495,10 +470,10 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
```
O OpenClaw carrega isso em vez da entrada completa quando o canal está desabilitado
ou não configurado. Isso evita puxar código pesado de runtime durante fluxos de setup.
ou não configurado. Isso evita puxar código pesado de runtime durante os fluxos de setup.
Veja [Setup e Configuração](/pt-BR/plugins/sdk-setup#setup-entry) para detalhes.
Canais empacotados do workspace que dividem exports seguras para setup em módulos
Canais de workspace empacotados que dividem exportações seguras para setup em módulos
auxiliares podem usar `defineBundledChannelSetupEntry(...)` de
`openclaw/plugin-sdk/channel-entry-contract` quando também precisarem de um
setter explícito de runtime em tempo de setup.
@ -506,9 +481,9 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
</Step>
<Step title="Trate mensagens de entrada">
Seu Plugin precisa receber mensagens da plataforma e encaminhá-las para o
OpenClaw. O padrão típico é um Webhook que verifica a solicitação e
a despacha por meio do handler de entrada do seu canal:
Seu plugin precisa receber mensagens da plataforma e encaminhá-las para o
OpenClaw. O padrão típico é um webhook que verifica a requisição e faz o
dispatch por meio do handler de entrada do seu canal:
```typescript
registerFull(api) {
@ -532,16 +507,16 @@ deve usar `resolveInboundMentionDecision({ facts, policy })`.
```
<Note>
O tratamento de mensagens de entrada é específico de cada canal. Cada Plugin de canal é responsável
pelo seu próprio pipeline de entrada. Veja Plugins de canal empacotados
(por exemplo, o pacote de Plugin do Microsoft Teams ou do Google Chat) para padrões reais.
O tratamento de mensagens de entrada é específico do canal. Cada plugin de canal é responsável
pelo seu próprio pipeline de entrada. Veja plugins de canal empacotados
(por exemplo o pacote do plugin Microsoft Teams ou Google Chat) para padrões reais.
</Note>
</Step>
<a id="step-6-test"></a>
<Step title="Teste">
Escreva testes colocados lado a lado em `src/channel.test.ts`:
Escreva testes lado a lado em `src/channel.test.ts`:
```typescript src/channel.test.ts
import { describe, it, expect } from "vitest";
@ -579,7 +554,7 @@ Escreva testes colocados lado a lado em `src/channel.test.ts`:
pnpm test -- <bundled-plugin-root>/acme-chat/
```
Para helpers de teste compartilhados, veja [Testes](/pt-BR/plugins/sdk-testing).
Para helpers de teste compartilhados, veja [Testing](/pt-BR/plugins/sdk-testing).
</Step>
</Steps>
@ -592,12 +567,12 @@ Escreva testes colocados lado a lado em `src/channel.test.ts`:
├── openclaw.plugin.json # Manifesto com schema de configuração
├── index.ts # defineChannelPluginEntry
├── setup-entry.ts # defineSetupPluginEntry
├── api.ts # Exports públicos (opcional)
├── runtime-api.ts # Exports internos de runtime (opcional)
├── api.ts # Exportações públicas (opcional)
├── runtime-api.ts # Exportações internas de runtime (opcional)
└── src/
├── channel.ts # ChannelPlugin via createChatChannelPlugin
├── channel.test.ts # Testes
├── client.ts # Cliente de API da plataforma
├── client.ts # Client da API da plataforma
└── runtime.ts # Armazenamento de runtime (se necessário)
```
@ -605,12 +580,12 @@ Escreva testes colocados lado a lado em `src/channel.test.ts`:
<CardGroup cols={2}>
<Card title="Opções de encadeamento" icon="git-branch" href="/pt-BR/plugins/sdk-entrypoints#registration-mode">
Modos de resposta fixos, com escopo de conta ou personalizados
Modos de resposta fixos, com escopo por conta ou personalizados
</Card>
<Card title="Integração com a ferramenta de mensagem" icon="puzzle" href="/pt-BR/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool e descoberta de ações
</Card>
<Card title="Resolução de alvo" icon="crosshair" href="/pt-BR/plugins/architecture#channel-target-resolution">
<Card title="Resolução de destino" icon="crosshair" href="/pt-BR/plugins/architecture#channel-target-resolution">
inferTargetChatType, looksLikeId, resolveTarget
</Card>
<Card title="Helpers de runtime" icon="settings" href="/pt-BR/plugins/sdk-runtime">
@ -619,15 +594,15 @@ Escreva testes colocados lado a lado em `src/channel.test.ts`:
</CardGroup>
<Note>
Algumas superfícies auxiliares de Plugins empacotados ainda existem para manutenção de Plugins empacotados e
compatibilidade. Elas não são o padrão recomendado para novos Plugins de canal;
prefira os subcaminhos genéricos de canal/setup/resposta/runtime da superfície comum do SDK,
a menos que você esteja mantendo diretamente essa família de Plugins empacotados.
Algumas surfaces de helpers empacotados ainda existem para manutenção e
compatibilidade de plugins empacotados. Elas não são o padrão recomendado para novos Plugins de canal;
prefira os subcaminhos genéricos de canal/setup/resposta/runtime da surface comum do SDK,
a menos que você esteja mantendo diretamente essa família de plugins empacotados.
</Note>
## Próximos passos
- [Plugins de provedor](/pt-BR/plugins/sdk-provider-plugins) — se o seu Plugin também fornece modelos
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — referência completa de imports por subcaminho
- [Testes do SDK](/pt-BR/plugins/sdk-testing) — utilitários de teste e testes de contrato
- [Provider Plugins](/pt-BR/plugins/sdk-provider-plugins) — se o seu plugin também fornecer modelos
- [Visão geral do SDK](/pt-BR/plugins/sdk-overview) — referência completa de importação de subcaminhos
- [SDK Testing](/pt-BR/plugins/sdk-testing) — utilitários de teste e testes de contrato
- [Manifesto do Plugin](/pt-BR/plugins/manifest) — schema completo do manifesto

View File

@ -1,21 +1,21 @@
---
read_when:
- Você precisa saber de qual subcaminho do SDK importar
- Você quer uma referência de todos os métodos de registro em `OpenClawPluginApi`
- Você quer uma referência para todos os métodos de registro em OpenClawPluginApi
- Você está procurando uma exportação específica do SDK
sidebarTitle: SDK Overview
summary: Mapa de importação, referência da API de registro e arquitetura do SDK
title: Visão geral do Plugin SDK
title: Visão geral do SDK de Plugin
x-i18n:
generated_at: "2026-04-17T05:36:06Z"
generated_at: "2026-04-18T05:25:18Z"
model: gpt-5.4
provider: openai
source_hash: b177fdb6830f415d998a24812bc2c7db8124d3ba77b0174c9a67ac7d747f7e5a
source_hash: 05d3d0022cca32d29c76f6cea01cdf4f88ac69ef0ef3d7fb8a60fbf9a6b9b331
source_path: plugins/sdk-overview.md
workflow: 15
---
# Visão geral do Plugin SDK
# Visão geral do SDK de Plugin
O SDK de plugin é o contrato tipado entre plugins e o núcleo. Esta página é a
referência para **o que importar** e **o que você pode registrar**.
@ -37,269 +37,283 @@ import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
```
Cada subcaminho é um módulo pequeno e autocontido. Isso mantém a inicialização rápida e
evita problemas de dependência circular. Para auxiliares específicos de
entrada/construção de canal, prefira `openclaw/plugin-sdk/channel-core`; mantenha `openclaw/plugin-sdk/core` para
a superfície guarda-chuva mais ampla e auxiliares compartilhados, como
evita problemas de dependência circular. Para auxiliares de entrada/build específicos de canal,
prefira `openclaw/plugin-sdk/channel-core`; mantenha `openclaw/plugin-sdk/core` para
a superfície guarda-chuva mais ampla e helpers compartilhados, como
`buildChannelConfigSchema`.
Não adicione nem dependa de seams de conveniência com nome de provedor, como
Não adicione nem dependa de interfaces de conveniência nomeadas por provedor, como
`openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, ou
seams auxiliares com marca de canal. Plugins empacotados devem compor
subcaminhos genéricos do SDK dentro de seus próprios barrels `api.ts` ou `runtime-api.ts`, e o núcleo
deve usar esses barrels locais do plugin ou adicionar um contrato genérico e restrito do SDK
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, nem de
interfaces auxiliares com marca de canal. Plugins empacotados devem compor subcaminhos genéricos
do SDK dentro de seus próprios barrels `api.ts` ou `runtime-api.ts`, e o núcleo
deve usar esses barrels locais do plugin ou adicionar um contrato genérico e estreito do SDK
quando a necessidade for realmente entre canais.
O mapa de exportação gerado ainda contém um pequeno conjunto de
seams auxiliares de plugins empacotados, como `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
O mapa de exportação gerado ainda contém um pequeno conjunto de interfaces auxiliares de plugin empacotado,
como `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
`plugin-sdk/zalo`, `plugin-sdk/zalo-setup` e `plugin-sdk/matrix*`. Esses
subcaminhos existem apenas para manutenção e compatibilidade de plugins empacotados; eles são
intencionalmente omitidos da tabela comum abaixo e não são o caminho de
importação recomendado para novos plugins de terceiros.
omitidos intencionalmente da tabela comum abaixo e não são o caminho de importação
recomendado para novos plugins de terceiros.
## Referência de subcaminhos
Os subcaminhos usados com mais frequência, agrupados por finalidade. A lista completa gerada de
mais de 200 subcaminhos está em `scripts/lib/plugin-sdk-entrypoints.json`.
mais de 200 subcaminhos fica em `scripts/lib/plugin-sdk-entrypoints.json`.
Subcaminhos auxiliares reservados para plugins empacotados ainda aparecem nessa lista gerada.
Trate-os como superfícies de detalhe de implementação/compatibilidade, a menos que uma página da documentação
Subcaminhos reservados de auxílio para plugins empacotados ainda aparecem nessa lista gerada.
Trate-os como detalhes de implementação/superfícies de compatibilidade, a menos que uma página da documentação
promova explicitamente um deles como público.
### Entrada do plugin
### Entrada de plugin
| Subcaminho | Principais exportações |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/plugin-entry` | `definePluginEntry` |
| Subcaminho | Exportações principais |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/plugin-entry` | `definePluginEntry` |
| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema` |
| `plugin-sdk/config-schema` | `OpenClawSchema` |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/config-schema` | `OpenClawSchema` |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
<AccordionGroup>
<Accordion title="Subcaminhos de canal">
| Subcaminho | Principais exportações |
| Subcaminho | Exportações principais |
| --- | --- |
| `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/config-schema` | Exportação do esquema Zod raiz de `openclaw.json` (`OpenClawSchema`) |
| `plugin-sdk/config-schema` | Exportação do schema Zod raiz de `openclaw.json` (`OpenClawSchema`) |
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, além de `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/setup` | Auxiliares compartilhados do assistente de configuração, prompts de allowlist, construtores de status de configuração |
| `plugin-sdk/setup` | Helpers compartilhados de assistente de configuração, prompts de allowlist, construtores de status de configuração |
| `plugin-sdk/setup-runtime` | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Auxiliares de gate de ação/configuração com múltiplas contas, auxiliares de fallback de conta padrão |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, auxiliares de normalização de ID de conta |
| `plugin-sdk/account-resolution` | Auxiliares de busca de conta + fallback padrão |
| `plugin-sdk/account-helpers` | Auxiliares restritos para lista de contas/ação de conta |
| `plugin-sdk/account-core` | Helpers de configuração/gate de ação para múltiplas contas, helpers de fallback para conta padrão |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, helpers de normalização de ID de conta |
| `plugin-sdk/account-resolution` | Helpers de busca de conta + fallback padrão |
| `plugin-sdk/account-helpers` | Helpers estreitos de lista de contas/ações de conta |
| `plugin-sdk/channel-pairing` | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | `createChannelReplyPipeline` |
| `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter` |
| `plugin-sdk/channel-config-schema` | Tipos de esquema de configuração de canal |
| `plugin-sdk/telegram-command-config` | Auxiliares de normalização/validação de comandos personalizados do Telegram com fallback de contrato empacotado |
| `plugin-sdk/channel-config-schema` | Tipos de schema de configuração de canal |
| `plugin-sdk/telegram-command-config` | Helpers de normalização/validação de comandos personalizados do Telegram com fallback de contrato empacotado |
| `plugin-sdk/command-gating` | Helpers estreitos de gate de autorização de comandos |
| `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | `createAccountStatusSink` |
| `plugin-sdk/inbound-envelope` | Auxiliares compartilhados de rota de entrada + construtor de envelope |
| `plugin-sdk/inbound-reply-dispatch` | Auxiliares compartilhados de registro e despacho de entrada |
| `plugin-sdk/messaging-targets` | Auxiliares de análise/correspondência de alvos |
| `plugin-sdk/outbound-media` | Auxiliares compartilhados de carregamento de mídia de saída |
| `plugin-sdk/outbound-runtime` | Auxiliares de identidade de saída/delegação de envio |
| `plugin-sdk/thread-bindings-runtime` | Ciclo de vida de vínculo de thread e auxiliares de adaptador |
| `plugin-sdk/agent-media-payload` | Construtor legado de payload de mídia do agente |
| `plugin-sdk/conversation-runtime` | Auxiliares de vínculo de conversa/thread, pareamento e vínculo configurado |
| `plugin-sdk/runtime-config-snapshot` | Auxiliar de snapshot de configuração em runtime |
| `plugin-sdk/runtime-group-policy` | Auxiliares de resolução de política de grupo em runtime |
| `plugin-sdk/channel-status` | Auxiliares compartilhados de snapshot/resumo de status do canal |
| `plugin-sdk/channel-config-primitives` | Primitivas restritas de esquema de configuração de canal |
| `plugin-sdk/channel-config-writes` | Auxiliares de autorização de gravação de configuração de canal |
| `plugin-sdk/channel-plugin-common` | Exportações de prelúdio compartilhadas de plugin de canal |
| `plugin-sdk/allowlist-config-edit` | Auxiliares de leitura/edição de configuração de allowlist |
| `plugin-sdk/group-access` | Auxiliares compartilhados de decisão de acesso a grupo |
| `plugin-sdk/direct-dm` | Auxiliares compartilhados de autenticação/proteção de DM direta |
| `plugin-sdk/interactive-runtime` | Auxiliares de normalização/redução de payload de resposta interativa |
| `plugin-sdk/channel-inbound` | Debounce de entrada, correspondência de menção, auxiliares de política de menção e auxiliares de envelope |
| `plugin-sdk/inbound-envelope` | Helpers compartilhados de rota de entrada + construtor de envelope |
| `plugin-sdk/inbound-reply-dispatch` | Helpers compartilhados de registrar e despachar entrada |
| `plugin-sdk/messaging-targets` | Helpers de parsing/correspondência de destino |
| `plugin-sdk/outbound-media` | Helpers compartilhados de carregamento de mídia de saída |
| `plugin-sdk/outbound-runtime` | Helpers de identidade de saída/delegação de envio |
| `plugin-sdk/poll-runtime` | Helpers estreitos de normalização de enquete |
| `plugin-sdk/thread-bindings-runtime` | Helpers de ciclo de vida e adaptador de vinculações de thread |
| `plugin-sdk/agent-media-payload` | Construtor legado de payload de mídia de agente |
| `plugin-sdk/conversation-runtime` | Helpers de vinculação de conversa/thread, pareamento e vinculação configurada |
| `plugin-sdk/runtime-config-snapshot` | Helper de snapshot de configuração de runtime |
| `plugin-sdk/runtime-group-policy` | Helpers de resolução de política de grupo em runtime |
| `plugin-sdk/channel-status` | Helpers compartilhados de snapshot/resumo de status de canal |
| `plugin-sdk/channel-config-primitives` | Primitivos estreitos de schema de configuração de canal |
| `plugin-sdk/channel-config-writes` | Helpers de autorização de gravação de configuração de canal |
| `plugin-sdk/channel-plugin-common` | Exportações compartilhadas de prelúdio de plugin de canal |
| `plugin-sdk/allowlist-config-edit` | Helpers de leitura/edição de configuração de allowlist |
| `plugin-sdk/group-access` | Helpers compartilhados de decisão de acesso a grupo |
| `plugin-sdk/direct-dm` | Helpers compartilhados de autenticação/proteção para DM direta |
| `plugin-sdk/interactive-runtime` | Helpers de normalização/redução de payload de resposta interativa |
| `plugin-sdk/channel-inbound` | Barrel de compatibilidade para debounce de entrada, correspondência de menção, helpers de política de menção e helpers de envelope |
| `plugin-sdk/channel-mention-gating` | Helpers estreitos de política de menção sem a superfície mais ampla de runtime de entrada |
| `plugin-sdk/channel-location` | Helpers de contexto e formatação de localização de canal |
| `plugin-sdk/channel-logging` | Helpers de logging de canal para descartes de entrada e falhas de digitação/ack |
| `plugin-sdk/channel-send-result` | Tipos de resultado de resposta |
| `plugin-sdk/channel-actions` | `createMessageToolButtonsSchema`, `createMessageToolCardSchema` |
| `plugin-sdk/channel-targets` | Auxiliares de análise/correspondência de alvos |
| `plugin-sdk/channel-targets` | Helpers de parsing/correspondência de destino |
| `plugin-sdk/channel-contract` | Tipos de contrato de canal |
| `plugin-sdk/channel-feedback` | Ligação de feedback/reação |
| `plugin-sdk/channel-secret-runtime` | Auxiliares restritos de contrato de segredo, como `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment` e tipos de alvo de segredo |
| `plugin-sdk/channel-feedback` | Wiring de feedback/reação |
| `plugin-sdk/channel-secret-runtime` | Helpers estreitos de contrato de segredo, como `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment` e tipos de alvo de segredo |
</Accordion>
<Accordion title="Subcaminhos de provedor">
| Subcaminho | Principais exportações |
| Subcaminho | Exportações principais |
| --- | --- |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/provider-setup` | Auxiliares curados de configuração de provedor local/self-hosted |
| `plugin-sdk/self-hosted-provider-setup` | Auxiliares focados de configuração de provedor self-hosted compatível com OpenAI |
| `plugin-sdk/cli-backend` | Padrões de backend da CLI + constantes de watchdog |
| `plugin-sdk/provider-auth-runtime` | Auxiliares de runtime para resolução de chave de API para plugins de provedor |
| `plugin-sdk/provider-auth-api-key` | Auxiliares de onboarding/gravação de perfil de chave de API, como `upsertApiKeyProfile` |
| `plugin-sdk/provider-setup` | Helpers curados de configuração de provedor local/self-hosted |
| `plugin-sdk/self-hosted-provider-setup` | Helpers focados de configuração de provedor self-hosted compatível com OpenAI |
| `plugin-sdk/cli-backend` | Padrões de backend de CLI + constantes de watchdog |
| `plugin-sdk/provider-auth-runtime` | Helpers de runtime para resolução de chave de API para plugins de provedor |
| `plugin-sdk/provider-auth-api-key` | Helpers de onboarding/gravação de perfil de chave de API, como `upsertApiKeyProfile` |
| `plugin-sdk/provider-auth-result` | Construtor padrão de resultado de autenticação OAuth |
| `plugin-sdk/provider-auth-login` | Auxiliares compartilhados de login interativo para plugins de provedor |
| `plugin-sdk/provider-env-vars` | Auxiliares de busca de variáveis de ambiente de autenticação do provedor |
| `plugin-sdk/provider-auth-login` | Helpers compartilhados de login interativo para plugins de provedor |
| `plugin-sdk/provider-env-vars` | Helpers de busca de variáveis de ambiente de autenticação de provedor |
| `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile`, `upsertApiKeyProfile`, `writeOAuthCredentials` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, construtores compartilhados de política de replay, auxiliares de endpoint do provedor e auxiliares de normalização de ID de modelo, como `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, construtores compartilhados de política de replay, helpers de endpoint de provedor e helpers de normalização de ID de modelo, como `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-http` | Auxiliares genéricos de HTTP/capacidade de endpoint do provedor |
| `plugin-sdk/provider-web-fetch-contract` | Auxiliares restritos de contrato de configuração/seleção de web-fetch, como `enablePluginInConfig` e `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Auxiliares de registro/cache de provedor web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Auxiliares restritos de configuração/credencial de web-search para provedores que não precisam de ligação de ativação de plugin |
| `plugin-sdk/provider-web-search-contract` | Auxiliares restritos de contrato de configuração/credencial de web-search, como `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` e setters/getters de credenciais com escopo |
| `plugin-sdk/provider-web-search` | Auxiliares de runtime/registro/cache de provedor web-search |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, limpeza + diagnóstico de esquema Gemini e auxiliares de compatibilidade xAI, como `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-http` | Helpers genéricos de HTTP/capacidade de endpoint de provedor |
| `plugin-sdk/provider-web-fetch-contract` | Helpers estreitos de contrato para configuração/seleção de web-fetch, como `enablePluginInConfig` e `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Helpers de registro/cache de provedor web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Helpers estreitos de configuração/credencial de web-search para provedores que não precisam de wiring de habilitação de plugin |
| `plugin-sdk/provider-web-search-contract` | Helpers estreitos de contrato de configuração/credencial de web-search, como `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` e setters/getters de credenciais com escopo |
| `plugin-sdk/provider-web-search` | Helpers de registro/cache/runtime de provedor web-search |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, limpeza + diagnósticos de schema Gemini e helpers de compatibilidade xAI, como `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` e similares |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipos de wrapper de stream e auxiliares compartilhados de wrapper para Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-onboard` | Auxiliares de patch de configuração de onboarding |
| `plugin-sdk/global-singleton` | Auxiliares de singleton/mapa/cache local ao processo |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipos de wrapper de stream e helpers compartilhados de wrapper Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-onboard` | Helpers de patch de configuração de onboarding |
| `plugin-sdk/global-singleton` | Helpers de singleton/mapa/cache locais ao processo |
</Accordion>
<Accordion title="Subcaminhos de autenticação e segurança">
| Subcaminho | Principais exportações |
| Subcaminho | Exportações principais |
| --- | --- |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, auxiliares de registro de comandos, auxiliares de autorização do remetente |
| `plugin-sdk/command-status` | Construtores de mensagem de comando/ajuda, como `buildCommandsMessagePaginated` e `buildHelpMessage` |
| `plugin-sdk/approval-auth-runtime` | Resolução de aprovador e auxiliares de autenticação de ação no mesmo chat |
| `plugin-sdk/approval-client-runtime` | Auxiliares de perfil/filtro de aprovação para execução nativa |
| `plugin-sdk/approval-delivery-runtime` | Adaptadores nativos de capacidade/entrega de aprovação |
| `plugin-sdk/approval-gateway-runtime` | Auxiliar compartilhado de resolução de Gateway de aprovação |
| `plugin-sdk/approval-handler-adapter-runtime` | Auxiliares leves de carregamento de adaptador de aprovação nativa para entrypoints de canal de hot path |
| `plugin-sdk/approval-handler-runtime` | Auxiliares mais amplos de runtime do manipulador de aprovação; prefira os seams mais restritos de adaptador/Gateway quando forem suficientes |
| `plugin-sdk/approval-native-runtime` | Auxiliares nativos de alvo de aprovação + vínculo de conta |
| `plugin-sdk/approval-reply-runtime` | Auxiliares de payload de resposta de aprovação de execução/plugin |
| `plugin-sdk/command-auth-native` | Auxiliares nativos de autenticação de comando + alvo de sessão nativa |
| `plugin-sdk/command-detection` | Auxiliares compartilhados de detecção de comandos |
| `plugin-sdk/command-surface` | Auxiliares de normalização de corpo de comando e superfície de comando |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, helpers de registro de comando, helpers de autorização de remetente |
| `plugin-sdk/command-status` | Construtores de mensagens de comando/ajuda, como `buildCommandsMessagePaginated` e `buildHelpMessage` |
| `plugin-sdk/approval-auth-runtime` | Helpers de resolução de aprovador e autenticação de ação no mesmo chat |
| `plugin-sdk/approval-client-runtime` | Helpers de perfil/filtro de aprovação nativa de exec |
| `plugin-sdk/approval-delivery-runtime` | Adaptadores de entrega/capacidade de aprovação nativa |
| `plugin-sdk/approval-gateway-runtime` | Helper compartilhado de resolução de Gateway de aprovação |
| `plugin-sdk/approval-handler-adapter-runtime` | Helpers leves de carregamento de adaptador de aprovação nativa para entrypoints quentes de canal |
| `plugin-sdk/approval-handler-runtime` | Helpers mais amplos de runtime de manipulador de aprovação; prefira as interfaces mais estreitas de adapter/gateway quando forem suficientes |
| `plugin-sdk/approval-native-runtime` | Helpers de alvo de aprovação nativa + vinculação de conta |
| `plugin-sdk/approval-reply-runtime` | Helpers de payload de resposta para aprovação de exec/plugin |
| `plugin-sdk/command-auth-native` | Helpers de autenticação nativa de comando + helpers nativos de alvo de sessão |
| `plugin-sdk/command-detection` | Helpers compartilhados de detecção de comando |
| `plugin-sdk/command-surface` | Helpers de normalização do corpo de comando e da superfície de comando |
| `plugin-sdk/allow-from` | `formatAllowFromLowercase` |
| `plugin-sdk/channel-secret-runtime` | Auxiliares restritos de coleta de contrato de segredo para superfícies de segredo de canal/plugin |
| `plugin-sdk/secret-ref-runtime` | Auxiliares restritos de tipagem de `coerceSecretRef` e SecretRef para parsing de contrato/configuração de segredo |
| `plugin-sdk/security-runtime` | Auxiliares compartilhados de confiança, controle de DM, conteúdo externo e coleta de segredos |
| `plugin-sdk/ssrf-policy` | Auxiliares de allowlist de host e política de SSRF para rede privada |
| `plugin-sdk/ssrf-runtime` | Auxiliares de dispatcher fixado, fetch protegido contra SSRF e política de SSRF |
| `plugin-sdk/secret-input` | Auxiliares de parsing de entrada de segredo |
| `plugin-sdk/webhook-ingress` | Auxiliares de requisição/alvo de Webhook |
| `plugin-sdk/webhook-request-guards` | Auxiliares de tamanho do corpo/timeout da requisição |
| `plugin-sdk/channel-secret-runtime` | Helpers estreitos de coleta de contrato de segredo para superfícies de segredo de canal/plugin |
| `plugin-sdk/secret-ref-runtime` | Helpers estreitos de tipagem `coerceSecretRef` e SecretRef para parsing de contrato de segredo/configuração |
| `plugin-sdk/security-runtime` | Helpers compartilhados de confiança, gate de DM, conteúdo externo e coleta de segredo |
| `plugin-sdk/ssrf-policy` | Helpers de política SSRF para allowlist de host e rede privada |
| `plugin-sdk/ssrf-dispatcher` | Helpers estreitos de dispatcher fixado sem a ampla superfície de runtime de infraestrutura |
| `plugin-sdk/ssrf-runtime` | Helpers de dispatcher fixado, fetch protegido por SSRF e política SSRF |
| `plugin-sdk/secret-input` | Helpers de parsing de entrada de segredo |
| `plugin-sdk/webhook-ingress` | Helpers de requisição/alvo de Webhook |
| `plugin-sdk/webhook-request-guards` | Helpers de tamanho do corpo da requisição/timeout |
</Accordion>
<Accordion title="Subcaminhos de runtime e armazenamento">
| Subcaminho | Principais exportações |
| Subcaminho | Exportações principais |
| --- | --- |
| `plugin-sdk/runtime` | Auxiliares amplos de runtime/logging/backup/instalação de plugin |
| `plugin-sdk/runtime-env` | Auxiliares restritos de ambiente de runtime, logger, timeout, retry e backoff |
| `plugin-sdk/channel-runtime-context` | Auxiliares genéricos de registro e busca de contexto de runtime de canal |
| `plugin-sdk/runtime` | Helpers amplos de runtime/logging/backup/instalação de plugin |
| `plugin-sdk/runtime-env` | Helpers estreitos de env de runtime, logger, timeout, retry e backoff |
| `plugin-sdk/channel-runtime-context` | Helpers genéricos de registro e consulta de contexto de runtime de canal |
| `plugin-sdk/runtime-store` | `createPluginRuntimeStore` |
| `plugin-sdk/plugin-runtime` | Auxiliares compartilhados de comando/hook/http/interativo de plugin |
| `plugin-sdk/hook-runtime` | Auxiliares compartilhados de pipeline de Webhook/hook interno |
| `plugin-sdk/lazy-runtime` | Auxiliares de importação/vínculo lazy de runtime, como `createLazyRuntimeModule`, `createLazyRuntimeMethod` e `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Auxiliares de execução de processo |
| `plugin-sdk/cli-runtime` | Auxiliares de formatação, espera e versão da CLI |
| `plugin-sdk/gateway-runtime` | Auxiliares de cliente Gateway e patch de status de canal |
| `plugin-sdk/config-runtime` | Auxiliares de carregamento/gravação de configuração |
| `plugin-sdk/plugin-runtime` | Helpers compartilhados de comando/hook/http/interativo de plugin |
| `plugin-sdk/hook-runtime` | Helpers compartilhados de pipeline de Webhook/hook interno |
| `plugin-sdk/lazy-runtime` | Helpers de importação/vinculação lazy de runtime, como `createLazyRuntimeModule`, `createLazyRuntimeMethod` e `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Helpers de execução de processo |
| `plugin-sdk/cli-runtime` | Helpers de formatação, espera e versão de CLI |
| `plugin-sdk/gateway-runtime` | Helpers de cliente Gateway e patch de status de canal |
| `plugin-sdk/config-runtime` | Helpers de carregamento/gravação de configuração |
| `plugin-sdk/telegram-command-config` | Normalização de nome/descrição de comando do Telegram e verificações de duplicidade/conflito, mesmo quando a superfície de contrato empacotada do Telegram não está disponível |
| `plugin-sdk/approval-runtime` | Auxiliares de aprovação de execução/plugin, construtores de capacidade de aprovação, auxiliares de autenticação/perfil, auxiliares nativos de roteamento/runtime |
| `plugin-sdk/reply-runtime` | Auxiliares compartilhados de runtime de entrada/resposta, fragmentação, despacho, Heartbeat, planejador de resposta |
| `plugin-sdk/reply-dispatch-runtime` | Auxiliares restritos de despacho/finalização de resposta |
| `plugin-sdk/reply-history` | Auxiliares compartilhados de histórico de respostas de janela curta, como `buildHistoryContext`, `recordPendingHistoryEntry` e `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/text-autolink-runtime` | Detecção de autolink de referência de arquivo sem o barrel amplo `text-runtime` |
| `plugin-sdk/approval-runtime` | Helpers de aprovação de exec/plugin, construtores de capacidade de aprovação, helpers de autenticação/perfil, helpers nativos de roteamento/runtime |
| `plugin-sdk/reply-runtime` | Helpers compartilhados de runtime de entrada/resposta, chunking, dispatch, heartbeat, planejador de resposta |
| `plugin-sdk/reply-dispatch-runtime` | Helpers estreitos de dispatch/finalização de resposta |
| `plugin-sdk/reply-history` | Helpers compartilhados de histórico de resposta de janela curta, como `buildHistoryContext`, `recordPendingHistoryEntry` e `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Auxiliares restritos de fragmentação de texto/markdown |
| `plugin-sdk/session-store-runtime` | Auxiliares de caminho da store de sessão + updated-at |
| `plugin-sdk/state-paths` | Auxiliares de caminho de diretório de estado/OAuth |
| `plugin-sdk/routing` | Auxiliares de roteamento/chave de sessão/vínculo de conta, como `resolveAgentRoute`, `buildAgentSessionKey` e `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Auxiliares compartilhados de resumo de status de canal/conta, padrões de estado de runtime e auxiliares de metadados de problema |
| `plugin-sdk/target-resolver-runtime` | Auxiliares compartilhados de resolvedor de alvo |
| `plugin-sdk/string-normalization-runtime` | Auxiliares de normalização de slug/string |
| `plugin-sdk/request-url` | Extrair URLs em string de entradas do tipo fetch/request |
| `plugin-sdk/run-command` | Executor de comandos com tempo controlado e resultados normalizados de stdout/stderr |
| `plugin-sdk/reply-chunking` | Helpers estreitos de chunking de texto/markdown |
| `plugin-sdk/session-store-runtime` | Helpers de caminho do armazenamento de sessão + updated-at |
| `plugin-sdk/state-paths` | Helpers de caminho de diretório de estado/OAuth |
| `plugin-sdk/routing` | Helpers de rota/chave de sessão/vinculação de conta, como `resolveAgentRoute`, `buildAgentSessionKey` e `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Helpers compartilhados de resumo de status de canal/conta, padrões de estado de runtime e helpers de metadados de problema |
| `plugin-sdk/target-resolver-runtime` | Helpers compartilhados de resolvedor de alvo |
| `plugin-sdk/string-normalization-runtime` | Helpers de normalização de slug/string |
| `plugin-sdk/request-url` | Extrair URLs em string de entradas semelhantes a fetch/request |
| `plugin-sdk/run-command` | Executor de comando temporizado com resultados normalizados de stdout/stderr |
| `plugin-sdk/param-readers` | Leitores comuns de parâmetros de ferramenta/CLI |
| `plugin-sdk/tool-payload` | Extrair payloads normalizados de objetos de resultado de ferramenta |
| `plugin-sdk/tool-send` | Extrair campos canônicos de alvo de envio de argumentos de ferramenta |
| `plugin-sdk/temp-path` | Auxiliares compartilhados de caminho temporário para download |
| `plugin-sdk/logging-core` | Auxiliares de logger de subsistema e redação |
| `plugin-sdk/markdown-table-runtime` | Auxiliares de modo de tabela em Markdown |
| `plugin-sdk/json-store` | Pequenos auxiliares de leitura/gravação de estado JSON |
| `plugin-sdk/file-lock` | Auxiliares de file lock reentrante |
| `plugin-sdk/persistent-dedupe` | Auxiliares de cache de deduplicação com persistência em disco |
| `plugin-sdk/acp-runtime` | Auxiliares de runtime/sessão do ACP e despacho de resposta |
| `plugin-sdk/agent-config-primitives` | Primitivas restritas de esquema de configuração de runtime de agente |
| `plugin-sdk/tool-send` | Extrair campos canônicos de destino de envio de argumentos de ferramenta |
| `plugin-sdk/temp-path` | Helpers compartilhados de caminho temporário de download |
| `plugin-sdk/logging-core` | Helpers de logger de subsistema e redação |
| `plugin-sdk/markdown-table-runtime` | Helpers de modo de tabela Markdown |
| `plugin-sdk/json-store` | Pequenos helpers de leitura/gravação de estado JSON |
| `plugin-sdk/file-lock` | Helpers de file-lock reentrante |
| `plugin-sdk/persistent-dedupe` | Helpers de cache de deduplicação em disco |
| `plugin-sdk/acp-runtime` | Helpers de runtime/sessão ACP e dispatch de resposta |
| `plugin-sdk/acp-binding-resolve-runtime` | Resolução somente leitura de vinculação ACP sem imports de inicialização de ciclo de vida |
| `plugin-sdk/agent-config-primitives` | Primitivos estreitos de schema de configuração de runtime de agente |
| `plugin-sdk/boolean-param` | Leitor flexível de parâmetro booleano |
| `plugin-sdk/dangerous-name-runtime` | Auxiliares de resolução de correspondência de nomes perigosos |
| `plugin-sdk/device-bootstrap` | Auxiliares de bootstrap de dispositivo e token de pareamento |
| `plugin-sdk/extension-shared` | Primitivas auxiliares compartilhadas de canal passivo, status e proxy ambiente |
| `plugin-sdk/models-provider-runtime` | Auxiliares de resposta de provedor/comando `/models` |
| `plugin-sdk/skill-commands-runtime` | Auxiliares de listagem de comandos de Skills |
| `plugin-sdk/native-command-registry` | Auxiliares de registro/construção/serialização de comandos nativos |
| `plugin-sdk/agent-harness` | Superfície experimental de plugin confiável para harnesses de agente de baixo nível: tipos de harness, auxiliares de condução/aborto de execução ativa, auxiliares de ponte de ferramenta do OpenClaw e utilitários de resultado de tentativa |
| `plugin-sdk/provider-zai-endpoint` | Auxiliares de detecção de endpoint do Z.A.I |
| `plugin-sdk/infra-runtime` | Auxiliares de evento do sistema/Heartbeat |
| `plugin-sdk/collection-runtime` | Pequenos auxiliares de cache limitado |
| `plugin-sdk/diagnostic-runtime` | Auxiliares de flag e evento de diagnóstico |
| `plugin-sdk/error-runtime` | Grafo de erros, formatação, auxiliares compartilhados de classificação de erros, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Auxiliares de fetch encapsulado, proxy e busca fixada |
| `plugin-sdk/host-runtime` | Auxiliares de normalização de hostname e host SCP |
| `plugin-sdk/retry-runtime` | Auxiliares de configuração de retry e executor de retry |
| `plugin-sdk/agent-runtime` | Auxiliares de diretório/identidade/workspace de agente |
| `plugin-sdk/directory-runtime` | Consulta/deduplicação de diretório com base em configuração |
| `plugin-sdk/dangerous-name-runtime` | Helpers de resolução de correspondência de nome perigoso |
| `plugin-sdk/device-bootstrap` | Helpers de bootstrap de dispositivo e token de pareamento |
| `plugin-sdk/extension-shared` | Primitivos auxiliares compartilhados para canal passivo, status e proxy ambiente |
| `plugin-sdk/models-provider-runtime` | Helpers de resposta de comando `/models`/provedor |
| `plugin-sdk/skill-commands-runtime` | Helpers de listagem de comandos de Skills |
| `plugin-sdk/native-command-registry` | Helpers nativos de registro/build/serialização de comando |
| `plugin-sdk/agent-harness` | Superfície experimental de plugin confiável para harnesses de agente de baixo nível: tipos de harness, helpers de condução/aborto de execução ativa, helpers de ponte de ferramenta OpenClaw e utilitários de resultado de tentativa |
| `plugin-sdk/provider-zai-endpoint` | Helpers de detecção de endpoint Z.A.I |
| `plugin-sdk/infra-runtime` | Helpers de evento do sistema/Heartbeat |
| `plugin-sdk/collection-runtime` | Pequenos helpers de cache limitado |
| `plugin-sdk/diagnostic-runtime` | Helpers de flag e evento de diagnóstico |
| `plugin-sdk/error-runtime` | Helpers de grafo de erro, formatação, classificação compartilhada de erro, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Helpers de fetch empacotado, proxy e lookup fixado |
| `plugin-sdk/runtime-fetch` | Fetch de runtime com reconhecimento de dispatcher sem imports de proxy/fetch protegido |
| `plugin-sdk/response-limit-runtime` | Leitor limitado de corpo de resposta sem a ampla superfície de runtime de mídia |
| `plugin-sdk/session-binding-runtime` | Estado atual de vinculação de conversa sem roteamento de vinculação configurada ou armazenamentos de pareamento |
| `plugin-sdk/session-store-runtime` | Helpers de leitura do armazenamento de sessão sem imports amplos de gravação/manutenção de configuração |
| `plugin-sdk/context-visibility-runtime` | Resolução de visibilidade de contexto e filtragem de contexto suplementar sem imports amplos de configuração/segurança |
| `plugin-sdk/string-coerce-runtime` | Helpers estreitos de coerção e normalização de registro/string primitivos sem imports de markdown/logging |
| `plugin-sdk/host-runtime` | Helpers de normalização de hostname e host SCP |
| `plugin-sdk/retry-runtime` | Helpers de configuração e executor de retry |
| `plugin-sdk/agent-runtime` | Helpers de diretório/identidade/workspace de agente |
| `plugin-sdk/directory-runtime` | Consulta/deduplicação de diretório baseada em configuração |
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |
</Accordion>
<Accordion title="Subcaminhos de capacidade e testes">
| Subcaminho | Principais exportações |
| Subcaminho | Exportações principais |
| --- | --- |
| `plugin-sdk/media-runtime` | Auxiliares compartilhados de busca/transformação/armazenamento de mídia, além de construtores de payload de mídia |
| `plugin-sdk/media-generation-runtime` | Auxiliares compartilhados de failover de geração de mídia, seleção de candidatos e mensagens para modelo ausente |
| `plugin-sdk/media-runtime` | Helpers compartilhados de fetch/transform/store de mídia, além de construtores de payload de mídia |
| `plugin-sdk/media-generation-runtime` | Helpers compartilhados de failover de geração de mídia, seleção de candidatos e mensagens de modelo ausente |
| `plugin-sdk/media-understanding` | Tipos de provedor de entendimento de mídia, além de exportações auxiliares voltadas ao provedor para imagem/áudio |
| `plugin-sdk/text-runtime` | Auxiliares compartilhados de texto/markdown/logging, como remoção de texto visível ao assistente, auxiliares de renderização/fragmentação/tabela em markdown, auxiliares de redação, auxiliares de tag de diretiva e utilitários de texto seguro |
| `plugin-sdk/text-chunking` | Auxiliar de fragmentação de texto de saída |
| `plugin-sdk/speech` | Tipos de provedor de fala, além de auxiliares voltados ao provedor para diretiva, registro e validação |
| `plugin-sdk/speech-core` | Tipos compartilhados de provedor de fala, auxiliares de registro, diretiva e normalização |
| `plugin-sdk/realtime-transcription` | Tipos de provedor de transcrição em tempo real e auxiliares de registro |
| `plugin-sdk/realtime-voice` | Tipos de provedor de voz em tempo real e auxiliares de registro |
| `plugin-sdk/text-runtime` | Helpers compartilhados de texto/markdown/logging, como remoção de texto visível ao assistente, helpers de render/chunking/tabela Markdown, helpers de redação, helpers de tag de diretiva e utilitários de texto seguro |
| `plugin-sdk/text-chunking` | Helper de chunking de texto de saída |
| `plugin-sdk/speech` | Tipos de provedor de fala, além de helpers voltados ao provedor para diretiva, registro e validação |
| `plugin-sdk/speech-core` | Tipos compartilhados de provedor de fala, registro, diretiva e helpers de normalização |
| `plugin-sdk/realtime-transcription` | Tipos de provedor de transcrição em tempo real e helpers de registro |
| `plugin-sdk/realtime-voice` | Tipos de provedor de voz em tempo real e helpers de registro |
| `plugin-sdk/image-generation` | Tipos de provedor de geração de imagem |
| `plugin-sdk/image-generation-core` | Tipos compartilhados de geração de imagem, auxiliares de failover, autenticação e registro |
| `plugin-sdk/image-generation-core` | Tipos compartilhados de geração de imagem, helpers de failover, autenticação e registro |
| `plugin-sdk/music-generation` | Tipos de provedor/requisição/resultado de geração de música |
| `plugin-sdk/music-generation-core` | Tipos compartilhados de geração de música, auxiliares de failover, busca de provedor e parsing de referência de modelo |
| `plugin-sdk/music-generation-core` | Tipos compartilhados de geração de música, helpers de failover, busca de provedor e parsing de model-ref |
| `plugin-sdk/video-generation` | Tipos de provedor/requisição/resultado de geração de vídeo |
| `plugin-sdk/video-generation-core` | Tipos compartilhados de geração de vídeo, auxiliares de failover, busca de provedor e parsing de referência de modelo |
| `plugin-sdk/webhook-targets` | Registro de alvos de Webhook e auxiliares de instalação de rota |
| `plugin-sdk/webhook-path` | Auxiliares de normalização de caminho de Webhook |
| `plugin-sdk/web-media` | Auxiliares compartilhados de carregamento de mídia remota/local |
| `plugin-sdk/zod` | `zod` reexportado para consumidores do Plugin SDK |
| `plugin-sdk/video-generation-core` | Tipos compartilhados de geração de vídeo, helpers de failover, busca de provedor e parsing de model-ref |
| `plugin-sdk/webhook-targets` | Registro de alvo de Webhook e helpers de instalação de rota |
| `plugin-sdk/webhook-path` | Helpers de normalização de caminho de Webhook |
| `plugin-sdk/web-media` | Helpers compartilhados de carregamento de mídia remota/local |
| `plugin-sdk/zod` | `zod` reexportado para consumidores do SDK de plugin |
| `plugin-sdk/testing` | `installCommonResolveTargetErrorCases`, `shouldAckReaction` |
</Accordion>
<Accordion title="Subcaminhos de memória">
| Subcaminho | Principais exportações |
| Subcaminho | Exportações principais |
| --- | --- |
| `plugin-sdk/memory-core` | Superfície auxiliar empacotada de memory-core para auxiliares de manager/configuração/arquivo/CLI |
| `plugin-sdk/memory-core` | Superfície auxiliar empacotada `memory-core` para helpers de manager/configuração/arquivo/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Fachada de runtime de índice/busca de memória |
| `plugin-sdk/memory-core-host-engine-foundation` | Exportações do engine foundation do host de memória |
| `plugin-sdk/memory-core-host-engine-embeddings` | Contratos de embedding do host de memória, acesso ao registro, provedor local e auxiliares genéricos de lote/remoto |
| `plugin-sdk/memory-core-host-engine-qmd` | Exportações do engine QMD do host de memória |
| `plugin-sdk/memory-core-host-engine-storage` | Exportações do engine de armazenamento do host de memória |
| `plugin-sdk/memory-core-host-multimodal` | Auxiliares multimodais do host de memória |
| `plugin-sdk/memory-core-host-query` | Auxiliares de consulta do host de memória |
| `plugin-sdk/memory-core-host-secret` | Auxiliares de segredo do host de memória |
| `plugin-sdk/memory-core-host-events` | Auxiliares de journal de eventos do host de memória |
| `plugin-sdk/memory-core-host-status` | Auxiliares de status do host de memória |
| `plugin-sdk/memory-core-host-runtime-cli` | Auxiliares de runtime da CLI do host de memória |
| `plugin-sdk/memory-core-host-runtime-core` | Auxiliares centrais de runtime do host de memória |
| `plugin-sdk/memory-core-host-runtime-files` | Auxiliares de arquivo/runtime do host de memória |
| `plugin-sdk/memory-host-core` | Alias neutro em relação ao fornecedor para os auxiliares centrais de runtime do host de memória |
| `plugin-sdk/memory-host-events` | Alias neutro em relação ao fornecedor para os auxiliares de journal de eventos do host de memória |
| `plugin-sdk/memory-host-files` | Alias neutro em relação ao fornecedor para os auxiliares de arquivo/runtime do host de memória |
| `plugin-sdk/memory-host-markdown` | Auxiliares compartilhados de managed-markdown para plugins adjacentes à memória |
| `plugin-sdk/memory-core-host-engine-foundation` | Exportações do mecanismo base do host de memória |
| `plugin-sdk/memory-core-host-engine-embeddings` | Contratos de embeddings do host de memória, acesso ao registro, provedor local e helpers genéricos de lote/remotos |
| `plugin-sdk/memory-core-host-engine-qmd` | Exportações do mecanismo QMD do host de memória |
| `plugin-sdk/memory-core-host-engine-storage` | Exportações do mecanismo de armazenamento do host de memória |
| `plugin-sdk/memory-core-host-multimodal` | Helpers multimodais do host de memória |
| `plugin-sdk/memory-core-host-query` | Helpers de consulta do host de memória |
| `plugin-sdk/memory-core-host-secret` | Helpers de segredo do host de memória |
| `plugin-sdk/memory-core-host-events` | Helpers de journal de eventos do host de memória |
| `plugin-sdk/memory-core-host-status` | Helpers de status do host de memória |
| `plugin-sdk/memory-core-host-runtime-cli` | Helpers de runtime de CLI do host de memória |
| `plugin-sdk/memory-core-host-runtime-core` | Helpers de runtime principal do host de memória |
| `plugin-sdk/memory-core-host-runtime-files` | Helpers de arquivo/runtime do host de memória |
| `plugin-sdk/memory-host-core` | Alias neutro em relação a fornecedor para helpers de runtime principal do host de memória |
| `plugin-sdk/memory-host-events` | Alias neutro em relação a fornecedor para helpers de journal de eventos do host de memória |
| `plugin-sdk/memory-host-files` | Alias neutro em relação a fornecedor para helpers de arquivo/runtime do host de memória |
| `plugin-sdk/memory-host-markdown` | Helpers compartilhados de markdown gerenciado para plugins adjacentes à memória |
| `plugin-sdk/memory-host-search` | Fachada de runtime de Active Memory para acesso ao gerenciador de busca |
| `plugin-sdk/memory-host-status` | Alias neutro em relação ao fornecedor para os auxiliares de status do host de memória |
| `plugin-sdk/memory-lancedb` | Superfície auxiliar empacotada de memory-lancedb |
| `plugin-sdk/memory-host-status` | Alias neutro em relação a fornecedor para helpers de status do host de memória |
| `plugin-sdk/memory-lancedb` | Superfície auxiliar empacotada `memory-lancedb` |
</Accordion>
<Accordion title="Subcaminhos auxiliares empacotados reservados">
<Accordion title="Subcaminhos reservados de helpers empacotados">
| Família | Subcaminhos atuais | Uso pretendido |
| --- | --- | --- |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Auxiliares de suporte do Plugin de navegador empacotado (`browser-support` continua sendo o barrel de compatibilidade) |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Superfície auxiliar/runtime empacotada do Matrix |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Superfície auxiliar/runtime empacotada do LINE |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Superfície auxiliar empacotada do IRC |
| Auxiliares específicos de canal | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Seams de compatibilidade/auxiliares de canais empacotados |
| Auxiliares específicos de autenticação/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Seams auxiliares de recursos/plugins empacotados; `plugin-sdk/github-copilot-token` atualmente exporta `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` e `resolveCopilotApiToken` |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Helpers de suporte do plugin Browser empacotado (`browser-support` continua sendo o barrel de compatibilidade) |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Superfície de helper/runtime empacotada do Matrix |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Superfície de helper/runtime empacotada do LINE |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Superfície de helper empacotada do IRC |
| Helpers específicos de canal | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Interfaces de compatibilidade/helper de canal empacotado |
| Helpers específicos de autenticação/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Interfaces auxiliares de recurso/plugin empacotado; `plugin-sdk/github-copilot-token` atualmente exporta `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` e `resolveCopilotApiToken` |
</Accordion>
</AccordionGroup>
@ -310,45 +324,45 @@ métodos:
### Registro de capacidades
| Método | O que ele registra |
| ------------------------------------------------ | ----------------------------------- |
| `api.registerProvider(...)` | Inferência de texto (LLM) |
| Método | O que ele registra |
| ------------------------------------------------ | ------------------------------------- |
| `api.registerProvider(...)` | Inferência de texto (LLM) |
| `api.registerAgentHarness(...)` | Executor experimental de agente de baixo nível |
| `api.registerCliBackend(...)` | Backend de inferência local da CLI |
| `api.registerChannel(...)` | Canal de mensagens |
| `api.registerSpeechProvider(...)` | Síntese de texto para fala / STT |
| `api.registerCliBackend(...)` | Backend local de inferência por CLI |
| `api.registerChannel(...)` | Canal de mensagens |
| `api.registerSpeechProvider(...)` | Síntese de texto para fala / STT |
| `api.registerRealtimeTranscriptionProvider(...)` | Transcrição em tempo real por streaming |
| `api.registerRealtimeVoiceProvider(...)` | Sessões de voz duplex em tempo real |
| `api.registerMediaUnderstandingProvider(...)` | Análise de imagem/áudio/vídeo |
| `api.registerImageGenerationProvider(...)` | Geração de imagem |
| `api.registerMusicGenerationProvider(...)` | Geração de música |
| `api.registerVideoGenerationProvider(...)` | Geração de vídeo |
| `api.registerWebFetchProvider(...)` | Provedor de busca/scrape da web |
| `api.registerWebSearchProvider(...)` | Busca na web |
| `api.registerRealtimeVoiceProvider(...)` | Sessões de voz bidirecionais em tempo real |
| `api.registerMediaUnderstandingProvider(...)` | Análise de imagem/áudio/vídeo |
| `api.registerImageGenerationProvider(...)` | Geração de imagem |
| `api.registerMusicGenerationProvider(...)` | Geração de música |
| `api.registerVideoGenerationProvider(...)` | Geração de vídeo |
| `api.registerWebFetchProvider(...)` | Provedor de busca / raspagem na web |
| `api.registerWebSearchProvider(...)` | Busca na web |
### Ferramentas e comandos
| Método | O que ele registra |
| ------------------------------- | -------------------------------------------- |
| Método | O que ele registra |
| ------------------------------- | --------------------------------------------- |
| `api.registerTool(tool, opts?)` | Ferramenta do agente (obrigatória ou `{ optional: true }`) |
| `api.registerCommand(def)` | Comando personalizado (ignora o LLM) |
| `api.registerCommand(def)` | Comando personalizado (ignora o LLM) |
### Infraestrutura
| Método | O que ele registra |
| ---------------------------------------------- | -------------------------------------- |
| `api.registerHook(events, handler, opts?)` | Hook de evento |
| `api.registerHttpRoute(params)` | Endpoint HTTP do Gateway |
| `api.registerGatewayMethod(name, handler)` | Método RPC do Gateway |
| `api.registerCli(registrar, opts?)` | Subcomando da CLI |
| `api.registerService(service)` | Serviço em segundo plano |
| `api.registerInteractiveHandler(registration)` | Manipulador interativo |
| `api.registerMemoryPromptSupplement(builder)` | Seção de prompt aditiva adjacente à memória |
| `api.registerMemoryCorpusSupplement(adapter)` | Corpus aditivo de busca/leitura de memória |
| Método | O que ele registra |
| ---------------------------------------------- | --------------------------------------- |
| `api.registerHook(events, handler, opts?)` | Hook de evento |
| `api.registerHttpRoute(params)` | Endpoint HTTP do Gateway |
| `api.registerGatewayMethod(name, handler)` | Método RPC do Gateway |
| `api.registerCli(registrar, opts?)` | Subcomando da CLI |
| `api.registerService(service)` | Serviço em segundo plano |
| `api.registerInteractiveHandler(registration)` | Manipulador interativo |
| `api.registerMemoryPromptSupplement(builder)` | Seção adicional de prompt adjacente à memória |
| `api.registerMemoryCorpusSupplement(adapter)` | Corpus adicional de busca/leitura de memória |
Namespaces administrativos reservados do núcleo (`config.*`, `exec.approvals.*`, `wizard.*`,
`update.*`) sempre permanecem `operator.admin`, mesmo que um plugin tente atribuir um
escopo mais restrito ao método do Gateway. Prefira prefixos específicos do plugin para
`update.*`) sempre permanecem `operator.admin`, mesmo que um plugin tente atribuir
um escopo mais restrito a um método do Gateway. Prefira prefixos específicos do plugin para
métodos pertencentes ao plugin.
### Metadados de registro da CLI
@ -360,7 +374,7 @@ métodos pertencentes ao plugin.
roteamento e registro lazy da CLI do plugin
Se você quiser que um comando de plugin permaneça com carregamento lazy no caminho normal da CLI raiz,
forneça `descriptors` que cubram toda raiz de comando de nível superior exposta por esse
forneça `descriptors` que cubram cada raiz de comando de nível superior exposta por esse
registrador.
```typescript
@ -373,7 +387,7 @@ api.registerCli(
descriptors: [
{
name: "matrix",
description: "Gerencie contas do Matrix, verificação, dispositivos e estado do perfil",
description: "Gerenciar contas Matrix, verificação, dispositivos e estado do perfil",
hasSubcommands: true,
},
],
@ -382,67 +396,66 @@ api.registerCli(
```
Use `commands` sozinho apenas quando você não precisar de registro lazy na CLI raiz.
Esse caminho de compatibilidade eager continua sendo compatível, mas não instala
placeholders com suporte de descritor para carregamento lazy em tempo de parsing.
Esse caminho compatível e ansioso continua com suporte, mas não instala
placeholders com suporte de descriptor para carregamento lazy em tempo de parsing.
### Registro de backend da CLI
`api.registerCliBackend(...)` permite que um plugin seja o dono da configuração padrão de um
`api.registerCliBackend(...)` permite que um plugin seja dono da configuração padrão de um
backend local de CLI de IA, como `codex-cli`.
- O `id` do backend se torna o prefixo do provedor em referências de modelo como `codex-cli/gpt-5`.
- A `config` do backend usa o mesmo formato de `agents.defaults.cliBackends.<id>`.
- A configuração do usuário continua tendo prioridade. O OpenClaw mescla `agents.defaults.cliBackends.<id>` sobre o
- A configuração do usuário continua prevalecendo. O OpenClaw mescla `agents.defaults.cliBackends.<id>` sobre o
padrão do plugin antes de executar a CLI.
- Use `normalizeConfig` quando um backend precisar de reescritas de compatibilidade após a mesclagem
(por exemplo, normalizando formatos antigos de flags).
- Use `normalizeConfig` quando um backend precisar de regravações de compatibilidade após a mesclagem
(por exemplo, normalizando formatos antigos de flag).
### Slots exclusivos
| Método | O que ele registra |
| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `api.registerContextEngine(id, factory)` | Mecanismo de contexto (apenas um ativo por vez). O callback `assemble()` recebe `availableTools` e `citationsMode` para que o mecanismo adapte adições ao prompt. |
| `api.registerMemoryCapability(capability)` | Capacidade de memória unificada |
| `api.registerMemoryPromptSection(builder)` | Construtor de seção de prompt de memória |
| `api.registerMemoryFlushPlan(resolver)` | Resolvedor de plano de flush de memória |
| `api.registerMemoryRuntime(runtime)` | Adaptador de runtime de memória |
| Método | O que ele registra |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `api.registerContextEngine(id, factory)` | Mecanismo de contexto (um ativo por vez). O callback `assemble()` recebe `availableTools` e `citationsMode` para que o mecanismo possa adaptar adições ao prompt. |
| `api.registerMemoryCapability(capability)` | Capacidade unificada de memória |
| `api.registerMemoryPromptSection(builder)` | Construtor de seção de prompt de memória |
| `api.registerMemoryFlushPlan(resolver)` | Resolvedor de plano de flush de memória |
| `api.registerMemoryRuntime(runtime)` | Adaptador de runtime de memória |
### Adaptadores de embedding de memória
| Método | O que ele registra |
| ---------------------------------------------- | ------------------------------------------ |
| `api.registerMemoryEmbeddingProvider(adapter)` | Adaptador de embedding de memória para o Plugin ativo |
| Método | O que ele registra |
| ---------------------------------------------- | ---------------------------------------------- |
| `api.registerMemoryEmbeddingProvider(adapter)` | Adaptador de embedding de memória para o plugin ativo |
- `registerMemoryCapability` é a API exclusiva preferida para plugin de memória.
- `registerMemoryCapability` também pode expor `publicArtifacts.listArtifacts(...)`
para que plugins complementares consumam artefatos de memória exportados por meio de
para que plugins complementares possam consumir artefatos de memória exportados por meio de
`openclaw/plugin-sdk/memory-host-core` em vez de acessar o layout privado de um
plugin de memória específico.
- `registerMemoryPromptSection`, `registerMemoryFlushPlan` e
`registerMemoryRuntime` são APIs exclusivas de plugin de memória compatíveis com versões legadas.
- `registerMemoryEmbeddingProvider` permite que o Plugin de memória ativo registre um
ou mais IDs de adaptador de embedding (por exemplo, `openai`, `gemini` ou um ID
personalizado definido pelo plugin).
- Configurações do usuário como `agents.defaults.memorySearch.provider` e
`agents.defaults.memorySearch.fallback` são resolvidas com base nesses IDs de
adaptador registrados.
`registerMemoryRuntime` são APIs exclusivas legadas compatíveis para plugin de memória.
- `registerMemoryEmbeddingProvider` permite que o plugin de memória ativo registre um
ou mais IDs de adaptador de embedding (por exemplo `openai`, `gemini` ou um ID personalizado
definido pelo plugin).
- Configuração do usuário, como `agents.defaults.memorySearch.provider` e
`agents.defaults.memorySearch.fallback`, é resolvida com base nesses IDs de adaptador registrados.
### Eventos e ciclo de vida
| Método | O que ele faz |
| -------------------------------------------- | ----------------------------- |
| `api.on(hookName, handler, opts?)` | Hook tipado de ciclo de vida |
| `api.onConversationBindingResolved(handler)` | Callback de vínculo de conversa |
| Método | O que ele faz |
| -------------------------------------------- | ---------------------------- |
| `api.on(hookName, handler, opts?)` | Hook tipado de ciclo de vida |
| `api.onConversationBindingResolved(handler)` | Callback de vinculação de conversa |
### Semântica de decisão de hook
- `before_tool_call`: retornar `{ block: true }` é terminal. Assim que qualquer manipulador definir isso, manipuladores de menor prioridade serão ignorados.
- `before_tool_call`: retornar `{ block: false }` é tratado como nenhuma decisão (igual a omitir `block`), não como uma substituição.
- `before_install`: retornar `{ block: true }` é terminal. Assim que qualquer manipulador definir isso, manipuladores de menor prioridade serão ignorados.
- `before_install`: retornar `{ block: false }` é tratado como nenhuma decisão (igual a omitir `block`), não como uma substituição.
- `reply_dispatch`: retornar `{ handled: true, ... }` é terminal. Assim que qualquer manipulador assumir o despacho, manipuladores de menor prioridade e o caminho padrão de despacho do modelo serão ignorados.
- `message_sending`: retornar `{ cancel: true }` é terminal. Assim que qualquer manipulador definir isso, manipuladores de menor prioridade serão ignorados.
- `message_sending`: retornar `{ cancel: false }` é tratado como nenhuma decisão (igual a omitir `cancel`), não como uma substituição.
- `before_tool_call`: retornar `{ block: true }` é terminal. Assim que qualquer handler definir isso, handlers de prioridade mais baixa serão ignorados.
- `before_tool_call`: retornar `{ block: false }` é tratado como nenhuma decisão (o mesmo que omitir `block`), não como sobrescrita.
- `before_install`: retornar `{ block: true }` é terminal. Assim que qualquer handler definir isso, handlers de prioridade mais baixa serão ignorados.
- `before_install`: retornar `{ block: false }` é tratado como nenhuma decisão (o mesmo que omitir `block`), não como sobrescrita.
- `reply_dispatch`: retornar `{ handled: true, ... }` é terminal. Assim que qualquer handler assumir o dispatch, handlers de prioridade mais baixa e o caminho padrão de dispatch do modelo serão ignorados.
- `message_sending`: retornar `{ cancel: true }` é terminal. Assim que qualquer handler definir isso, handlers de prioridade mais baixa serão ignorados.
- `message_sending`: retornar `{ cancel: false }` é tratado como nenhuma decisão (o mesmo que omitir `cancel`), não como sobrescrita.
### Campos do objeto da API
@ -454,61 +467,62 @@ backend local de CLI de IA, como `codex-cli`.
| `api.description` | `string?` | Descrição do plugin (opcional) |
| `api.source` | `string` | Caminho de origem do plugin |
| `api.rootDir` | `string?` | Diretório raiz do plugin (opcional) |
| `api.config` | `OpenClawConfig` | Snapshot da configuração atual (snapshot ativo em memória no runtime quando disponível) |
| `api.config` | `OpenClawConfig` | Snapshot atual da configuração (snapshot ativo em memória do runtime quando disponível) |
| `api.pluginConfig` | `Record<string, unknown>` | Configuração específica do plugin em `plugins.entries.<id>.config` |
| `api.runtime` | `PluginRuntime` | [Auxiliares de runtime](/pt-BR/plugins/sdk-runtime) |
| `api.runtime` | `PluginRuntime` | [Helpers de runtime](/pt-BR/plugins/sdk-runtime) |
| `api.logger` | `PluginLogger` | Logger com escopo (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Modo de carregamento atual; `"setup-runtime"` é a janela leve de inicialização/configuração antes da entrada completa |
| `api.resolvePath(input)` | `(string) => string` | Resolve o caminho em relação à raiz do plugin |
| `api.resolvePath(input)` | `(string) => string` | Resolve um caminho relativo à raiz do plugin |
## Convenção de módulos internos
## Convenção de módulo interno
Dentro do seu plugin, use arquivos barrel locais para importações internas:
```
my-plugin/
api.ts # Exportações públicas para consumidores externos
runtime-api.ts # Exportações de runtime somente internas
runtime-api.ts # Exportações internas de runtime
index.ts # Ponto de entrada do plugin
setup-entry.ts # Entrada leve somente para configuração (opcional)
setup-entry.ts # Entrada leve apenas para configuração (opcional)
```
<Warning>
Nunca importe seu próprio plugin por meio de `openclaw/plugin-sdk/<your-plugin>`
a partir de código de produção. Direcione importações internas por `./api.ts` ou
em código de produção. Direcione importações internas por `./api.ts` ou
`./runtime-api.ts`. O caminho do SDK é apenas o contrato externo.
</Warning>
Superfícies públicas de plugins empacotados carregadas por fachada (`api.ts`, `runtime-api.ts`,
Superfícies públicas de plugin empacotado carregadas por facade (`api.ts`, `runtime-api.ts`,
`index.ts`, `setup-entry.ts` e arquivos públicos de entrada semelhantes) agora preferem o
snapshot ativo de configuração do runtime quando o OpenClaw já está em execução. Se ainda não existir
um snapshot de runtime, elas recorrem à configuração resolvida no arquivo em disco.
snapshot ativo de configuração de runtime quando o OpenClaw já está em execução. Se ainda não existir
um snapshot de runtime, elas recorrem ao arquivo de configuração resolvido em disco.
Plugins de provedor também podem expor um barrel de contrato local e restrito ao plugin quando um
auxiliar for intencionalmente específico do provedor e ainda não pertencer a um subcaminho genérico do SDK.
Exemplo empacotado atual: o provedor Anthropic mantém seus auxiliares de stream do Claude em seu próprio
seam público `api.ts` / `contract-api.ts`, em vez de promover a lógica de cabeçalho beta do Anthropic e `service_tier`
para um contrato genérico `plugin-sdk/*`.
Plugins de provedor também podem expor um barrel de contrato local e estreito do plugin quando um
helper for intencionalmente específico do provedor e ainda não pertencer a um subcaminho genérico
do SDK. Exemplo empacotado atual: o provedor Anthropic mantém seus helpers de stream Claude
em sua própria interface pública `api.ts` / `contract-api.ts`, em vez de
promover a lógica de cabeçalho beta do Anthropic e `service_tier` para um contrato genérico
`plugin-sdk/*`.
Outros exemplos empacotados atuais:
- `@openclaw/openai-provider`: `api.ts` exporta construtores de provedor,
auxiliares de modelo padrão e construtores de provedor em tempo real
- `@openclaw/openrouter-provider`: `api.ts` exporta o construtor do provedor e
auxiliares de onboarding/configuração
- `@openclaw/openai-provider`: `api.ts` exporta builders de provedor,
helpers de modelo padrão e builders de provedor em tempo real
- `@openclaw/openrouter-provider`: `api.ts` exporta o builder de provedor, além de
helpers de onboarding/configuração
<Warning>
O código de produção de extensões também deve evitar importações de `openclaw/plugin-sdk/<other-plugin>`.
Se um auxiliar for realmente compartilhado, promova-o a um subcaminho neutro do SDK,
Se um helper for realmente compartilhado, promova-o para um subcaminho neutro do SDK,
como `openclaw/plugin-sdk/speech`, `.../provider-model-shared` ou outra
superfície orientada por capacidade, em vez de acoplar dois plugins.
superfície orientada a capacidade, em vez de acoplar dois plugins entre si.
</Warning>
## Relacionado
- [Pontos de entrada](/pt-BR/plugins/sdk-entrypoints) — opções de `definePluginEntry` e `defineChannelPluginEntry`
- [Auxiliares de runtime](/pt-BR/plugins/sdk-runtime) — referência completa do namespace `api.runtime`
- [Configuração e setup](/pt-BR/plugins/sdk-setup) — empacotamento, manifests, esquemas de configuração
- [Helpers de runtime](/pt-BR/plugins/sdk-runtime) — referência completa do namespace `api.runtime`
- [Configuração e config](/pt-BR/plugins/sdk-setup) — empacotamento, manifests, schemas de configuração
- [Testes](/pt-BR/plugins/sdk-testing) — utilitários de teste e regras de lint
- [Migração do SDK](/pt-BR/plugins/sdk-migration) — migração de superfícies descontinuadas
- [Internals de plugin](/pt-BR/plugins/architecture) — arquitetura detalhada e modelo de capacidade
- [Migração do SDK](/pt-BR/plugins/sdk-migration) — migração a partir de superfícies obsoletas
- [Internos de plugin](/pt-BR/plugins/architecture) — arquitetura profunda e modelo de capacidades

View File

@ -1,9 +1,9 @@
---
x-i18n:
generated_at: "2026-04-08T05:27:22Z"
generated_at: "2026-04-18T05:25:15Z"
model: gpt-5.4
provider: openai
source_hash: 4a9066b2a939c5a9ba69141d75405f0e8097997b523164340e2f0e9a0d5060dd
source_hash: dbb2c70c82da7f6f12d90e25666635ff4147c52e8a94135e902d1de4f5cbccca
source_path: refactor/qa.md
workflow: 15
---
@ -14,21 +14,21 @@ Status: migração fundamental concluída.
## Objetivo
Mover o QA do OpenClaw de um modelo de definição dividida para uma única fonte da verdade:
Mover o QA do OpenClaw de um modelo de definição dividido para uma única fonte da verdade:
- metadados do cenário
- prompts enviados ao modelo
- configuração e desmontagem
- setup e teardown
- lógica do harness
- asserções e critérios de sucesso
- artefatos e sugestões de relatório
- artifacts e dicas de relatório
O estado final desejado é um harness de QA genérico que carrega arquivos poderosos de definição de cenários em vez de codificar a maior parte do comportamento em TypeScript.
O estado final desejado é um harness de QA genérico que carregue arquivos poderosos de definição de cenário em vez de codificar a maior parte do comportamento em TypeScript.
## Estado atual
A fonte primária da verdade agora vive em `qa/scenarios/index.md` mais um arquivo por
cenário em `qa/scenarios/*.md`.
A principal fonte da verdade agora vive em `qa/scenarios/index.md` mais um arquivo por
cenário em `qa/scenarios/<theme>/*.md`.
Implementado:
@ -36,99 +36,99 @@ Implementado:
- metadados canônicos do pacote de QA
- identidade do operador
- missão inicial
- `qa/scenarios/*.md`
- `qa/scenarios/<theme>/*.md`
- um arquivo Markdown por cenário
- metadados do cenário
- associações de handlers
- configuração de execução específica do cenário
- `extensions/qa-lab/src/scenario-catalog.ts`
- parser do pacote Markdown + validação com zod
- parser de pacote Markdown + validação com zod
- `extensions/qa-lab/src/qa-agent-bootstrap.ts`
- renderização do plano a partir do pacote Markdown
- `extensions/qa-lab/src/qa-agent-workspace.ts`
- gera arquivos de compatibilidade semeados mais `QA_SCENARIOS.md`
- semeia arquivos de compatibilidade gerados mais `QA_SCENARIOS.md`
- `extensions/qa-lab/src/suite.ts`
- seleciona cenários executáveis por meio de associações de handlers definidas em Markdown
- protocolo do barramento de QA + UI
- Protocolo do barramento de QA + UI
- anexos inline genéricos para renderização de imagem/vídeo/áudio/arquivo
Superfícies divididas restantes:
- `extensions/qa-lab/src/suite.ts`
- ainda concentra a maior parte da lógica executável de handlers personalizados
- ainda controla a maior parte da lógica executável de handlers personalizados
- `extensions/qa-lab/src/report.ts`
- ainda deriva a estrutura do relatório a partir das saídas em tempo de execução
- ainda deriva a estrutura do relatório a partir das saídas de runtime
Portanto, a divisão da fonte da verdade foi corrigida, mas a execução ainda é majoritariamente baseada em handlers, e não totalmente declarativa.
Então a divisão da fonte da verdade foi corrigida, mas a execução ainda é em grande parte baseada em handlers, e não totalmente declarativa.
## Como é a superfície real de cenários
Ao ler a suíte atual, é possível ver algumas classes distintas de cenários.
Ler a suíte atual mostra algumas classes distintas de cenários.
### Interação simples
- linha de base de canal
- linha de base de MD
- baseline de canal
- baseline de DM
- acompanhamento em thread
- troca de modelo
- continuidade após aprovação
- continuidade de aprovação
- reação/edição/exclusão
### Mutação de configuração e tempo de execução
### Configuração e mutação de runtime
- patch de configuração para desabilitar skill
- aplicação de configuração com reativação após reinício
- inversão de capacidade após reinício da configuração
- verificação de divergência do inventário em tempo de execução
- config apply restart wake-up
- config restart capability flip
- verificação de desvio do inventário de runtime
### Asserções de sistema de arquivos e repositório
- relatório de descoberta de código/documentação
- compilar Lobster Invaders
- busca de artefato de imagem gerada
- relatório de descoberta de source/docs
- build do Lobster Invaders
- busca de artifact de imagem gerada
### Orquestração de memória
- recuperação de memória
- ferramentas de memória em contexto de canal
- fallback em falha de memória
- fallback de falha de memória
- classificação de memória de sessão
- isolamento de memória de thread
- varredura de sonho de memória
- isolamento de memória por thread
- varredura de Dreaming da memória
### Integração de ferramentas e plugins
- chamada de plugin-tools do MCP
- chamada de plugin-tools MCP
- visibilidade de skill
- instalação dinâmica de skill
- hot install de skill
- geração nativa de imagem
- roundtrip de imagem
- compreensão de imagem a partir de anexo
- entendimento de imagem a partir de anexo
### Vários turnos e vários atores
### Multiturno e multiautor
- transferência para subagente
- síntese com distribuição para subagentes
- fluxos no estilo recuperação após reinício
- handoff de subagente
- síntese de fanout de subagente
- fluxos no estilo de recuperação após reinício
Essas categorias são importantes porque orientam os requisitos da DSL. Uma lista simples de prompt + texto esperado não é suficiente.
Essas categorias importam porque orientam os requisitos da DSL. Uma lista plana de prompt + texto esperado não é suficiente.
## Direção
### Fonte única da verdade
Usar `qa/scenarios/index.md` mais `qa/scenarios/*.md` como a fonte da verdade
autoral.
Usar `qa/scenarios/index.md` mais `qa/scenarios/<theme>/*.md` como a
fonte da verdade criada manualmente.
O pacote deve permanecer:
O pacote deve continuar sendo:
- legível para humanos em revisão
- analisável por máquina
- legível por humanos em revisão
- parseável por máquina
- rico o suficiente para orientar:
- execução da suíte
- bootstrap do workspace de QA
- metadados da UI do QA Lab
- prompts de documentação/descoberta
- prompts de docs/discovery
- geração de relatórios
### Formato de autoria preferido
@ -142,9 +142,9 @@ Formato recomendado:
- title
- surface
- tags
- refs de documentação
- refs de docs
- refs de código
- substituições de modelo/provedor
- sobrescritas de modelo/provider
- pré-requisitos
- seções em prosa
- objetivo
@ -158,7 +158,7 @@ Formato recomendado:
Isso oferece:
- melhor legibilidade em PR do que um JSON gigante
- melhor legibilidade em PR do que JSON gigante
- contexto mais rico do que YAML puro
- parsing estrito e validação com zod
@ -171,7 +171,7 @@ Exemplo:
````md
---
id: image-generation-roundtrip
title: Image generation roundtrip
title: Roundtrip de geração de imagem
surface: image
tags: [media, image, roundtrip]
models:
@ -187,9 +187,9 @@ codeRefs:
- src/gateway/chat-attachments.ts
---
# Objective
# Objetivo
Verify generated media is reattached on the follow-up turn.
Verificar se a mídia gerada é reanexada no turno de acompanhamento.
# Setup
@ -210,15 +210,15 @@ Verify generated media is reattached on the follow-up turn.
- action: agent.send
session: agent:qa:image-roundtrip
message: |
Image generation check: generate a QA lighthouse image and summarize it in one short sentence.
Verificação de geração de imagem: gere uma imagem de um farol de QA e resuma-a em uma frase curta.
- action: artifact.capture
kind: generated-image
promptSnippet: Image generation check
promptSnippet: Verificação de geração de imagem
saveAs: lighthouseImage
- action: agent.send
session: agent:qa:image-roundtrip
message: |
Roundtrip image inspection check: describe the generated lighthouse attachment in one short sentence.
Verificação de inspeção de roundtrip de imagem: descreva o anexo da imagem do farol gerado em uma frase curta.
attachments:
- fromArtifact: lighthouseImage
```
@ -227,21 +227,21 @@ Verify generated media is reattached on the follow-up turn.
```yaml scenario.expect
- assert: outbound.textIncludes
value: lighthouse
value: farol
- assert: requestLog.matches
where:
promptIncludes: Roundtrip image inspection check
promptIncludes: Verificação de inspeção de roundtrip de imagem
imageInputCountGte: 1
- assert: artifact.exists
ref: lighthouseImage
```
````
## Capacidades do runner que a DSL precisa cobrir
## Recursos de runner que a DSL precisa cobrir
Com base na suíte atual, o runner genérico precisa de mais do que execução de prompt.
Com base na suíte atual, o runner genérico precisa de mais do que execução de prompts.
### Ações de ambiente e configuração
### Ações de ambiente e setup
- `bus.reset`
- `gateway.waitHealthy`
@ -257,7 +257,7 @@ Com base na suíte atual, o runner genérico precisa de mais do que execução d
- `bus.injectInbound`
- `bus.injectOutbound`
### Ações de configuração e tempo de execução
### Ações de configuração e runtime
- `config.get`
- `config.patch`
@ -266,7 +266,7 @@ Com base na suíte atual, o runner genérico precisa de mais do que execução d
- `tools.effective`
- `skills.status`
### Ações de arquivo e artefato
### Ações de arquivo e artifact
- `file.write`
- `file.read`
@ -275,7 +275,7 @@ Com base na suíte atual, o runner genérico precisa de mais do que execução d
- `artifact.captureGeneratedImage`
- `artifact.capturePath`
### Ações de memória e cron
### Ações de memória e Cron
- `memory.indexForce`
- `memory.searchCli`
@ -305,60 +305,60 @@ Com base na suíte atual, o runner genérico precisa de mais do que execução d
- `cron.managedPresent`
- `artifact.exists`
## Variáveis e referências a artefatos
## Variáveis e referências de artifact
A DSL deve dar suporte a saídas salvas e referências posteriores.
A DSL precisa oferecer suporte a saídas salvas e referências posteriores.
Exemplos da suíte atual:
- criar uma thread e depois reutilizar `threadId`
- criar uma sessão e depois reutilizar `sessionKey`
- gerar uma imagem e depois anexar o arquivo no turno seguinte
- gerar uma string de marcador de reativação e depois verificar que ela aparece mais tarde
- gerar uma imagem e depois anexar o arquivo no próximo turno
- gerar uma string de marcador de wake e depois verificar que ela aparece mais tarde
Capacidades necessárias:
Recursos necessários:
- `saveAs`
- `${vars.name}`
- `${artifacts.name}`
- referências tipadas para caminhos, chaves de sessão, ids de thread, marcadores e saídas de ferramentas
- referências tipadas para caminhos, chaves de sessão, ids de thread, marcadores, saídas de ferramentas
Sem suporte a variáveis, o harness continuará deixando a lógica de cenário vazar de volta para o TypeScript.
Sem suporte a variáveis, o harness continuará vazando lógica de cenário de volta para o TypeScript.
## O que deve permanecer como escape hatch
Um runner totalmente declarativo e puro não é realista na fase 1.
Um runner totalmente declarativo puro não é realista na fase 1.
Alguns cenários são inerentemente pesados em orquestração:
- varredura de sonho de memória
- aplicação de configuração com reativação após reinício
- inversão de capacidade após reinício da configuração
- resolução de artefato de imagem gerada por timestamp/caminho
- varredura de Dreaming da memória
- config apply restart wake-up
- config restart capability flip
- resolução de artifact de imagem gerada por timestamp/caminho
- avaliação de relatório de descoberta
Por enquanto, eles devem usar handlers personalizados explícitos.
Por enquanto, estes devem usar handlers personalizados explícitos.
Regra recomendada:
- 85-90% declarativo
- etapas `customHandler` explícitas para o restante mais difícil
- steps com `customHandler` explícito para o restante mais difícil
- apenas handlers personalizados nomeados e documentados
- nenhum código inline anônimo no arquivo de cenário
Isso mantém o mecanismo genérico limpo e ainda permite progresso.
Isso mantém o mecanismo genérico limpo e ainda permite avançar.
## Mudança de arquitetura
### Atual
O Markdown de cenário já é a fonte da verdade para:
O Markdown de cenários já é a fonte da verdade para:
- execução da suíte
- arquivos de bootstrap do workspace
- catálogo de cenários da UI do QA Lab
- metadados do relatório
- prompts de descoberta
- metadados de relatório
- prompts de discovery
Compatibilidade gerada:
@ -373,8 +373,8 @@ Compatibilidade gerada:
Concluído.
- adicionado `qa/scenarios/index.md`
- cenários divididos em `qa/scenarios/*.md`
- adicionado parser para conteúdo nomeado do pacote Markdown YAML
- cenários divididos em `qa/scenarios/<theme>/*.md`
- adicionado parser para conteúdo nomeado de pacote Markdown YAML
- validado com zod
- consumidores alterados para usar o pacote parseado
- removidos `qa/seed-scenarios.json` e `qa/QA_KICKOFF_TASK.md` no nível do repositório
@ -383,7 +383,7 @@ Concluído.
- dividir `extensions/qa-lab/src/suite.ts` em:
- loader
- mecanismo
- mechanism
- registro de ações
- registro de asserções
- handlers personalizados
@ -396,46 +396,46 @@ Entregável:
Começar com cenários que são principalmente prompt + espera + asserção:
- acompanhamento em thread
- compreensão de imagem a partir de anexo
- entendimento de imagem a partir de anexo
- visibilidade e invocação de skill
- linha de base de canal
- baseline de canal
Entregável:
- primeiros cenários reais definidos em Markdown enviados pelo mecanismo genérico
- primeiros cenários reais definidos em Markdown sendo entregues pelo mecanismo genérico
### Fase 4: migrar cenários intermediários
- roundtrip de geração de imagem
- ferramentas de memória em contexto de canal
- classificação de memória de sessão
- transferência para subagente
- síntese com distribuição para subagentes
- handoff de subagente
- síntese de fanout de subagente
Entregável:
- variáveis, artefatos, asserções de ferramenta e asserções de log de requisição comprovados
- variáveis, artifacts, asserções de ferramenta e asserções de log de requisição comprovados
### Fase 5: manter cenários difíceis em handlers personalizados
- varredura de sonho de memória
- aplicação de configuração com reativação após reinício
- inversão de capacidade após reinício da configuração
- divergência do inventário em tempo de execução
- varredura de Dreaming da memória
- config apply restart wake-up
- config restart capability flip
- desvio de inventário de runtime
Entregável:
- mesmo formato de autoria, mas com blocos de etapas personalizadas explícitas quando necessário
- mesmo formato de autoria, mas com blocos explícitos de steps personalizados quando necessário
### Fase 6: excluir o mapa de cenários codificado
### Fase 6: excluir mapa de cenários codificado
Quando a cobertura do pacote estiver boa o suficiente:
Quando a cobertura do pacote for boa o suficiente:
- remover a maior parte da ramificação TypeScript específica de cenários de `extensions/qa-lab/src/suite.ts`
- remover a maior parte do branching específico por cenário em TypeScript de `extensions/qa-lab/src/suite.ts`
## Suporte a Slack falso / rich media
## Suporte a Fake Slack / mídia rica
O barramento de QA atual é focado em texto.
O barramento de QA atual é orientado a texto.
Arquivos relevantes:
@ -445,7 +445,7 @@ Arquivos relevantes:
- `extensions/qa-lab/src/bus-server.ts`
- `extensions/qa-lab/web/src/ui-render.ts`
Hoje, o barramento de QA oferece suporte a:
Hoje o barramento de QA oferece suporte a:
- texto
- reações
@ -482,36 +482,36 @@ Depois adicionar `attachments?: QaBusAttachment[]` a:
### Por que genérico primeiro
Não construir um modelo de mídia exclusivo para Slack.
Não criar um modelo de mídia exclusivo para Slack.
Em vez disso:
- um modelo genérico de transporte de QA
- vários renderizadores sobre ele
- múltiplos renderizadores sobre ele
- chat atual do QA Lab
- futuro web de Slack falso
- qualquer outra visualização de transporte falsa
- futuro fake Slack web
- quaisquer outras visualizações de transporte fake
Isso evita lógica duplicada e permite que cenários de mídia permaneçam agnósticos ao transporte.
Isso evita lógica duplicada e permite que cenários de mídia permaneçam independentes do transporte.
### Trabalho de UI necessário
Atualizar a UI de QA para renderizar:
- pré-visualização de imagem inline
- pré-visualização inline de imagem
- player de áudio inline
- player de vídeo inline
- chip de anexo de arquivo
A UI atual já consegue renderizar threads e reações, então a renderização de anexos deve ser adicionada sobre o mesmo modelo de cartão de mensagem.
A UI atual já consegue renderizar threads e reações, então a renderização de anexos deve se sobrepor ao mesmo modelo de cartão de mensagem.
### Trabalho de cenário habilitado pelo transporte de mídia
Quando os anexos passarem pelo barramento de QA, poderemos adicionar cenários mais ricos de chat falso:
Assim que os anexos passarem pelo barramento de QA, poderemos adicionar cenários mais ricos de chat fake:
- resposta com imagem inline em Slack falso
- compreensão de anexo de áudio
- compreensão de anexo de vídeo
- resposta inline com imagem em fake Slack
- entendimento de anexo de áudio
- entendimento de anexo de vídeo
- ordenação mista de anexos
- resposta em thread com mídia preservada
@ -528,13 +528,13 @@ O próximo bloco de implementação deve ser:
Este é o menor caminho que comprova ambos os objetivos:
- QA genérico definido por Markdown
- superfícies de mensagens falsas mais ricas
- QA genérico definido em Markdown
- superfícies mais ricas de mensagens fake
## Perguntas em aberto
- se os arquivos de cenário devem permitir templates de prompt em Markdown embutidos com interpolação de variáveis
- se os arquivos de cenário devem permitir templates de prompt em Markdown incorporados com interpolação de variáveis
- se setup/cleanup devem ser seções nomeadas ou apenas listas ordenadas de ações
- se referências a artefatos devem ser fortemente tipadas no schema ou baseadas em string
- se handlers personalizados devem viver em um único registro ou em registros por superfície
- se o arquivo de compatibilidade JSON gerado deve permanecer versionado durante a migração
- se as referências de artifacts devem ser fortemente tipadas no schema ou baseadas em string
- se handlers personalizados devem ficar em um único registro ou em registros por surface
- se o arquivo de compatibilidade JSON gerado deve continuar versionado durante a migração