Signal
signal-cli サブプロセス経由のプライバシー重視アラート。SDK 不要、Meta 不要、サードパーティ中継なし。
🟢 実行環境対応済み : Signal には HTTP API がないため、Minara はローカルの
signal-cliをシェルアウトで呼び出します。 送信専用です。Signal のプロトコルはメッセージ編集に対応していないため、 ヘルパーは token をバッファリングし、完了時に一括送信します。
できること
- 自分の Signal アカウントによるエンドツーエンド暗号化アラート
- ビジネスアカウント不要、サードパーティ中継なし
- メッセージ 1 件あたり 4,096 文字の上限(ヘルパーのデフォルト値)
channelによるメッセージ単位の送信先上書き。送信が許可された E.164 形式の番号のみ指定できます
事前に必要なもの
signal-cli は Java 製の Signal クライアントで、登録・鍵管理・送信パイプラインを担います。Minara には同梱されていないため、ホストに一度インストールし、電話番号を設定する必要があります。
Minara 起動時にホストの PATH 上に signal-cli が見つからない場合、signal プロバイダーはゲートウェイマップから無音で除外されます(Agent 自体は起動し、他のプロバイダーも引き続き動作します)。これにより、Signal をオプトイン方式にしつつ、他のユーザーの起動フローを壊さない設計になっています。
セットアップ
1. signal-cli のインストール
macOS(Homebrew):
brew install signal-cliLinux / Docker: アップストリームのリポジトリに手順があります。 github.com/AsamK/signal-cli ほとんどのディストリビューションでは Java 17 以上が前提条件です。
インストールの確認:
signal-cli --version2. 送信者番号の登録
既存の Signal アカウントに紐付いていない電話番号を使用してください(Signal アプリからリンクを解除してから使う方法もあります)。
signal-cli -u +15555550100 registerSignal から SMS で確認コードが届きます。次のコマンドで登録を完了します:
signal-cli -u +15555550100 verify 123456一度だけ実行します。 鍵はディスクにキャッシュされるため、以降の送信に使い回せます。
3. シェルからテスト送信(動作確認)
Minara に組み込む前に、signal-cli 単体の動作を確認してください:
signal-cli -u +15555550100 send -m "hello" +15555550200数秒以内に受信者の Signal アプリにメッセージが届くはずです。ここで失敗する場合、Minara では解決できません。まず signal-cli を修正してください。
4. Minara の設定
minara auth messaging add signalまたはプロジェクトルートの .env ファイルに直接記載します:
SIGNAL_CLI_NUMBER=+15555550100
SIGNAL_RECIPIENT=+15555550200
SIGNAL_CLI_BINARY=signal-cli両方の番号は厳密な E.164 形式(先頭に +、国番号、数字のみ、スペースやハイフンなし)で指定してください。Minara は send_message() を呼び出すたびに送信先を再バリデーションするため、不正な上書き値は通過できません。
SIGNAL_CLI_BINARY は省略可能です。デフォルトの PATH 検索以外の場所に signal-cli をインストールした場合は、絶対パスを設定してください。
5. Minara 経由のテスト
minara auth messaging test signalセキュリティ設計 : Signal が異なる扱いを受ける理由
Signal はサブプロセスを起動します。これは CLAUDE.md §4a Bucket B の領域に該当します。apps/agent/src/messaging/signal.ts モジュールが guardCommand / detectJail の対象外となる理由は次のとおりです:
- argv は静的です。
signal-cli -u <number> send -m <body> -- <recipient>の形式で、LLM の入力をフラグに結合することはありません - 電話番号は両方とも、ファクトリ関数の時点(送信者)と送信のたび(受信者)に厳密な E.164 正規表現でバリデーションされます
- メッセージ本文は独立した
-mスロットで渡されるため、コマンド文字列に結合されることはありません - 受信者の前に置かれた
--ターミネーターにより、バリデーション済みの入力に対してもハイフン始まりのフラグインジェクションをブロックします - 子プロセスは
shell: falseで起動するため、特殊文字がシェルで解釈されることはありません
LLM から見える文字列は argv に渡されません。ソースコードを確認すると、モジュールの doc コメントに「Bucket B」アノテーションが記されています。
送信先の上書き
send_message({
provider: "signal",
channel: "+15555559999",
text: "Critical: position liquidation imminent",
})トラブルシューティング
起動時に signal プロバイダーがマウントされない
signal-cliが PATH 上にありません。which signal-cliで確認し、インストールを修正するか、SIGNAL_CLI_BINARYに絶対パスを設定してください- 環境変数が設定されていません。ファクトリ関数がゲートウェイを返すには、
SIGNAL_CLI_NUMBERとSIGNAL_RECIPIENTの両方が空でない必要があります
「Rate limit exceeded (429)」
- Signal には自動送信に対する厳しいレートリミットがあります。大量送信は避け、アラートに間隔を空けるか、複数のイベントを 1 件のメッセージにまとめてください
「Invalid E.164 format」
- 両方の番号は
+<国番号><番号>の形式で、数字のみ指定してください。スペース、ハイフン、括弧は使用できません。Minara は(202) 555-1234を拒否します。+12025551234の形式を使用してください
「Unregistered user」
- 受信者が Signal を使用していないか、アカウントが削除またはリンク解除されています。Signal が認識していない電話番号には送信できません
リファレンス
- 環境変数:
SIGNAL_CLI_NUMBER,SIGNAL_RECIPIENT,SIGNAL_CLI_BINARY - ソース:
apps/agent/src/messaging/signal.ts signal-cliドキュメント: github.com/AsamK/signal-cli