{
  "title": "RPC adapters",
  "content": "OpenClaw integrates external CLIs via JSON-RPC. Two patterns are used today.\n\n## Pattern A: HTTP daemon (signal-cli)\n\n* `signal-cli` runs as a daemon with JSON-RPC over HTTP.\n* Event stream is SSE (`/api/v1/events`).\n* Health probe: `/api/v1/check`.\n* OpenClaw owns lifecycle when `channels.signal.autoStart=true`.\n\nSee [Signal](/channels/signal) for setup and endpoints.\n\n## Pattern B: stdio child process (legacy: imsg)\n\n> **Note:** For new iMessage setups, use [BlueBubbles](/channels/bluebubbles) instead.\n\n* OpenClaw spawns `imsg rpc` as a child process (legacy iMessage integration).\n* JSON-RPC is line-delimited over stdin/stdout (one JSON object per line).\n* No TCP port, no daemon required.\n\n* `watch.subscribe` → notifications (`method: \"message\"`)\n* `watch.unsubscribe`\n* `send`\n* `chats.list` (probe/diagnostics)\n\nSee [iMessage](/channels/imessage) for legacy setup and addressing (`chat_id` preferred).\n\n## Adapter guidelines\n\n* Gateway owns the process (start/stop tied to provider lifecycle).\n* Keep RPC clients resilient: timeouts, restart on exit.\n* Prefer stable IDs (e.g., `chat_id`) over display strings.",
  "code_samples": [],
  "headings": [
    {
      "level": "h2",
      "text": "Pattern A: HTTP daemon (signal-cli)",
      "id": "pattern-a:-http-daemon-(signal-cli)"
    },
    {
      "level": "h2",
      "text": "Pattern B: stdio child process (legacy: imsg)",
      "id": "pattern-b:-stdio-child-process-(legacy:-imsg)"
    },
    {
      "level": "h2",
      "text": "Adapter guidelines",
      "id": "adapter-guidelines"
    }
  ],
  "url": "llms-txt#rpc-adapters",
  "links": []
}