imsg は何をしますか?
OpenClawエージェントがユーザーのローカルmacOS Messages.appアカウントを通じて動作する必要がある場合にimsgを使用します。iMessage/SMSの履歴を調べ、適切なDMまたはグループを選択し、メッセージやファイルを送信し、返信、リアクション、投票、またはプライベートAPIのiMessage機能を使用します。
Telegram、Signal、WhatsApp、Discord、Slack、または設定済みのチャンネルがすでに返信をルーティングしている現在のOpenClaw会話内で返信する場合は、このスキルを使用しないでください。
エージェントフロー
- 最初に会話を解決します。
- DM、既存のグループ、または新しいグループを選択します。
- 要求されたアクションを実行できる最も低い能力のコマンドを選択します。
- ユーザーが正確な受信者、内容、アクションをすでに指定していない限り、送信または表示状態の変更を確認します。
- 安定した識別子を使用して実行します。通常の送信/監視/履歴には
--chat-idを、ブリッジアクションには--chatチャットGUIDを優先します。
複数のチャットやハンドルが一致する可能性がある場合、カジュアルな名前だけで受信者を推測しないでください。送信前に、一致した表示名、ハンドル、グループ参加者、メッセージテキスト/アクションを表示します。
ホスト要件
- macOS 14以上でMessages.appがログインしていること(送信/リアクション/ブリッジアクション用)。
imsgまたはOpenClawを実行するプロセスコンテキストにフルディスクアクセス権限が必要です。Messages DBにアクセスできないと読み取りに失敗します。- パブリック
sendを使用する場合、Messages.appのオートメーション権限が必要です。 - パブリック
imsg reactを実行するプロセスコンテキストにアクセシビリティ権限が必要です。System Events UIオートメーションを使用します。ブリッジtapbackは代わりにプライベートAPIを使用します。 - オプションで、連絡先名の解決に連絡先権限が必要です。
- SMS送信には、ユーザーのiPhoneからこのMacへのテキストメッセージ転送が必要です。
- Linuxはコピーされた
chat.dbのみ読み取り可能です。送信、リアクション、Messages.appの起動、既読マーク、タイピングはできません。
ターゲットの解決
--json読み取りを使用します。出力は改行区切りのJSONです。jqが利用可能な場合はjq -sを使用するか、各行を1つのオブジェクトとして直接消費します。
imsg chats --limit 25 --json | jq -s
imsg search --query "dinner" --match contains --json | jq -s
imsg history --chat-id 42 --limit 20 --attachments --json | jq -s
imsg group --chat-id 42 --json
ターゲットルール:
- 電話番号/メールアドレスへのDM: ユーザーが正確なハンドルを指定した場合、または単一の明確なチャットが一致した後は、
imsg send --toを使用します。 - 既存のDMスレッド:
imsg send --chat-id <id>は、名前を再解決するよりも安全です。 - 既存のグループ:
imsg group --chat-id <id> --jsonで検査し、--chat-idで送信し、groupからのチャットGUIDでブリッジします。 - 新しいグループ: ユーザーが明示的にグループ作成を依頼した場合、または既存のグループが一致しない場合にのみ
chat-createを使用します。 - あいまいなグループ名: 表示名だけでなく、参加者を確認します。
- SMS: 要求された場合、またはiMessageフォールバックが望ましくない場合にのみ
--service smsを使用します。SMSリレーにはテキストメッセージ転送が必要です。
このスキルではjqを必須の前提条件にしないでください。例で便利なフォーマッタとしてのみ使用されます。
機能の選択
十分な場合はパブリックMessagesオートメーションを使用します:
- 読み取り/リスト/検索/監視:
chats、group、history、search、watch - 基本的なテキスト/ファイル送信:
send - チャット内の最新の受信メッセージへの標準タップバック:
react
パブリックオートメーションでできない機能には、プライベートAPIブリッジのみを使用します:
- リッチ返信、テキスト書式設定、エフェクト、件名、マルチパート送信
- ネイティブApple Messagesの投票と投票
- メッセージGUIDによるタップバックまたはタップバック削除
- 編集、送信取消し、削除、とにかく通知
- 既読レシート、タイピングインジケーター、ブリッジイベント監視
- グループ作成/名前/写真/メンバー/退会/削除/マークアクション
- アカウント、whois、ニックネームチェック
ブリッジアクションの前に、以下を確認します:
imsg status --json
ホストがブリッジアクションをサポートしているが、Messagesがまだ注入されていない場合は、imsg launchを実行する前に確認を求めます。これはMessages.appを強制終了して再起動しブリッジを注入するため、表示状態の変更として扱います:
imsg launch
imsg status --json
SIP、ライブラリ検証、プライベートエンタイトルメントチェック、または欠落しているセレクターがまだ機能をブロックしている場合、ユーザーにカジュアルにSIPを無効にするよう依頼しないでください。要求されたプライベートAPIアクションがこのホストでは利用できないことを説明し、存在する場合は最も近い非ブリッジアクションを提供します。
DMシナリオ
正確なハンドル、基本送信:
imsg send --to "+14155551212" --text "On my way" --service auto
既知のDMスレッド:
imsg send --chat-id 42 --text "On my way"
imsg send --chat-id 42 --file /path/to/photo.jpg
ユーザーが要求した場合のみチャンネルを強制:
imsg send --to "+14155551212" --text "green bubble" --service sms
imsg send --to "+14155551212" --text "iMessage only" --service imessage --no-sms-fallback
スレッド返信、書式設定、エフェクト、または添付ファイル返信:
imsg send-rich --chat 'iMessage;-;+15551234567' \
--reply-to <message-guid> --text "reply text"
imsg send-rich --chat 'iMessage;-;+15551234567' --text 'hello world' \
--format '[{"start":0,"length":5,"styles":["bold"]}]'
imsg send-rich --chat 'iMessage;-;+15551234567' --text "boom" --effect impact
imsg send-attachment --chat 'iMessage;-;+15551234567' \
--reply-to <message-guid> --file /path/to/file.jpg
書式設定の範囲はUTF-16位置です。サポートされるスタイルにはbold、italic、underline、strikethroughがあります。生成されたJSONには--format-fileを使用します。
グループシナリオ
アクションの前に検査:
imsg group --chat-id 42 --json
imsg history --chat-id 42 --limit 20 --json | jq -s
既存のグループに送信:
imsg send --chat-id 42 --text "Works for me"
既存のグループでのブリッジ返信または投票:
imsg send-rich --chat 'iMessage;+;chat0000' \
--reply-to <message-guid> --text "replying in thread"
imsg poll send --chat 'iMessage;+;chat0000' \
--question "Dinner?" --option "Pizza" --option "Sushi"
明示的な要求がある場合のみグループを作成または変更:
imsg chat-create --addresses '+15551111111,+15552222222' --name 'Crew' --text 'gm'
imsg chat-name --chat 'iMessage;+;chat0000' --name 'Renamed'
imsg chat-photo --chat 'iMessage;+;chat0000' --file /path/to/group.jpg
imsg chat-add-member --chat 'iMessage;+;chat0000' --address +15553333333
imsg chat-remove-member --chat 'iMessage;+;chat0000' --address +15553333333
imsg chat-leave --chat 'iMessage;+;chat0000'
imsg chat-delete --chat 'iMessage;+;chat0000'
imsg chat-mark --chat 'iMessage;+;chat0000' --read
グループの変更は非常に目立ちます。メンバーシップ、名前、写真、既読状態の変更、退会、または削除の前に、正確なグループと参加者リストを確認します。
リアクションと返信
パブリックreactは制限されています。チャット内の最新の受信メッセージにのみ反応します。
imsg react --chat-id 42 --reaction like
imsg react --chat-id 42 --reaction love
imsg react --chat-id 42 --reaction dislike
imsg react --chat-id 42 --reaction laugh
imsg react --chat-id 42 --reaction emphasis
imsg react --chat-id 42 --reaction question
特定のメッセージGUIDまたは削除の場合は、ブリッジtapbackを使用します:
imsg tapback --chat 'iMessage;-;+15551234567' --message <message-guid> --kind love
imsg tapback --chat 'iMessage;-;+15551234567' --message <message-guid> --kind love --remove
スレッド返信にはsend-rich --reply-to <message-guid>を使用します。ユーザーが「それ」や「前のもの」と言った場合は、参照されているメッセージを確認します。
投票
ネイティブApple Messagesの投票にはブリッジが必要です。作成には少なくとも2つの--option値が必要です。投票には--option-id、--option-index、または--optionのいずれかが必要です。
メッセージは投票バルーンにオプションのみを表示します。--questionタイトルは受信者に表示されません。--question(必須)と少なくとも2つの--option値を設定します。
imsg poll send --chat 'iMessage;-;+15551234567' \
--question "Dinner?" --option "Pizza" --option "Sushi"
imsg poll send --chat 'iMessage;+;chat0000' --reply-to <message-guid> \
--question "Approve?" --option "Yes" --option "No"
imsg poll vote --chat 'iMessage;+;chat0000' \
--poll <poll-message-guid> --option-id <option-id>
投票IDとオプションは以下で確認します:
imsg history --chat-id 42 --limit 20 --json | jq -s '.[] | select(.poll != null) | {guid, poll}'
投票行はpollイベントであり、タップバックではありません。それらを表示するためにwatch --reactionsは必要ありません。
監視と長時間実行エージェント
短い1回限りの待機にはwatchを使用します:
imsg watch --chat-id 42 --since-rowid 9000 --json
imsg watch --chat-id 42 --attachments --convert-attachments --json
imsg watch --chat-id 42 --reactions --json
imsg watch --chat-id 42 --bb-events --json
--since-rowidは排他的です。指定しない場合、watchは最新の行から開始します。watchはファイルシステムイベントと低頻度のポーリングフォールバックを使用するため、見逃したSQLiteサイドカーイベントを追いつくことができます。ポーリングオブジェクトは--reactionsなしで表示されます。
デーモンまたはマルチチャット統合にはimsg rpcを使用します。これはstdin/stdoutでJSON-RPC 2.0を話します。新しいブリッジまたはポーリングメソッドを使用する前に、imsg status --jsonでrpc_methodsを確認します。
安全ルール
- ユーザーのリクエストにすでに正確な値が含まれている場合を除き、すべての送信前に受信者、チャット、および内容を確認します。
- 表示状態の変更を確認します: 既読レシート、タイピングインジケーター、編集、送信取消し、削除、投票、タップバック、グループメンバーシップ、グループ名/写真、チャットの退会/削除。
- 不明な番号やあいまいな連絡先名の一致に承認なしで送信しないでください。
- 添付ファイルが存在し、意図されたファイルであることを確認します。
- E.164電話番号を優先します。ローカル形式が必要な場合にのみ
--region USなどのリージョンを使用します。 - 利用可能だからといってブリッジアクションを使用しないでください。要求された動作に必要な場合にのみ使用します。