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

# Signal

# 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:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"],
    },
  },
}
```

Maydonlar bo‘yicha ma’lumot:

| Maydon      | Tavsif                                                                            |
| ----------- | --------------------------------------------------------------------------------- |
| `account`   | Bot telefon raqami E.164 formatida (`+15551234567`)                               |
| `cliPath`   | `signal-cli` ga yo‘l (`PATH` da bo‘lsa `signal-cli`)                              |
| `dmPolicy`  | DM kirish siyosati (`pairing` tavsiya etiladi)                                    |
| `allowFrom` | DM 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:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  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:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  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`](/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts) 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:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
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.

3. Raqamni ro‘yxatdan o‘tkazing va tasdiqlang:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
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):

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
signal-cli -a +<BOT_PHONE_NUMBER> register --captcha '<SIGNALCAPTCHA_URL>'
signal-cli -a +<BOT_PHONE_NUMBER> verify <VERIFICATION_CODE>
```

4. OpenClaw’ni sozlang, gateway’ni qayta ishga tushiring, kanalni tekshiring:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
# Agar gateway’ni user systemd xizmati sifatida ishga tushirsangiz:
systemctl --user restart openclaw-gateway

# So‘ng tekshiring:
openclaw doctor
openclaw channels status --probe
```

5. 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:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  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](/channels/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:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
```

Then confirm DM pairing state if needed:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
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

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
Xavfsizlik eslatmalari
```

For triage flow: [/channels/troubleshooting](/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](/gateway/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`.
