Asosiy tarkibga o'tish

Signal (signal-cli)

Status: external CLI integration. Gateway talks to signal-cli over HTTP JSON-RPC + SSE.

Talablar

  • Serveringizda OpenClaw o‘rnatilgan (quyidagi Linux jarayoni Ubuntu 24 da sinovdan o‘tkazilgan).
  • Install signal-cli (Java required).
  • Link the bot device and start the daemon:
  • Configure OpenClaw and start the gateway.

Quick setup (beginner)

  1. Use a separate Signal number for the bot (recommended).
  2. Agar JVM build’dan foydalansangiz, signal-cli ni o‘rnating (Java talab qilinadi).
  3. O‘rnatish yo‘llaridan birini tanlang:
    • A yo‘l (QR havola): signal-cli link -n "OpenClaw" va Signal orqali skaner qiling.
    • B yo‘l (SMS ro‘yxatdan o‘tish): captcha + SMS tasdiqlash bilan alohida raqamni ro‘yxatdan o‘tkazing.
  4. OpenClaw’ni sozlang va gateway’ni qayta ishga tushiring.
  5. Birinchi DM yuboring va juftlashni tasdiqlang (openclaw pairing approve signal <CODE>).
Minimal config:
{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"],
    },
  },
}
Maydonlar bo‘yicha ma’lumot:
MaydonTavsif
accountBot telefon raqami E.164 formatida (+15551234567)
cliPathsignal-cli ga yo‘l (PATH da bo‘lsa signal-cli)
dmPolicyDM kirish siyosati (pairing tavsiya etiladi)
allowFromDM yuborishga ruxsat berilgan telefon raqamlari yoki uuid:&lt;id&gt; qiymatlari

What it is

  • Signal channel via signal-cli (not embedded libsignal).
  • Deterministic routing: replies always go back to Signal.
  • DMs share the agent’s main session; groups are isolated (agent:<agentId>:signal:group:<groupId>).

Config writes

By default, Signal is allowed to write config updates triggered by /config set|unset (requires commands.config: true). Disable with:
{
  channels: { signal: { configWrites: false } },
}

The number model (important)

  • The gateway connects to a Signal device (the signal-cli account).
  • If you run the bot on your personal Signal account, it will ignore your own messages (loop protection).
  • For “I text the bot and it replies,” use a separate bot number.

A yo‘lni sozlash: mavjud Signal akkauntini ulash (QR)

  1. signal-cli ni o‘rnating (JVM yoki native build).
  2. Link a bot account:
    • signal-cli link -n "OpenClaw" then scan the QR in Signal.
  3. Configure Signal and start the gateway.
Example:
{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"],
    },
  },
}
Multi-account support: use channels.signal.accounts with per-account config and optional name. See gateway/configuration for the shared pattern.

B yo‘lni sozlash: alohida bot raqamini ro‘yxatdan o‘tkazish (SMS, Linux)

Mavjud Signal ilova akkauntini ulash o‘rniga alohida bot raqamidan foydalanmoqchi bo‘lsangiz, shundan foydalaning.
  1. SMS qabul qila oladigan raqam oling (yoki statsionar telefonlar uchun ovozli tasdiqlash).
    • Akkaunt/sessiya ziddiyatlarining oldini olish uchun alohida bot raqamidan foydalaning.
  2. Gateway hostida signal-cli ni o‘rnating:
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} https://github.com/AsamK/signal-cli/releases/latest | sed -e 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}-Linux-native.tar.gz"
sudo tar xf "signal-cli-${VERSION}-Linux-native.tar.gz" -C /opt
sudo ln -sf /opt/signal-cli /usr/local/bin/
signal-cli --version
Agar JVM build’dan (signal-cli-${VERSION}.tar.gz) foydalansangiz, avval JRE 25+ ni o‘rnating. signal-cli ni yangilab turing; upstream ma’lumotiga ko‘ra, Signal server API’lari o‘zgarganda eski relizlar ishlamay qolishi mumkin.
  1. Raqamni ro‘yxatdan o‘tkazing va tasdiqlang:
signal-cli -a +<BOT_PHONE_NUMBER> register
Agar captcha talab qilinsa:
  1. https://signalcaptchas.org/registration/generate.html ni oching.
  2. Captcha’ni yakunlang, “Open Signal” dan signalcaptcha://... havola manzilini nusxa ko‘chiring.
  3. Imkon qadar brauzer sessiyasi bilan bir xil tashqi IP manzildan ishga tushiring.
  4. Ro‘yxatdan o‘tishni darhol yana ishga tushiring (captcha tokenlari tezda muddati tugaydi):
signal-cli -a +<BOT_PHONE_NUMBER> register --captcha '<SIGNALCAPTCHA_URL>'
signal-cli -a +<BOT_PHONE_NUMBER> verify <VERIFICATION_CODE>
  1. OpenClaw’ni sozlang, gateway’ni qayta ishga tushiring, kanalni tekshiring:
# Agar gateway’ni user systemd xizmati sifatida ishga tushirsangiz:
systemctl --user restart openclaw-gateway

# So‘ng tekshiring:
openclaw doctor
openclaw channels status --probe
  1. DM yuboruvchingizni juftlang:
    • Bot raqamiga istalgan xabarni yuboring.
    • Serverda kodni tasdiqlang: openclaw pairing approve signal <PAIRING_CODE>.
    • “Unknown contact” chiqmasligi uchun bot raqamini telefoningizda kontakt sifatida saqlang.
Muhim: signal-cli bilan telefon raqamini ro‘yxatdan o‘tkazish ushbu raqam uchun asosiy Signal ilovasi sessiyasini de-autentifikatsiya qilishi mumkin. Alohida bot raqamini afzal ko‘ring yoki mavjud telefon ilovasi sozlamalarini saqlab qolish kerak bo‘lsa, QR link rejimidan foydalaning. Asosiy manbalar:
  • signal-cli README: https://github.com/AsamK/signal-cli
  • Captcha jarayoni: https://github.com/AsamK/signal-cli/wiki/Registration-with-captcha
  • Ulash jarayoni: https://github.com/AsamK/signal-cli/wiki/Linking-other-devices-(Provisioning)

External daemon mode (httpUrl)

If you want to manage signal-cli yourself (slow JVM cold starts, container init, or shared CPUs), run the daemon separately and point OpenClaw at it:
{
  channels: {
    signal: {
      httpUrl: "http://127.0.0.1:8080",
      autoStart: false,
    },
  },
}
This skips auto-spawn and the startup wait inside OpenClaw. For slow starts when auto-spawning, set channels.signal.startupTimeoutMs.

Access control (DMs + groups)

DMs:
  • Default: channels.signal.dmPolicy = "pairing".
  • Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour).
  • Approve via:
    • openclaw pairing list signal
    • openclaw pairing approve signal <CODE>
  • Pairing is the default token exchange for Signal DMs. Details: Pairing
  • UUID-only senders (from sourceUuid) are stored as uuid:<id> in channels.signal.allowFrom.
Groups:
  • channels.signal.groupPolicy = open | allowlist | disabled.
  • channels.signal.groupAllowFrom controls who can trigger in groups when allowlist is set.

How it works (behavior)

  • signal-cli runs as a daemon; the gateway reads events via SSE.
  • Inbound messages are normalized into the shared channel envelope.
  • Replies always route back to the same number or group.

Media + limits

  • Outbound text is chunked to channels.signal.textChunkLimit (default 4000).
  • Optional newline chunking: set channels.signal.chunkMode="newline" to split on blank lines (paragraph boundaries) before length chunking.
  • Attachments supported (base64 fetched from signal-cli).
  • Default media cap: channels.signal.mediaMaxMb (default 8).
  • Use channels.signal.ignoreAttachments to skip downloading media.
  • Group history context uses channels.signal.historyLimit (or channels.signal.accounts.*.historyLimit), falling back to messages.groupChat.historyLimit. Set 0 to disable (default 50).

Typing + read receipts

  • Typing indicators: OpenClaw sends typing signals via signal-cli sendTyping and refreshes them while a reply is running.
  • Read receipts: when channels.signal.sendReadReceipts is true, OpenClaw forwards read receipts for allowed DMs.
  • Signal-cli does not expose read receipts for groups.

Reactions (message tool)

  • Use message action=react with channel=signal.
  • Targets: sender E.164 or UUID (use uuid:<id> from pairing output; bare UUID works too).
  • messageId is the Signal timestamp for the message you’re reacting to.
  • Group reactions require targetAuthor or targetAuthorUuid.
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:
  • channels.signal.actions.reactions: enable/disable reaction actions (default true).
  • channels.signal.reactionLevel: off | ack | minimal | extensive.
    • off/ack disables agent reactions (message tool react will error).
    • minimal/extensive enables agent reactions and sets the guidance level.
  • Per-account overrides: channels.signal.accounts.<id>.actions.reactions, channels.signal.accounts.<id>.reactionLevel.

Delivery targets (CLI/cron)

  • DMs: signal:+15551234567 (or plain E.164).
  • UUID DMs: uuid:<id> (or bare UUID).
  • Groups: signal:group:<groupId>.
  • Usernames: username:<name> (if supported by your Signal account).

Troubleshooting

Run this ladder first:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
Then confirm DM pairing state if needed:
openclaw pairing list signal
Common failures:
  • Daemon reachable but no replies: verify account/daemon settings (httpUrl, account) and receive mode.
  • DMs ignored: sender is pending pairing approval.
  • Group messages ignored: group sender/mention gating blocks delivery.
  • Tahrirlardan keyin konfiguratsiya tekshiruvi xatolari: openclaw doctor --fix ni ishga tushiring.
  • Diagnostikada Signal ko‘rinmasa: channels.signal.enabled: true ni tasdiqlang.
Qo‘shimcha tekshiruvlar:openclaw pairing list signal pgrep -af signal-cli grep -i “signal” “/tmp/openclaw/openclaw-$(date +%Y-%m-%d).log” | tail -20
Xavfsizlik eslatmalari
For triage flow: /channels/troubleshooting.

signal-cli hisob kalitlarini lokal saqlaydi (odatda ~/.local/share/signal-cli/data/).

  • Serverni migratsiya qilish yoki qayta yig‘ishdan oldin Signal hisob holatini zaxiralang.
  • Kengroq DM kirishini aniq xohlamasangiz, channels.signal.dmPolicy: "pairing" ni saqlang.
  • SMS tasdiqlash faqat ro‘yxatdan o‘tish yoki tiklash jarayonlari uchun kerak, ammo raqam/hisob ustidan nazoratni yo‘qotish qayta ro‘yxatdan o‘tishni murakkablashtirishi mumkin.
  • Slack’ni sozlash yoki Slack socket/HTTP rejimini nosozliklarini tuzatish

Configuration reference (Signal)

Full configuration: Configuration Provider options:
  • channels.signal.enabled: enable/disable channel startup.
  • channels.signal.account: E.164 for the bot account.
  • channels.signal.cliPath: path to signal-cli.
  • channels.signal.httpUrl: full daemon URL (overrides host/port).
  • channels.signal.httpHost, channels.signal.httpPort: daemon bind (default 127.0.0.1:8080).
  • channels.signal.autoStart: auto-spawn daemon (default true if httpUrl unset).
  • channels.signal.startupTimeoutMs: startup wait timeout in ms (cap 120000).
  • channels.signal.receiveMode: on-start | manual.
  • channels.signal.ignoreAttachments: skip attachment downloads.
  • channels.signal.ignoreStories: ignore stories from the daemon.
  • channels.signal.sendReadReceipts: forward read receipts.
  • channels.signal.dmPolicy: pairing | allowlist | open | disabled (default: pairing).
  • channels.signal.allowFrom: DM allowlist (E.164 or uuid:<id>). open requires "*". Signal has no usernames; use phone/UUID ids.
  • channels.signal.groupPolicy: open | allowlist | disabled (default: allowlist).
  • channels.signal.groupAllowFrom: group sender allowlist.
  • channels.signal.historyLimit: max group messages to include as context (0 disables).
  • channels.signal.dmHistoryLimit: foydalanuvchi navbatlari bo‘yicha DM tarix cheklovi. Har bir foydalanuvchi uchun alohida sozlamalar: channels.signal.dms["<phone_or_uuid>"].historyLimit.
  • channels.signal.textChunkLimit: chiqish bo‘lak hajmi (belgilar soni).
  • channels.signal.chunkMode: length (standart) yoki uzunlik bo‘yicha bo‘lishdan oldin bo‘sh qatorlar (paragraf chegaralari) bo‘yicha ajratish uchun newline.
  • channels.signal.mediaMaxMb: kiruvchi/chiqish media uchun maksimal hajm (MB).
Bog‘liq global sozlamalar:
  • agents.list[].groupChat.mentionPatterns (Signal mahalliy mentionlarni qo‘llab-quvvatlamaydi).
  • messages.groupChat.mentionPatterns (global zaxira variant).
  • messages.responsePrefix.