Signal (signal-cli)

状態: 外部CLI統合。ゲートウェイはHTTP JSON-RPC + SSE経由で signal-cli と通信します。

クイックセットアップ (初心者向け)

  1. ボット用に別のSignal番号を使用 (推奨)。
  2. signal-cli をインストール (Java必須)。
  3. ボットデバイスをリンクしてデーモンを起動:
    • signal-cli link -n "OpenClaw"
  4. OpenClawを設定してゲートウェイを起動。

最小限の設定:

{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"]
    }
  }
}

概要

  • signal-cli 経由のSignalチャネル (libsignal埋め込みではない)。
  • 決定論的ルーティング: 返信は常にSignalに戻ります。
  • DMはエージェントのメインセッションを共有。グループは分離 (agent:<agentId>:signal:group:<groupId>)。

設定の書き込み

デフォルトでは、Signalは /config set|unset によってトリガーされる設定更新を許可されています (commands.config: true が必要)。

無効にするには:

{
  channels: { signal: { configWrites: false } }
}

番号モデル (重要)

  • ゲートウェイはSignalデバイス (signal-cli アカウント) に接続します。
  • 個人のSignalアカウントでボットを実行する場合、自分のメッセージは無視されます (ループ保護)。
  • 「ボットにテキストを送ると返信する」には、別のボット番号を使用してください。

セットアップ (高速パス)

  1. signal-cli をインストール (Java必須)。
  2. ボットアカウントをリンク:
    • signal-cli link -n "OpenClaw" してSignalでQRをスキャン。
  3. Signalを設定してゲートウェイを起動。

例:

{
  channels: {
    signal: {
      enabled: true,
      account: "+15551234567",
      cliPath: "signal-cli",
      dmPolicy: "pairing",
      allowFrom: ["+15557654321"]
    }
  }
}

マルチアカウントサポート: アカウントごとの設定とオプションの namechannels.signal.accounts を使用。共有パターンについては gateway/configuration を参照。

外部デーモンモード (httpUrl)

signal-cli を自分で管理したい場合 (JVMコールドスタートが遅い、コンテナ初期化、または共有CPU)、デーモンを別に実行してOpenClawを指定:

{
  channels: {
    signal: {
      httpUrl: "http://127.0.0.1:8080",
      autoStart: false
    }
  }
}

これにより、OpenClaw内の自動起動と起動待機がスキップされます。自動起動時の起動が遅い場合は、channels.signal.startupTimeoutMs を設定してください。

アクセス制御 (DM + グループ)

DM:

  • デフォルト: channels.signal.dmPolicy = "pairing"
  • 未知の送信者はペアリングコードを受け取り、承認されるまでメッセージは無視されます (コードは1時間後に期限切れ)。
  • 承認方法:
    • openclaw pairing list signal
    • openclaw pairing approve signal <CODE>
  • ペアリングはSignal DMのデフォルトトークン交換です。詳細: Pairing
  • UUIDのみの送信者 (sourceUuid から) は uuid:<id> として channels.signal.allowFrom に保存されます。

グループ:

  • channels.signal.groupPolicy = open | allowlist | disabled
  • allowlist が設定されている場合、channels.signal.groupAllowFrom はグループでトリガーできる人を制御します。

仕組み (動作)

  • signal-cli はデーモンとして実行。ゲートウェイはSSE経由でイベントを読み取ります。
  • インバウンドメッセージは共有チャネルエンベロープに正規化されます。
  • 返信は常に同じ番号またはグループにルーティングされます。

メディア + 制限

  • アウトバウンドテキストは channels.signal.textChunkLimit にチャンク化 (デフォルト4000)。
  • オプションの改行チャンク化: channels.signal.chunkMode="newline" を設定して空白行 (段落境界) で分割してから長さチャンク化。
  • 添付ファイル対応 (signal-cli からbase64取得)。
  • デフォルトメディアキャップ: channels.signal.mediaMaxMb (デフォルト8)。
  • メディアのダウンロードをスキップするには channels.signal.ignoreAttachments を使用。
  • グループ履歴コンテキストは channels.signal.historyLimit (または channels.signal.accounts.*.historyLimit) を使用し、messages.groupChat.historyLimit にフォールバック。無効にするには 0 を設定 (デフォルト50)。

タイピング + 既読レシート

  • タイピングインジケーター: OpenClawは signal-cli sendTyping 経由でタイピング信号を送信し、返信実行中に更新します。
  • 既読レシート: channels.signal.sendReadReceipts がtrueの場合、OpenClawは許可されたDMの既読レシートを転送します。
  • Signal-cliはグループの既読レシートを公開しません。

リアクション (メッセージツール)

  • channel=signalmessage action=react を使用。
  • ターゲット: 送信者のE.164またはUUID (ペアリング出力から uuid:<id> を使用。生のUUIDも動作)。
  • messageId はリアクションするメッセージのSignalタイムスタンプです。
  • グループリアクションには targetAuthor または targetAuthorUuid が必要。

例:

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=✅

設定:

  • channels.signal.actions.reactions: リアクションアクションを有効/無効化 (デフォルトtrue)。
  • channels.signal.reactionLevel: off | ack | minimal | extensive
    • off/ack はエージェントリアクションを無効化 (メッセージツール react はエラー)。
    • minimal/extensive はエージェントリアクションを有効化し、ガイダンスレベルを設定。
  • アカウントごとのオーバーライド: channels.signal.accounts.<id>.actions.reactionschannels.signal.accounts.<id>.reactionLevel

配信ターゲット (CLI/cron)

  • DM: signal:+15551234567 (または単純なE.164)。
  • UUID DM: uuid:<id> (または生のUUID)。
  • グループ: signal:group:<groupId>
  • ユーザー名: username:<name> (Signalアカウントでサポートされている場合)。

設定リファレンス (Signal)

完全な設定: Configuration

プロバイダーオプション:

  • channels.signal.enabled: チャネル起動を有効/無効化。
  • channels.signal.account: ボットアカウントのE.164。
  • channels.signal.cliPath: signal-cli へのパス。
  • channels.signal.httpUrl: 完全なデーモンURL (ホスト/ポートを上書き)。
  • channels.signal.httpHostchannels.signal.httpPort: デーモンバインド (デフォルト 127.0.0.1:8080)。
  • channels.signal.autoStart: デーモンを自動起動 (httpUrl が未設定の場合デフォルトtrue)。
  • channels.signal.startupTimeoutMs: 起動待機タイムアウト (ms) (最大120000)。
  • channels.signal.receiveMode: on-start | manual
  • channels.signal.ignoreAttachments: 添付ファイルのダウンロードをスキップ。
  • channels.signal.ignoreStories: デーモンからのストーリーを無視。
  • channels.signal.sendReadReceipts: 既読レシートを転送。
  • channels.signal.dmPolicy: pairing | allowlist | open | disabled (デフォルト: pairing)。
  • channels.signal.allowFrom: DM許可リスト (E.164または uuid:<id>)。open には "*" が必要。Signalにはユーザー名がありません。電話/UUID IDを使用。
  • channels.signal.groupPolicy: open | allowlist | disabled (デフォルト: allowlist)。
  • channels.signal.groupAllowFrom: グループ送信者許可リスト。
  • channels.signal.historyLimit: コンテキストに含める最大グループメッセージ数 (0で無効化)。
  • channels.signal.dmHistoryLimit: ユーザーターンでのDM履歴制限。ユーザーごとのオーバーライド: channels.signal.dms["<phone_or_uuid>"].historyLimit
  • channels.signal.textChunkLimit: アウトバウンドチャンクサイズ (文字数)。
  • channels.signal.chunkMode: length (デフォルト) または newline で空白行 (段落境界) で分割してから長さチャンク化。
  • channels.signal.mediaMaxMb: インバウンド/アウトバウンドメディアキャップ (MB)。

関連グローバルオプション:

  • agents.list[].groupChat.mentionPatterns (Signalはネイティブメンションをサポートしません)。
  • messages.groupChat.mentionPatterns (グローバルフォールバック)。
  • messages.responsePrefix