Signal
Integración Signal vía signal-cli (JSON-RPC + SSE): configuración, setup y modelo de números.
Estado: Integración con CLI externo. El Gateway se comunica con signal-cli vía HTTP JSON-RPC + SSE.
Configuración Rápida para Principiantes
1. Recomendamos usar un <strong>número de Signal separado</strong> como número del bot.
2. Instala <code>signal-cli</code> (requiere Java).
3. Vincula dispositivo del bot e inicia demonio:
- <code>signal-cli link -n "OpenClaw"</code>
4. Configura OpenClaw e inicia el gateway.
Configuración mínima:
{
channels: {
signal: {
enabled: true,
account: "+15551234567",
cliPath: "signal-cli",
dmPolicy: "pairing",
allowFrom: ["+15557654321"],
},
},
}Qué Es
- Conecta a Signal vía <code>signal-cli</code> (no libsignal embebido).
- Enrutamiento determinista: las respuestas siempre van de vuelta a Signal.
- DMs usan la sesión principal del agente; chats de grupo se aíslan como '<code>'agent:'<agentId>':signal:group:'<groupId>''</code>'.
Escrituras de Config
Por defecto, permite que Signal escriba actualizaciones disparadas por <code>/config set|unset</code> de vuelta al archivo de config (requiere <code>commands.config: true</code>).
Deshabilitar:
{
channels: { signal: { configWrites: false } },
}Modelo de Números (Importante)
- El Gateway conecta a un <strong>dispositivo Signal</strong> (i.e., la cuenta logueada por <code>signal-cli</code>).
- Si ejecutas el bot con <strong>tu cuenta personal de Signal</strong>, ignorará mensajes que envíes para evitar loops.
- Si quieres "envío un mensaje al bot, y el bot me responde", por favor usa un <strong>número de bot separado</strong>.
Setup (Camino Rápido)
1. Instala <code>signal-cli</code> (requiere Java).
2. Vincula cuenta del bot:
- <code>signal-cli link -n "OpenClaw"</code> luego escanea código QR en Signal
3. Configura e inicia el gateway.
Multi-cuenta: usa '<code>'channels.signal.accounts'</code>' para configurar cada cuenta (opcional '<code>'name'</code>'). Para estructura compartida, ver '<a href="/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts">'/gateway/configuration'</a>'.
Modo Demonio Externo (httpUrl)
Si quieres gestionar <code>signal-cli</code> tú mismo (para evitar cold start de JVM, inicialización de contenedor, o overhead de inicio en CPU compartida), puedes ejecutar el demonio separadamente y dejar que OpenClaw se conecte a él:
{
channels: {
signal: {
httpUrl: "http://127.0.0.1:8080",
autoStart: false,
},
},
}Esto omite el pull-up automático y la espera de inicio del lado de OpenClaw. Si el inicio es muy lento durante el pull-up automático, puedes ajustar <code>channels.signal.startupTimeoutMs</code>.
Control de Acceso (DM + Chat de Grupo)
DM:
- Predeterminado: <code>channels.signal.dmPolicy = "pairing"</code>.
- Remitentes desconocidos reciben un código de emparejamiento, y los mensajes no se procesan hasta ser aprobados (expira en 1 hora).
- Aprobar:
- <code>openclaw pairing list signal</code>
- '<code>'openclaw pairing approve signal '<CODE>''</code>'
- Emparejamiento es el intercambio de token predeterminado para DMs de Signal. Ver '<a href="/start/pairing">'Emparejamiento'</a>'.
- Si el remitente solo tiene UUID (de '<code>'sourceUuid'</code>'), se almacenará en '<code>'channels.signal.allowFrom'</code>' como '<code>'uuid:'<id>''</code>'.
Chat de grupo:
- <code>channels.signal.groupPolicy = open | allowlist | disabled</code>.
- <code>channels.signal.groupAllowFrom</code> controla qué remitentes pueden disparar cuando es <code>allowlist</code>.
Cómo Funciona (Comportamiento)
- <code>signal-cli</code> corre como demonio; el gateway lee eventos vía SSE.
- Los mensajes entrantes se normalizan a un sobre de canal común.
ChannelsSignalPage.step08.p3
Media and Limits
- Outbound text is split by <code>channels.signal.textChunkLimit</code> (default 4000).
- Optional priority split by blank lines: <code>channels.signal.chunkMode="newline"</code>.
- Supports attachments (provided by <code>signal-cli</code> as base64).
- Default media limit: <code>channels.signal.mediaMaxMb</code> (default 8MB).
- <code>channels.signal.ignoreAttachments</code> can skip media download.
- Group history context: <code>channels.signal.historyLimit</code> (or <code>channels.signal.accounts.*.historyLimit</code>), fallback <code>messages.groupChat.historyLimit</code>. Set to <code>0</code> to disable (default 50).
Typing and Read Receipts
- <strong>Typing</strong>: OpenClaw sends typing signals via <code>signal-cli sendTyping</code> and refreshes during reply execution.
- <strong>Read receipts</strong>: When <code>channels.signal.sendReadReceipts</code> is true, OpenClaw forwards read receipts for allowed DMs.
- signal-cli does not support group chat read receipts.
Reactions (Message Tool)
- Use message tool: <code>message action=react channel=signal</code>.
- Target can be E.164 or UUID (get '<code>'uuid:'<id>''</code>' from pairing output; bare UUID also works).
- <code>messageId</code> is the Signal timestamp of the message you want to react to.
- Group chat reactions need <code>targetAuthor</code> or <code>targetAuthorUuid</code>.
Examples:
message action=react channel=signal target=uuid:123e4567-e89b-12d3-a456-426614174000 messageId=1737630212345 emoji=🔥 message action=react channel=signal target=+15551234567 messageId=1737630212345 emoji=🔥 remove=true message action=react channel=signal target=signal:group:'<groupId>' targetAuthor=uuid:'<sender-uuid>' messageId=1737630212345 emoji=✅
Config switches:
- <code>channels.signal.actions.reactions</code>: whether to enable reactions (default true).
- <code>channels.signal.reactionLevel</code>: <code>off | ack | minimal | extensive</code>
- <code>off</code>/<code>ack</code> disables agent reactions (message tool <code>react</code> will error)
- <code>minimal</code>/<code>extensive</code> enables agent reactions and sets guidance strength
- Per-account override: '<code>'channels.signal.accounts.'<id>'.actions.reactions'</code>', '<code>'channels.signal.accounts.'<id>'.reactionLevel'</code>'
Delivery Target (CLI/cron)
- DM: <code>signal:+15551234567</code> (or directly write E.164)
- UUID DM: '<code>'uuid:'<id>''</code>' (or bare UUID)
- Group chat: '<code>'signal:group:'<groupId>''</code>'
- Username: '<code>'username:'<name>''</code>' (if your Signal account supports it)
Referencia de Configuración de Signal
Para referencia completa de configuración, ver '<a href="/gateway/configuration">'Configuración'</a>'.
Opciones de canal:
- <code>channels.signal.enabled</code>
- <code>channels.signal.account</code> (E.164 de la cuenta bot)
- <code>channels.signal.cliPath</code>
- <code>channels.signal.httpUrl</code> (URL del daemon)
- <code>channels.signal.httpHost</code>, <code>channels.signal.httpPort</code> (predeterminado 127.0.0.1:8080)
- <code>channels.signal.autoStart</code> (predeterminado true cuando httpUrl no está establecido)
- <code>channels.signal.startupTimeoutMs</code> (espera de inicio, máx 120000)
- <code>channels.signal.receiveMode</code> (<code>on-start | manual</code>)
- <code>channels.signal.ignoreAttachments</code>
- <code>channels.signal.ignoreStories</code>
- <code>channels.signal.sendReadReceipts</code>
- <code>channels.signal.dmPolicy</code> (<code>pairing | allowlist | open | disabled</code>, predeterminado pairing)
- '<code>'channels.signal.allowFrom'</code>' (lista permitida DM: E.164 o '<code>'uuid:'<id>''</code>'; open necesita '<code>'"*"'</code>')
- <code>channels.signal.groupPolicy</code> (predeterminado allowlist)
- <code>channels.signal.groupAllowFrom</code>
- <code>channels.signal.historyLimit</code> (0 para deshabilitar)
- '<code>'channels.signal.dmHistoryLimit'</code>' (límite de historial DM, por turnos de usuario; sobrescribir por usuario '<code>'channels.signal.dms["'<phone_or_uuid>'"].historyLimit'</code>')
- <code>channels.signal.textChunkLimit</code>
- <code>channels.signal.chunkMode</code>
- <code>channels.signal.mediaMaxMb</code>
Opciones globales relacionadas:
- <code>agents.list[].groupChat.mentionPatterns</code> (Signal no tiene menciones nativas)
- <code>messages.groupChat.mentionPatterns</code>
- <code>messages.responsePrefix</code>