Mainstream messaging

iMessage

स्थिति: नेटिव बाहरी CLI एकीकरण। Gateway imsg rpc को शुरू करता है और stdio पर JSON-RPC के माध्यम से संचार करता है — कोई अलग डेमन या पोर्ट नहीं। पूर्ण iMessage चैनल के लिए निजी API मोड का पुरज़ोर सुझाव दिया जाता है; उत्तरों, टैपबैक, प्रभावों, पोल, अटैचमेंट उत्तरों और समूह क्रियाओं के लिए imsg launch और सफल निजी API जाँच आवश्यक हैं।

सामान्य स्थानीय सेटअप के लिए, OpenClaw सेटअप साइन-इन किए हुए Messages Mac पर imsg को उपयोगकर्ता की पुष्टि के बाद Homebrew के माध्यम से इंस्टॉल या अपडेट करने का विकल्प दे सकता है। मैन्युअल सेटअप और SSH-रैपर टोपोलॉजी का प्रबंधन ऑपरेटर के पास रहता है: imsg को उसी उपयोगकर्ता संदर्भ में इंस्टॉल या अपडेट करें जिसमें Gateway या रैपर चलेगा।

त्वरित सेटअप

स्थानीय Mac (त्वरित पथ)

  • imsg इंस्टॉल और सत्यापित करें

    bash
    brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg rpc --helpimsg launchopenclaw channels status --probe

    जब स्थानीय सेटअप विज़ार्ड अनुपलब्ध डिफ़ॉल्ट imsg कमांड का पता लगाता है, तो वह Homebrew के माध्यम से steipete/tap/imsg इंस्टॉल करने के लिए संकेत दे सकता है। यदि उसे Homebrew द्वारा प्रबंधित imsg मिलता है, तो वह उसे फिर से इंस्टॉल या अपडेट करने के लिए संकेत दे सकता है। कस्टम cliPath रैपर संशोधित नहीं किए जाते।

  • OpenClaw कॉन्फ़िगर करें

    json5
    {channels: {imessage: {enabled: true,cliPath: "/usr/local/bin/imsg",dbPath: "/Users/user/Library/Messages/chat.db",},},}
  • Gateway शुरू करें

    bash
    openclaw gateway
  • पहली DM पेयरिंग स्वीकृत करें (डिफ़ॉल्ट dmPolicy)

    bash
    openclaw pairing list imessageopenclaw pairing approve imessage <CODE>

    पेयरिंग अनुरोध 1 घंटे बाद समाप्त हो जाते हैं।

  • SSH के माध्यम से रिमोट Mac

    अधिकांश सेटअप में SSH की आवश्यकता नहीं होती। इस टोपोलॉजी का उपयोग केवल तभी करें जब Gateway साइन-इन किए हुए Messages Mac पर नहीं चल सकता। OpenClaw को केवल stdio-संगत cliPath चाहिए, इसलिए आप cliPath को ऐसी रैपर स्क्रिप्ट की ओर इंगित कर सकते हैं जो रिमोट Mac में SSH करती है और imsg चलाती है। imsg को Gateway होस्ट पर नहीं, बल्कि उस रिमोट Mac पर इंस्टॉल और अपडेट करें:

    bash
    ssh messages-mac 'brew install steipete/tap/imsg && brew update && brew upgrade imsg'
    bash
    #!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"

    अटैचमेंट सक्षम होने पर सुझाया गया कॉन्फ़िगरेशन:

    json5
    {channels: {imessage: {  enabled: true,  cliPath: "~/.openclaw/scripts/imsg-ssh",  remoteHost: "user@gateway-host", // SCP अटैचमेंट प्राप्त करने के लिए उपयोग होता है  includeAttachments: true,  // वैकल्पिक: अतिरिक्त अनुमत अटैचमेंट रूट (डिफ़ॉल्ट  // /Users/*/Library/Messages/Attachments के साथ मर्ज किए जाते हैं)।  attachmentRoots: ["/Users/*/Library/Messages/Attachments"],  remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],},},}

    यदि remoteHost सेट नहीं है, तो OpenClaw SSH रैपर स्क्रिप्ट को पार्स करके इसका स्वतः पता लगाने का प्रयास करता है। remoteHost को host या user@host होना चाहिए (कोई स्पेस या SSH विकल्प नहीं); असुरक्षित मानों को अनदेखा किया जाता है। OpenClaw SCP के लिए सख्त होस्ट-कुंजी जाँच का उपयोग करता है, इसलिए रिले होस्ट कुंजी पहले से ~/.ssh/known_hosts में मौजूद होनी चाहिए। अटैचमेंट पथों को अनुमत रूट (attachmentRoots / remoteAttachmentRoots) के विरुद्ध सत्यापित किया जाता है।

    आवश्यकताएँ और अनुमतियाँ (macOS)

    • imsg चलाने वाले Mac पर Messages में साइन-इन होना चाहिए।
    • OpenClaw/imsg चलाने वाले प्रक्रिया संदर्भ के लिए पूर्ण डिस्क एक्सेस आवश्यक है (Messages DB एक्सेस)।
    • Messages.app के माध्यम से संदेश भेजने के लिए ऑटोमेशन अनुमति आवश्यक है।
    • उन्नत क्रियाओं (प्रतिक्रिया / संपादन / भेजना रद्द करना / थ्रेडेड उत्तर / प्रभाव / पोल / समूह संचालन) के लिए System Integrity Protection अक्षम होना चाहिए — imsg निजी API सक्षम करना देखें। इसके बिना सामान्य टेक्स्ट और मीडिया भेजना/प्राप्त करना काम करता है।
    SSH रैपर से भेजना AppleEvents -1743 के कारण विफल होता है

    रिमोट-SSH सेटअप चैट पढ़ सकता है, channels status --probe पास कर सकता है और इनबाउंड संदेश संसाधित कर सकता है, जबकि आउटबाउंड संदेश भेजना AppleEvents प्राधिकरण त्रुटि के कारण फिर भी विफल हो सकता है:

    text
    Messages को Apple events भेजने के लिए अधिकृत नहीं है। (-1743)

    साइन-इन किए हुए Mac उपयोगकर्ता का TCC डेटाबेस या System Settings > Privacy & Security > Automation जाँचें। यदि ऑटोमेशन प्रविष्टि imsg या स्थानीय शेल प्रक्रिया के बजाय /usr/libexec/sshd-keygen-wrapper के लिए दर्ज है, तो macOS उस SSH सर्वर-साइड क्लाइंट के लिए उपयोग योग्य Messages टॉगल उपलब्ध नहीं करा सकता:

    text
    kTCCServiceAppleEvents | /usr/libexec/sshd-keygen-wrapper | auth_value=0 | com.apple.MobileSMS

    इस स्थिति में, tccutil reset AppleEvents को दोहराना या उसी SSH रैपर के माध्यम से imsg send को फिर से चलाना लगातार विफल हो सकता है, क्योंकि Messages ऑटोमेशन की आवश्यकता वाला प्रक्रिया संदर्भ SSH रैपर है, न कि ऐसा ऐप जिसे UI अनुमति दे सके।

    इसके बजाय समर्थित imsg प्रक्रिया संदर्भों में से किसी एक का उपयोग करें:

    • Gateway या कम-से-कम imsg ब्रिज को लॉग-इन किए हुए Messages उपयोगकर्ता के स्थानीय सत्र में चलाएँ।
    • उसी सत्र से पूर्ण डिस्क एक्सेस और ऑटोमेशन देने के बाद उस उपयोगकर्ता के लिए LaunchAgent के साथ Gateway शुरू करें।
    • यदि आप दो-उपयोगकर्ता SSH टोपोलॉजी रखते हैं, तो चैनल सक्षम करने से पहले सत्यापित करें कि वास्तविक आउटबाउंड imsg send ठीक उसी रैपर के माध्यम से सफल होता है। यदि उसे ऑटोमेशन नहीं दिया जा सकता, तो संदेश भेजने के लिए SSH रैपर पर निर्भर रहने के बजाय एकल-उपयोगकर्ता imsg सेटअप में पुनः कॉन्फ़िगर करें।

    imsg निजी API सक्षम करना

    imsg दो परिचालन मोड में उपलब्ध होता है। OpenClaw के लिए निजी API मोड सुझाया गया सेटअप है, क्योंकि यह चैनल को वे नेटिव iMessage क्रियाएँ देता है जिनकी उपयोगकर्ता अपेक्षा करते हैं। सामान्य मोड कम जोखिम वाले इंस्टॉल, प्रारंभिक सत्यापन या ऐसे होस्ट के लिए उपयोगी बना रहता है जहाँ SIP अक्षम नहीं किया जा सकता।

    • सामान्य मोड (डिफ़ॉल्ट, SIP में बदलाव आवश्यक नहीं): send के माध्यम से आउटबाउंड टेक्स्ट और मीडिया, इनबाउंड निगरानी/इतिहास और चैट सूची। नया brew install steipete/tap/imsg और ऊपर दी गई मानक macOS अनुमतियाँ उपयोग करने पर यह सुविधा तुरंत उपलब्ध होती है।
    • निजी API मोड: imsg, आंतरिक IMCore फ़ंक्शन कॉल करने के लिए Messages.app में एक सहायक dylib इंजेक्ट करता है। इससे react, edit, unsend, reply (थ्रेडेड), sendWithEffect, poll और poll-vote (नेटिव Messages पोल), renameGroup, setGroupIcon, addParticipant, removeParticipant, leaveGroup, साथ ही टाइपिंग संकेतक और पढ़ने की रसीदें उपलब्ध होती हैं।

    इस पृष्ठ पर सुझाई गई क्रिया सुविधाओं के लिए निजी API मोड आवश्यक है। imsg README आवश्यकता को स्पष्ट रूप से बताता है:

    read, typing, launch, ब्रिज-समर्थित रिच सेंड, संदेश परिवर्तन और चैट प्रबंधन जैसी उन्नत सुविधाएँ वैकल्पिक हैं। इनके लिए SIP को अक्षम करना और Messages.app में सहायक dylib इंजेक्ट करना आवश्यक है। SIP सक्षम होने पर imsg launch इंजेक्ट करने से इनकार करता है।

    सहायक-इंजेक्शन तकनीक Messages के निजी API तक पहुँचने के लिए imsg के अपने dylib का उपयोग करती है। OpenClaw iMessage पथ में कोई तृतीय-पक्ष सर्वर या BlueBubbles रनटाइम नहीं है।

    सेटअप

    1. Messages.app चलाने वाले Mac पर imsg इंस्टॉल (या अपग्रेड) करें:

      bash
      brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg status --json

      imsg status --json आउटपुट bridge_version, rpc_methods और प्रत्येक विधि के selectors की रिपोर्ट देता है, ताकि शुरू करने से पहले आप देख सकें कि मौजूदा बिल्ड किन सुविधाओं का समर्थन करता है।

    2. सिस्टम इंटेग्रिटी प्रोटेक्शन और (आधुनिक macOS पर) लाइब्रेरी वैलिडेशन अक्षम करें। Apple द्वारा हस्ताक्षरित Messages.app में किसी गैर-Apple सहायक dylib को इंजेक्ट करने के लिए SIP बंद होना और लाइब्रेरी वैलिडेशन शिथिल होना आवश्यक है। रिकवरी-मोड SIP चरण macOS संस्करण के अनुसार अलग है:

      • macOS 10.13-10.15 (Sierra-Catalina): Terminal के माध्यम से लाइब्रेरी वैलिडेशन अक्षम करें, रिकवरी मोड में रीबूट करें, csrutil disable चलाएँ, फिर पुनः आरंभ करें।
      • macOS 11+ (Big Sur और बाद के संस्करण), Intel: रिकवरी मोड (या इंटरनेट रिकवरी), csrutil disable, फिर पुनः आरंभ करें।
      • macOS 11+, Apple Silicon: रिकवरी में प्रवेश करने के लिए पावर-बटन स्टार्टअप क्रम का उपयोग करें; हाल के macOS संस्करणों पर Continue क्लिक करते समय Left Shift कुंजी दबाए रखें, फिर csrutil disable। वर्चुअल-मशीन सेटअप के लिए अलग प्रवाह होता है, इसलिए पहले VM स्नैपशॉट लें।

      macOS 11 और बाद के संस्करणों पर, केवल csrutil disable आम तौर पर पर्याप्त नहीं होता। Apple अब भी प्लेटफ़ॉर्म बाइनरी के रूप में Messages.app पर लाइब्रेरी वैलिडेशन लागू करता है, इसलिए SIP बंद होने पर भी adhoc-हस्ताक्षरित सहायक अस्वीकार कर दिया जाता है (Library Validation failed: ... platform binary, but mapped file is not)। SIP अक्षम करने के बाद लाइब्रेरी वैलिडेशन भी अक्षम करें और रीबूट करें:

      bash
      sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool true

      macOS 26 (Tahoe), 26.5.1 पर सत्यापित: SIP बंद होने के साथ ऊपर दिया गया DisableLibraryValidation कमांड 26.0 से 26.5.x तक सहायक को इंजेक्ट करने के लिए पर्याप्त है। किसी boot-args की आवश्यकता नहीं है। plist निर्णायक कारक है और Tahoe पर इंजेक्शन विफल होने का सबसे सामान्य छूटा हुआ चरण है:

      • plist के साथ: imsg launch इंजेक्ट करता है और imsg status, advanced_features: true की रिपोर्ट करता है।
      • plist के बिना (SIP बंद होने पर भी): imsg launch, Failed to launch: Timeout waiting for Messages.app to initialize के साथ विफल होता है। AMFI लोड के समय adhoc सहायक को अस्वीकार कर देता है, इसलिए ब्रिज कभी तैयार नहीं होता और लॉन्च का समय समाप्त हो जाता है। Tahoe पर अधिकतर लोगों को यही टाइमआउट दिखाई देता है; इसका समाधान ऊपर दिया गया plist है, कोई अधिक कठोर उपाय नहीं।

      यदि macOS अपग्रेड के बाद imsg launch इंजेक्शन या विशिष्ट selectors false लौटाने लगें, तो इसका सामान्य कारण यही गेट होता है। यह मानने से पहले कि SIP चरण स्वयं विफल हुआ है, अपनी SIP और लाइब्रेरी-वैलिडेशन स्थिति जाँचें। यदि वे सेटिंग सही हैं और ब्रिज फिर भी इंजेक्ट नहीं कर सकता, तो अतिरिक्त सिस्टम-व्यापी सुरक्षा नियंत्रणों को कमजोर करने के बजाय imsg status --json तथा imsg launch आउटपुट एकत्र करें और इसकी रिपोर्ट imsg प्रोजेक्ट को दें।

    3. सहायक इंजेक्ट करें। SIP अक्षम और Messages.app में साइन इन होने पर:

      bash
      imsg launch

      SIP अब भी सक्षम होने पर imsg launch इंजेक्ट करने से इनकार करता है, इसलिए इससे यह भी पुष्टि हो जाती है कि चरण 2 प्रभावी हुआ।

    4. OpenClaw से ब्रिज सत्यापित करें:

      bash
      openclaw channels status --probe

      iMessage प्रविष्टि को works की रिपोर्ट करनी चाहिए और imsg status --json | jq '{rpc_methods, selectors}' को आपके macOS बिल्ड द्वारा उपलब्ध कराई गई क्षमताएँ दिखानी चाहिए। पोल बनाने के लिए selectors.pollPayloadMessage आवश्यक है; मतदान के लिए selectors.pollVoteMessage और poll.vote RPC विधि, दोनों आवश्यक हैं। OpenClaw Plugin केवल कैश की गई जाँच द्वारा समर्थित कार्रवाइयों का विज्ञापन करता है, जबकि खाली कैश आशावादी बना रहता है और पहली डिस्पैच पर जाँच करता है।

    यदि openclaw channels status --probe चैनल को works के रूप में रिपोर्ट करता है, लेकिन विशिष्ट कार्रवाइयाँ डिस्पैच के समय "iMessage <action> requires the imsg private API bridge" त्रुटि देती हैं, तो imsg launch फिर से चलाएँ — सहायक हट सकता है (Messages.app का पुनः आरंभ, OS अपडेट आदि) और कैश की गई available: true स्थिति अगली जाँच द्वारा रीफ़्रेश होने तक कार्रवाइयों का विज्ञापन करती रहेगी।

    जब SIP सक्षम रहता है

    यदि आपके खतरा मॉडल के लिए SIP अक्षम करना स्वीकार्य नहीं है:

    • imsg मूल मोड पर वापस आ जाता है — केवल टेक्स्ट + मीडिया + प्राप्ति।
    • OpenClaw Plugin अब भी टेक्स्ट/मीडिया भेजने और इनबाउंड निगरानी का विज्ञापन करता है; यह कार्रवाई सतह से react, edit, unsend, reply, sendWithEffect और समूह संचालन छिपाता है (प्रति-विधि क्षमता गेट के अनुसार)।
    • आप iMessage कार्यभार के लिए SIP बंद रखकर एक अलग गैर-Apple-Silicon Mac (या समर्पित बॉट Mac) चला सकते हैं और अपने प्राथमिक डिवाइस पर SIP सक्षम रख सकते हैं। नीचे समर्पित बॉट macOS उपयोगकर्ता (अलग iMessage पहचान) देखें।

    अभिगम नियंत्रण और रूटिंग

    DM नीति

    channels.imessage.dmPolicy सीधे संदेशों को नियंत्रित करता है:

    • pairing (डिफ़ॉल्ट)
    • allowlist (कम-से-कम एक allowFrom प्रविष्टि आवश्यक है)
    • open (allowFrom में "*" शामिल होना आवश्यक है)
    • disabled

    अनुमत-सूची फ़ील्ड: channels.imessage.allowFrom

    अनुमत-सूची प्रविष्टियों को प्रेषकों की पहचान करनी चाहिए: हैंडल या स्थिर प्रेषक अभिगम समूह (accessGroup:<name>)। chat_id:*, chat_guid:* या chat_identifier:* जैसे चैट लक्ष्यों के लिए channels.imessage.groupAllowFrom का उपयोग करें; संख्यात्मक chat_id रजिस्ट्री कुंजियों के लिए channels.imessage.groups का उपयोग करें।

    समूह नीति + उल्लेख

    channels.imessage.groupPolicy समूह प्रबंधन को नियंत्रित करता है:

    • allowlist (डिफ़ॉल्ट)
    • open
    • disabled

    समूह प्रेषक अनुमत-सूची: channels.imessage.groupAllowFrom

    groupAllowFrom प्रविष्टियाँ स्थिर प्रेषक अभिगम समूहों (accessGroup:<name>) का भी संदर्भ दे सकती हैं।

    रनटाइम फ़ॉलबैक: यदि groupAllowFrom सेट नहीं है, तो iMessage समूह प्रेषक जाँच allowFrom का उपयोग करती है; जब DM और समूह प्रवेश अलग होने चाहिए, तब groupAllowFrom सेट करें। स्पष्ट रूप से खाली groupAllowFrom: [] फ़ॉलबैक नहीं करता — यह allowlist के अंतर्गत सभी समूह प्रेषकों को अवरुद्ध करता है। रनटाइम टिप्पणी: यदि channels.imessage पूरी तरह अनुपस्थित है, तो रनटाइम groupPolicy="allowlist" पर फ़ॉलबैक करता है और चेतावनी लॉग करता है (भले ही channels.defaults.groupPolicy सेट हो)।

    समूहों के लिए उल्लेख गेटिंग:

    • iMessage में मूल उल्लेख मेटाडेटा नहीं है
    • उल्लेख पहचान regex पैटर्न (agents.entries.*.groupChat.mentionPatterns, फ़ॉलबैक messages.groupChat.mentionPatterns) का उपयोग करती है
    • कोई पैटर्न कॉन्फ़िगर न होने पर उल्लेख गेटिंग लागू नहीं की जा सकती
    • अधिकृत प्रेषकों के नियंत्रण कमांड उल्लेख गेटिंग को बायपास करते हैं

    प्रति-समूह systemPrompt:

    channels.imessage.groups.* के अंतर्गत प्रत्येक प्रविष्टि एक वैकल्पिक systemPrompt स्ट्रिंग स्वीकार करती है, जिसे उस समूह का संदेश संभालने वाले प्रत्येक टर्न पर एजेंट के सिस्टम प्रॉम्प्ट में इंजेक्ट किया जाता है। समाधान channels.whatsapp.groups के अनुरूप है:

    1. समूह-विशिष्ट सिस्टम प्रॉम्प्ट (groups["<chat_id>"].systemPrompt): इसका उपयोग तब किया जाता है जब मैप में विशिष्ट समूह प्रविष्टि मौजूद हो और उसकी systemPrompt कुंजी परिभाषित हो। यदि systemPrompt एक खाली स्ट्रिंग ("") है, तो वाइल्डकार्ड दबा दिया जाता है और उस समूह पर कोई सिस्टम प्रॉम्प्ट लागू नहीं होता।
    2. समूह वाइल्डकार्ड सिस्टम प्रॉम्प्ट (groups["*"].systemPrompt): इसका उपयोग तब किया जाता है जब विशिष्ट समूह प्रविष्टि मैप में पूरी तरह अनुपस्थित हो या मौजूद हो लेकिन कोई systemPrompt कुंजी परिभाषित न करती हो।
    json5
    {  channels: {    imessage: {      groupPolicy: "allowlist",      groupAllowFrom: ["+15555550123"],      groups: {        "*": { systemPrompt: "ब्रिटिश वर्तनी का उपयोग करें।" },        "8421": {          requireMention: true,          systemPrompt: "यह ऑन-कॉल रोटेशन चैट है। उत्तर 3 वाक्यों से छोटे रखें।",        },        "9907": {          // स्पष्ट दमन: वाइल्डकार्ड "ब्रिटिश वर्तनी का उपयोग करें।" यहाँ लागू नहीं होता          systemPrompt: "",        },      },    },  },}

    प्रति-समूह प्रॉम्प्ट केवल समूह संदेशों पर लागू होते हैं — सीधे संदेश अप्रभावित रहते हैं।

    सत्र और नियतात्मक उत्तर

    • DM सीधे रूटिंग का उपयोग करते हैं; समूह, समूह रूटिंग का उपयोग करते हैं।
    • डिफ़ॉल्ट session.dmScope=main के साथ iMessage DM एजेंट के मुख्य सत्र में समाहित हो जाते हैं।
    • समूह सत्र पृथक होते हैं (agent:<agentId>:imessage:group:<chat_id>)।
    • उत्तर मूल चैनल/लक्ष्य मेटाडेटा का उपयोग करके वापस iMessage पर रूट होते हैं।

    समूह-जैसा थ्रेड व्यवहार:

    कुछ बहु-प्रतिभागी iMessage थ्रेड is_group=false के साथ आ सकते हैं। यदि वह chat_id, channels.imessage.groups के अंतर्गत स्पष्ट रूप से कॉन्फ़िगर है, तो OpenClaw उसे समूह ट्रैफ़िक मानता है (समूह गेटिंग + समूह सत्र पृथक्करण)।

    ACP वार्तालाप बाइंडिंग

    iMessage चैट को ACP सत्रों से बाँधा जा सकता है।

    त्वरित ऑपरेटर प्रवाह:

    • DM या अनुमत समूह चैट के भीतर /acp spawn codex --bind here चलाएँ।
    • उसी iMessage वार्तालाप के भविष्य के संदेश उत्पन्न ACP सत्र पर रूट होते हैं।
    • /new और /reset उसी बँधे हुए ACP सत्र को उसी स्थान पर रीसेट करते हैं।
    • /acp close ACP सत्र बंद करता है और बाइंडिंग हटा देता है।

    कॉन्फ़िगर की गई स्थायी बाइंडिंग, type: "acp" और match.channel: "imessage" वाली शीर्ष-स्तरीय bindings[] प्रविष्टियों का उपयोग करती हैं।

    match.peer.id इनमें से किसी का उपयोग कर सकता है:

    • सामान्यीकृत DM हैंडल, जैसे +15555550123 या user@example.com
    • chat_id:<id> (स्थिर समूह बाइंडिंग के लिए अनुशंसित)
    • chat_guid:<guid>
    • chat_identifier:<identifier>

    उदाहरण:

    json5
    {  agents: {    list: [      {        id: "codex",        runtime: {          type: "acp",          acp: { agent: "codex", backend: "acpx", mode: "persistent" },        },      },    ],  },  bindings: [    {      type: "acp",      agentId: "codex",      match: {        channel: "imessage",        accountId: "default",        peer: { kind: "group", id: "chat_id:123" },      },      acp: { label: "codex-group" },    },  ],}

    साझा ACP बाइंडिंग व्यवहार के लिए ACP एजेंट देखें।

    परिनियोजन पैटर्न

    समर्पित बॉट macOS उपयोगकर्ता (अलग iMessage पहचान)

    समर्पित Apple ID और macOS उपयोगकर्ता का उपयोग करें, ताकि बॉट ट्रैफ़िक आपकी व्यक्तिगत Messages प्रोफ़ाइल से पृथक रहे।

    सामान्य प्रवाह:

    1. एक समर्पित macOS उपयोगकर्ता बनाएँ/उसमें साइन इन करें।
    2. उस उपयोगकर्ता में बॉट Apple ID से Messages में साइन इन करें।
    3. उस उपयोगकर्ता में imsg इंस्टॉल करें।
    4. एक SSH रैपर बनाएँ, ताकि OpenClaw उस उपयोगकर्ता संदर्भ में imsg चला सके।
    5. channels.imessage.accounts.<id>.cliPath और .dbPath को उस उपयोगकर्ता प्रोफ़ाइल पर इंगित करें।

    पहली बार चलाने पर उस बॉट उपयोगकर्ता सत्र में GUI अनुमोदन (Automation + Full Disk Access) की आवश्यकता हो सकती है।

    Tailscale के माध्यम से रिमोट Mac (उदाहरण)

    सामान्य टोपोलॉजी:

    • Gateway Linux/VM पर चलता है
    • iMessage + imsg आपके tailnet में मौजूद Mac पर चलता है
    • cliPath रैपर imsg चलाने के लिए SSH का उपयोग करता है
    • remoteHost SCP के माध्यम से अटैचमेंट प्राप्त करना सक्षम करता है

    उदाहरण:

    json5
    {  channels: {    imessage: {      enabled: true,      cliPath: "~/.openclaw/scripts/imsg-ssh",      remoteHost: "bot@mac-mini.tailnet-1234.ts.net",      includeAttachments: true,      dbPath: "/Users/bot/Library/Messages/chat.db",    },  },}
    bash
    #!/usr/bin/env bashexec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"

    SSH कुंजियों का उपयोग करें, ताकि SSH और SCP दोनों गैर-संवादात्मक हों। पहले सुनिश्चित करें कि होस्ट कुंजी विश्वसनीय है (उदाहरण के लिए ssh bot@mac-mini.tailnet-1234.ts.net), ताकि known_hosts भर जाए।

    बहु-अकाउंट पैटर्न

    iMessage, channels.imessage.accounts के अंतर्गत प्रति-अकाउंट कॉन्फ़िगरेशन का समर्थन करता है।

    प्रत्येक अकाउंट cliPath, dbPath, allowFrom, groupPolicy, mediaMaxMb, इतिहास सेटिंग और अटैचमेंट रूट अनुमति-सूचियों जैसे फ़ील्ड को ओवरराइड कर सकता है।

    डायरेक्ट-मैसेज इतिहास

    नई डायरेक्ट-मैसेज सत्रों को उस वार्तालाप के हालिया डिकोड किए गए imsg इतिहास से आरंभ करने के लिए channels.imessage.dmHistoryLimit सेट करें। प्रति-प्रेषक ओवरराइड के लिए channels.imessage.dms["<sender>"].historyLimit का उपयोग करें, जिसमें किसी प्रेषक के लिए इतिहास अक्षम करने हेतु 0 भी शामिल है।

    iMessage DM इतिहास माँग पर imsg से प्राप्त किया जाता है। dmHistoryLimit को सेट न करने से वैश्विक DM इतिहास सीडिंग अक्षम हो जाती है, लेकिन सकारात्मक प्रति-प्रेषक channels.imessage.dms["<sender>"].historyLimit अब भी उस प्रेषक के लिए सीडिंग सक्षम करता है।

    मीडिया, खंडन और डिलीवरी लक्ष्य

    अटैचमेंट और मीडिया
    • इनबाउंड अटैचमेंट अंतर्ग्रहण डिफ़ॉल्ट रूप से बंद है — फ़ोटो, वॉइस मेमो, वीडियो और अन्य अटैचमेंट एजेंट को अग्रेषित करने के लिए channels.imessage.includeAttachments: true सेट करें। इसके अक्षम होने पर, केवल अटैचमेंट वाले iMessage एजेंट तक पहुँचने से पहले हटा दिए जाते हैं और संभव है कि कोई Inbound message लॉग पंक्ति भी उत्पन्न न हो।
    • remoteHost सेट होने पर रिमोट अटैचमेंट पथ SCP के माध्यम से प्राप्त किए जा सकते हैं
    • अटैचमेंट पथों को अनुमत रूट से मेल खाना चाहिए:
      • channels.imessage.attachmentRoots (स्थानीय)
      • channels.imessage.remoteAttachmentRoots (रिमोट SCP मोड)
      • कॉन्फ़िगर किए गए रूट डिफ़ॉल्ट रूट पैटर्न /Users/*/Library/Messages/Attachments का विस्तार करते हैं (मर्ज किए जाते हैं, प्रतिस्थापित नहीं)
    • SCP सख़्त होस्ट-कुंजी जाँच (StrictHostKeyChecking=yes) का उपयोग करता है
    • आउटबाउंड मीडिया आकार के लिए channels.imessage.mediaMaxMb का उपयोग होता है (डिफ़ॉल्ट 16 MB)
    आउटबाउंड टेक्स्ट और खंडन
    • टेक्स्ट खंड सीमा: channels.imessage.textChunkLimit (डिफ़ॉल्ट 4000)
    • खंड मोड: channels.imessage.streaming.chunkMode
      • length (डिफ़ॉल्ट)
      • newline (पहले अनुच्छेद के आधार पर विभाजन)
    • आउटबाउंड markdown का बोल्ड/इटैलिक/अंडरलाइन/स्ट्राइकथ्रू मूल शैलीयुक्त टेक्स्ट में बदला जाता है (macOS 15+ प्राप्तकर्ताओं को शैली दिखाई देती है; पुराने प्राप्तकर्ताओं को मार्कर के बिना सादा टेक्स्ट दिखाई देता है); markdown तालिकाएँ चैनल के markdown तालिका मोड के अनुसार बदली जाती हैं
    • channels.imessage.sendTransport (auto डिफ़ॉल्ट, bridge, applescript) यह चुनता है कि imsg संदेश कैसे डिलीवर करता है
    एड्रेसिंग प्रारूप

    पसंदीदा स्पष्ट लक्ष्य:

    • chat_id:123 (स्थिर रूटिंग के लिए अनुशंसित)
    • chat_guid:...
    • chat_identifier:...

    हैंडल लक्ष्य भी समर्थित हैं:

    • imessage:+1555...
    • sms:+1555...
    • user@example.com
    bash
    imsg chats --limit 20

    निजी API क्रियाएँ

    जब imsg launch चल रहा हो और openclaw channels status --probe, privateApi.available: true रिपोर्ट करे, तब संदेश टूल सामान्य टेक्स्ट भेजने के अतिरिक्त iMessage की मूल क्रियाओं का उपयोग कर सकता है।

    सभी क्रियाएँ डिफ़ॉल्ट रूप से सक्षम हैं; अलग-अलग क्रियाएँ बंद करने के लिए channels.imessage.actions का उपयोग करें:

    json5
    {  channels: {    imessage: {      actions: {        reactions: true,        edit: true,        unsend: true,        reply: true,        sendWithEffect: true,        sendAttachment: true,        renameGroup: true,        setGroupIcon: true,        addParticipant: true,        removeParticipant: true,        leaveGroup: true,        polls: true,      },    },  },}
    उपलब्ध क्रियाएँ
    • प्रतिक्रिया दें: iMessage टैपबैक जोड़ें/हटाएँ (messageId, emoji, remove)। समर्थित टैपबैक प्रेम, पसंद, नापसंद, हँसी, ज़ोर और प्रश्न से मैप होते हैं। इमोजी के बिना हटाने पर सेट किया गया कोई भी टैपबैक साफ़ हो जाता है।
    • जवाब दें: किसी मौजूदा संदेश का थ्रेडेड जवाब भेजें (messageId, text या message, साथ में chatGuid, chatId, chatIdentifier, या to)। अटैचमेंट के साथ जवाब देने के लिए इसके अतिरिक्त ऐसा imsg बिल्ड आवश्यक है, जिसका send-rich, --file का समर्थन करता हो।
    • प्रभाव के साथ भेजें: iMessage प्रभाव के साथ टेक्स्ट भेजें (text या message, effect या effectId)। संक्षिप्त नाम: slam, loud, gentle, invisibleink, confetti, lasers, fireworks, balloon, heart, echo, happybirthday, shootingstar, sparkles, spotlight।
    • संपादित करें: समर्थित macOS/निजी API संस्करणों पर भेजा गया संदेश संपादित करें (messageId, text या newText)। केवल Gateway द्वारा स्वयं भेजे गए संदेश संपादित किए जा सकते हैं।
    • भेजना रद्द करें: समर्थित macOS/निजी API संस्करणों पर भेजा गया संदेश वापस लें (messageId)। केवल Gateway द्वारा स्वयं भेजे गए संदेशों का भेजना रद्द किया जा सकता है।
    • फ़ाइल अपलोड करें: मीडिया/फ़ाइलें भेजें (buffer को base64 के रूप में या हाइड्रेट किया गया media/path/filePath, filename, वैकल्पिक asVoice)। लेगेसी उपनाम: sendAttachment
    • समूह का नाम बदलें, समूह आइकन सेट करें, प्रतिभागी जोड़ें, प्रतिभागी हटाएँ, समूह छोड़ें: जब वर्तमान लक्ष्य कोई समूह वार्तालाप हो, तब समूह चैट प्रबंधित करें। ये होस्ट की Messages पहचान को बदलते हैं, इसलिए इनके लिए स्वामी प्रेषक या operator.admin Gateway क्लाइंट आवश्यक है।
    • मतदान: मूल Apple Messages मतदान बनाएँ (pollQuestion, pollOption को 2 से 12 बार दोहराया गया, साथ में chatGuid, chatId, chatIdentifier, या to)। iOS/iPadOS/macOS 26+ पर प्राप्तकर्ता इसे मूल रूप से देखते हैं और इसमें मतदान करते हैं; पुराने OS संस्करणों को "मतदान भेजा गया" टेक्स्ट फ़ॉलबैक मिलता है। selectors.pollPayloadMessage आवश्यक है।
    • मतदान-वोट: किसी मौजूदा मतदान पर वोट दें (pollId या messageId, साथ में pollOptionIndex, pollOptionId, या pollOptionText में से ठीक एक)। selectors.pollVoteMessage और poll.vote RPC विधि आवश्यक हैं।

    स्वीकार किए गए इनबाउंड मतदान एजेंट के लिए प्रश्न, क्रमांकित विकल्प लेबल, वोट संख्या और poll-vote के लिए आवश्यक मतदान संदेश ID सहित रेंडर किए जाते हैं।

    संदेश ID

    उपलब्ध होने पर इनबाउंड iMessage संदर्भ में छोटे MessageSid मान और पूर्ण संदेश GUID (MessageSidFull) दोनों शामिल होते हैं। छोटे ID हालिया SQLite-समर्थित जवाब कैश के दायरे में होते हैं और उपयोग से पहले वर्तमान चैट के विरुद्ध जाँचे जाते हैं। यदि कोई छोटा ID समाप्त हो जाए, तो उसे प्रदान करने वाले वार्तालाप को लक्ष्य बनाते हुए उसके MessageSidFull के साथ फिर से प्रयास करें। पूर्ण ID वार्तालाप या अकाउंट बाइंडिंग को बायपास नहीं करते, इसलिए किसी अन्य चैट के ID को वर्तमान लक्ष्य के ID से बदलें। वर्तमान वार्तालाप का प्रमाण उपलब्ध न होने पर रिमोट प्रत्यायोजित कॉल पुराने पूर्ण ID अस्वीकार कर सकते हैं।

    क्षमता पहचान

    OpenClaw निजी API क्रियाएँ केवल तभी छिपाता है, जब कैश की गई जाँच स्थिति बताती है कि ब्रिज अनुपलब्ध है। यदि स्थिति अज्ञात है, तो क्रियाएँ दृश्यमान रहती हैं और डिस्पैच आवश्यकता पड़ने पर जाँच करता है, ताकि imsg launch के बाद पहली क्रिया अलग से मैन्युअल स्थिति रीफ़्रेश किए बिना सफल हो सके।

    पठन रसीदें और टाइपिंग

    निजी API ब्रिज चालू होने पर, स्वीकार की गई इनबाउंड चैट को पढ़ा हुआ चिह्नित किया जाता है और टर्न स्वीकार होते ही डायरेक्ट चैट में टाइपिंग बबल दिखाई देता है, जबकि एजेंट संदर्भ तैयार करता और उत्तर जनरेट करता है। पढ़ा हुआ चिह्नित करना अक्षम करने के लिए:

    json5
    {  channels: {    imessage: {      sendReadReceipts: false,    },  },}

    प्रति-विधि क्षमता सूची से पहले के पुराने imsg बिल्ड टाइपिंग/पठन को चुपचाप बंद कर देते हैं; OpenClaw प्रत्येक रीस्टार्ट पर एक बार चेतावनी लॉग करता है, ताकि अनुपस्थित रसीद का कारण पता लगाया जा सके।

    इनबाउंड टैपबैक

    OpenClaw iMessage टैपबैक की सदस्यता लेता है और स्वीकार की गई प्रतिक्रियाओं को सामान्य संदेश टेक्स्ट के बजाय सिस्टम इवेंट के रूप में रूट करता है, इसलिए उपयोगकर्ता टैपबैक सामान्य जवाब लूप ट्रिगर नहीं करता।

    सूचना मोड channels.imessage.reactionNotifications द्वारा नियंत्रित होता है:

    • "own" (डिफ़ॉल्ट): केवल तभी सूचित करें, जब उपयोगकर्ता बॉट द्वारा लिखे संदेशों पर प्रतिक्रिया दें।
    • "all": अधिकृत प्रेषकों से आने वाले सभी इनबाउंड टैपबैक की सूचना दें।
    • "off": इनबाउंड टैपबैक अनदेखा करें।

    प्रति-अकाउंट ओवरराइड channels.imessage.accounts.<id>.reactionNotifications का उपयोग करते हैं।

    अनुमोदन प्रतिक्रियाएँ (👍 / 👎)

    जब approvals.exec.enabled या approvals.plugin.enabled सत्य हो और अनुरोध iMessage पर रूट हो, तब Gateway मूल रूप से अनुमोदन प्रॉम्प्ट डिलीवर करता है और उसे हल करने के लिए टैपबैक स्वीकार करता है:

    • 👍 (पसंद टैपबैक) → allow-once
    • 👎 (नापसंद टैपबैक) → deny
    • allow-always मैन्युअल फ़ॉलबैक बना रहता है: /approve <id> allow-always को सामान्य जवाब के रूप में भेजें।

    प्रतिक्रिया प्रबंधन के लिए प्रतिक्रिया देने वाले उपयोगकर्ता का हैंडल स्पष्ट अनुमोदक होना आवश्यक है। अनुमोदक सूची channels.imessage.allowFrom (या channels.imessage.accounts.<id>.allowFrom) से पढ़ी जाती है; उपयोगकर्ता का फ़ोन नंबर E.164 प्रारूप में या उसका Apple ID ईमेल जोड़ें (chat_id:* जैसे चैट लक्ष्य मान्य अनुमोदक प्रविष्टियाँ नहीं हैं)। वाइल्डकार्ड प्रविष्टि "*" मान्य है, लेकिन यह किसी भी प्रेषक को अनुमोदन की अनुमति देती है; खाली अनुमोदक सूची प्रतिक्रिया शॉर्टकट को पूरी तरह अक्षम कर देती है। प्रतिक्रिया शॉर्टकट जानबूझकर reactionNotifications, dmPolicy, और groupAllowFrom को बायपास करता है, क्योंकि स्पष्ट अनुमोदक अनुमति-सूची ही अनुमोदन समाधान के लिए मायने रखने वाला एकमात्र गेट है।

    /approve टेक्स्ट कमांड का प्राधिकरण उसी सूची का पालन करता है: जब channels.imessage.allowFrom खाली न हो, तब /approve <id> <decision> को उस अनुमोदक सूची के विरुद्ध अधिकृत किया जाता है (व्यापक DM अनुमति-सूची के विरुद्ध नहीं), और DM अनुमति-सूची में अनुमत लेकिन allowFrom में शामिल न होने वाले प्रेषकों को स्पष्ट अस्वीकृति मिलती है। जब allowFrom खाली हो, तब उसी चैट वाला फ़ॉलबैक प्रभावी रहता है और /approve DM अनुमति-सूची द्वारा अनुमत किसी भी व्यक्ति को अधिकृत करता है। अनुमोदन करने वाले प्रत्येक ऑपरेटर को — /approve के माध्यम से या प्रतिक्रियाओं के माध्यम से — allowFrom में जोड़ें।

    ऑपरेटर नोट्स:

    • प्रतिक्रिया बाइंडिंग मेमोरी और Gateway के स्थायी कुंजीबद्ध स्टोर (अनुमोदन की समाप्ति से मेल खाता TTL) दोनों में संग्रहीत होती है, और Gateway टैपबैक के लिए लंबित प्रॉम्प्ट की पोलिंग भी करता है, इसलिए Gateway के पुनः आरंभ होने के कुछ ही समय बाद आने वाला टैपबैक भी अनुमोदन को पूरा कर देता है।
    • ऑपरेटर का अपना is_from_me=true टैपबैक (उदाहरण के लिए, किसी युग्मित Apple डिवाइस से) अनुमोदन को पूरा करता है, जब वह हैंडल स्पष्ट अनुमोदक हो।
    • अनुमोदन प्रॉम्प्ट केवल तभी समूह वार्तालाप में भेजे जाते हैं, जब स्पष्ट अनुमोदक कॉन्फ़िगर किए गए हों; अन्यथा समूह का कोई भी सदस्य अनुमोदन कर सकता है।
    • पुरानी टेक्स्ट-शैली के टैपबैक (बहुत पुराने Apple क्लाइंट से Liked "…" सादा टेक्स्ट) अनुमोदनों को पूरा नहीं कर सकते, क्योंकि उनमें कोई संदेश GUID नहीं होता; प्रतिक्रिया समाधान के लिए वर्तमान macOS / iOS क्लाइंट द्वारा उत्सर्जित संरचित टैपबैक मेटाडेटा आवश्यक है।
    प्रश्न प्रतिक्रियाएँ (1️⃣ / 2️⃣ / 3️⃣ / 4️⃣)

    एक गैर-गोपनीय, एकल-चयन प्रश्न और एक से चार विकल्पों वाले ask_user प्रॉम्प्ट के लिए, OpenClaw क्रमांकित इमोजी विकल्प जोड़ता है। उत्तर देने के लिए डिलीवर किए गए प्रॉम्प्ट पर मेल खाने वाली संख्या से प्रतिक्रिया दें। प्रतिक्रिया में बॉट द्वारा लिखे गए संदेश का स्थिर GUID होना आवश्यक है; इसके बाद OpenClaw Gateway के माध्यम से संख्या को मानक विकल्प से मैप करता है। पुराने या डुप्लिकेट टैप अनदेखे किए जाते हैं।

    बहु-प्रश्न, बहु-चयन और मुक्त-टेक्स्ट प्रॉम्प्ट केवल टेक्स्ट उत्तर तक सीमित रहते हैं। प्रश्न प्रतिक्रियाएँ सामान्य iMessage DM/समूह प्रवेश नियमों का पालन करती हैं। सामान्य reactionNotifications के "off" होने पर भी उन्हें पहचाना जाता है, और इससे असंबंधित प्रतिक्रियाएँ एजेंट इवेंट में नहीं बदलतीं।

    कॉन्फ़िगरेशन लेखन

    iMessage डिफ़ॉल्ट रूप से चैनल द्वारा आरंभ किए गए कॉन्फ़िगरेशन लेखन की अनुमति देता है (commands.config: true होने पर /config set|unset के लिए)।

    अक्षम करें:

    json5
    {  channels: {    imessage: {      configWrites: false,    },  },}

    विभाजित-प्रेषण DM का संयोजन (एक ही रचना में कमांड + URL)

    Apple किसी कमांड और उसके URL पूर्वावलोकन को अलग-अलग भौतिक chat.db पंक्तियों के रूप में संग्रहीत कर सकता है। imsg 0.13.1 और उसके बाद के संस्करण, वॉच, इतिहास या खोज द्वारा संदेश लौटाने से पहले उन पंक्तियों को संयोजित करते हैं, जिससे OpenClaw को चैनल-विशिष्ट DM विलंब जोड़े बिना एक तार्किक इनबाउंड संदेश मिलता है।

    iMessage संयोजन की किसी सेटिंग की आवश्यकता नहीं है। सेवानिवृत्त channels.imessage.coalesceSameSenderDms कुंजी को openclaw doctor --fix द्वारा हटा दिया जाता है। जब आप किसी चैनल पर तेजी से आने वाले टेक्स्ट संदेशों को जानबूझकर बैच करना चाहते हैं, तब सामान्य messages.inbound डिबाउंस उपलब्ध रहता है।

    यदि कमांड-प्लस-URL प्रेषण अलग-अलग एजेंट टर्न के रूप में आते हैं, तो Messages Mac पर imsg अपडेट करें:

    bash
    brew update && brew upgrade imsg

    ब्रिज या Gateway पुनः आरंभ होने के बाद इनबाउंड पुनर्प्राप्ति

    iMessage उन संदेशों को पुनर्प्राप्त करता है जो Gateway बंद रहने के दौरान छूट गए थे, और साथ ही उस पुराने "बैकलॉग बम" को दबाता है जिसे Apple Push पुनर्प्राप्ति के बाद एक साथ भेज सकता है। टिकाऊ इनग्रेस और आयु सीमा पर आधारित डिफ़ॉल्ट व्यवहार हमेशा चालू रहता है।

    • टिकाऊ रीप्ले सुरक्षा। पुनर्प्राप्ति कर्सर को आगे बढ़ाने से पहले, OpenClaw प्रत्येक कच्ची पंक्ति को साझा SQLite इनग्रेस कतार में जर्नल करता है और उसके Apple GUID को इवेंट ID के रूप में उपयोग करता है। पूर्ण हुई पंक्ति लगभग 4 घंटे तक, अधिकतम 10,000 प्रविष्टियों की सीमा के साथ, एक टूम्बस्टोन छोड़ती है, इसलिए समान GUID वाला रीप्ले पुनः आरंभ होने के बाद भी हटा दिया जाता है। लंबित पंक्ति तब तक पुनर्प्राप्ति योग्य रहती है, जब तक डिस्पैच उसे अपना नहीं लेता।
    • डाउनटाइम पुनर्प्राप्ति। स्टार्टअप पर मॉनिटर अंतिम टिकाऊ रूप से स्वीकार की गई chat.db rowid (प्रति-अकाउंट स्थायी कर्सर) को याद रखता है और उसे imsg watch.subscribe को since_rowid के रूप में देता है, ताकि imsg उन पंक्तियों को रीप्ले करे जिन्हें अभी तक जर्नल नहीं किया गया था और फिर लाइव पंक्तियों को टेल करे। क्रैश से पहले जर्नल की गई पंक्तियाँ SQLite से फिर शुरू होती हैं। रीप्ले सबसे हाल की 500 पंक्तियों और अधिकतम ~2 घंटे पुराने संदेशों तक सीमित है, और GUID टूम्बस्टोन पहले से संभाली गई किसी भी चीज़ को हटा देते हैं।
    • पुराने बैकलॉग की आयु सीमा। स्टार्टअप सीमा से ऊपर की पंक्तियाँ वास्तव में लाइव होती हैं; जिस पंक्ति की प्रेषण तिथि उसके आगमन से ~15 मिनट से अधिक पुरानी हो, वह Push-फ्लश बैकलॉग होती है और उसे दबा दिया जाता है। रीप्ले की गई पंक्तियाँ (सीमा पर या उसके नीचे) इसके बजाय व्यापक पुनर्प्राप्ति विंडो का उपयोग करती हैं, जिससे हाल में छूटा संदेश डिलीवर होता है, जबकि बहुत पुराना इतिहास नहीं होता।

    पुनर्प्राप्ति स्थानीय और रिमोट दोनों cliPath सेटअप पर काम करती है, क्योंकि since_rowid रीप्ले उसी imsg RPC कनेक्शन पर चलता है। अंतर विंडो का है: जब Gateway chat.db (स्थानीय) पढ़ सकता है, तो वह स्टार्टअप rowid सीमा को आधार बनाता है, रीप्ले अवधि को सीमित करता है और कुछ घंटे तक पुराने छूटे संदेशों को डिलीवर करता है। रिमोट SSH cliPath पर वह डेटाबेस नहीं पढ़ सकता, इसलिए रीप्ले असीमित होता है और प्रत्येक पंक्ति लाइव आयु सीमा का उपयोग करती है — यह फिर भी हाल में छूटे संदेशों को पुनर्प्राप्त करता है और पुराने बैकलॉग को दबाता है, केवल इसकी लाइव विंडो संकरी होती है। व्यापक पुनर्प्राप्ति विंडो के लिए Gateway को Messages Mac पर चलाएँ।

    ऑपरेटर को दिखाई देने वाला संकेत

    दबाया गया बैकलॉग डिफ़ॉल्ट स्तर पर लॉग किया जाता है, उसे कभी भी चुपचाप नहीं हटाया जाता (recovery फ़्लैग बताता है कि कौन-सी विंडो लागू हुई):

    text
    imessage: पुराना इनबाउंड बैकलॉग दबाया गया account=<id> sent=<iso> recovery=<bool> (आरंभ से &lt;N&gt; दबाए गए)

    माइग्रेशन

    channels.imessage.catchup.* अप्रचलित है — डाउनटाइम पुनर्प्राप्ति स्वचालित है और नए सेटअप के लिए किसी कॉन्फ़िगरेशन की आवश्यकता नहीं होती। catchup.enabled: true वाले मौजूदा कॉन्फ़िगरेशन को पुनर्प्राप्ति रीप्ले विंडो की संगतता प्रोफ़ाइल के रूप में मान्यता मिलती रहती है। अक्षम कैचअप ब्लॉक (enabled: false या बिना enabled: true के) सेवानिवृत्त हो चुके हैं; openclaw doctor --fix उन्हें हटाता है।

    समस्या निवारण

    imsg नहीं मिला या RPC असमर्थित है

    बाइनरी और RPC समर्थन सत्यापित करें:

    bash
    imsg rpc --helpimsg status --jsonopenclaw channels status --probe

    यदि प्रोब RPC को असमर्थित बताता है, तो imsg अपडेट करें। यदि निजी API क्रियाएँ उपलब्ध नहीं हैं, तो लॉग-इन macOS उपयोगकर्ता सत्र में imsg launch चलाएँ और फिर से प्रोब करें। यदि Gateway macOS पर नहीं चल रहा है, तो डिफ़ॉल्ट स्थानीय imsg पथ के बजाय ऊपर दिया गया SSH के माध्यम से रिमोट Mac सेटअप उपयोग करें।

    संदेश भेजे जाते हैं, लेकिन इनबाउंड iMessage नहीं आते

    पहले साबित करें कि संदेश स्थानीय Mac तक पहुँचा या नहीं। यदि chat.db नहीं बदलता, तो imsg status --json द्वारा ब्रिज को स्वस्थ बताए जाने पर भी OpenClaw संदेश प्राप्त नहीं कर सकता।

    bash
    imsg chats --limit 10 --jsonimsg watch --chat-id <chat-id> --jsonsqlite3 ~/Library/Messages/chat.db \"select datetime(max(date)/1000000000 + 978307200, 'unixepoch', 'localtime'), max(ROWID) from message;"

    यदि फ़ोन से भेजे गए संदेश नई पंक्तियाँ नहीं बनाते, तो OpenClaw कॉन्फ़िगरेशन बदलने से पहले macOS Messages और Apple Push परत की मरम्मत करें। एक बार का सेवा रीफ़्रेश अक्सर पर्याप्त होता है:

    bash
    launchctl kickstart -k system/com.apple.apsdlaunchctl kickstart -k gui/$(id -u)/com.apple.CommCenterlaunchctl kickstart -k gui/$(id -u)/com.apple.identityservicesdlaunchctl kickstart -k gui/$(id -u)/com.apple.imagentimsg launchopenclaw gateway restart

    फ़ोन से एक नया iMessage भेजें और OpenClaw सत्रों को डीबग करने से पहले नई chat.db पंक्ति या imsg watch इवेंट की पुष्टि करें। इसे आवधिक ब्रिज-पुनःप्रारंभ लूप के रूप में न चलाएँ; सक्रिय कार्य के दौरान बार-बार imsg launch और Gateway पुनः आरंभ करने से डिलीवरी बाधित हो सकती है और प्रगति पर चल रहे चैनल रन अटक सकते हैं।

    Gateway macOS पर नहीं चल रहा है

    डिफ़ॉल्ट cliPath: "imsg" को Messages में साइन इन किए हुए Mac पर चलना आवश्यक है। Linux या Windows पर, channels.imessage.cliPath को ऐसे रैपर स्क्रिप्ट पर सेट करें जो उस Mac से SSH करे और imsg "$@" चलाए।

    bash
    #!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"

    फिर चलाएँ:

    bash
    openclaw channels status --probe --channel imessage
    DM अनदेखे किए जाते हैं

    जाँचें:

    • channels.imessage.dmPolicy
    • channels.imessage.allowFrom
    • युग्मन अनुमोदन (openclaw pairing list imessage)
    समूह संदेश अनदेखे किए जाते हैं

    जाँचें:

    • channels.imessage.groupPolicy
    • channels.imessage.groupAllowFrom
    • channels.imessage.groups अनुमति-सूची व्यवहार
    • उल्लेख पैटर्न कॉन्फ़िगरेशन (agents.entries.*.groupChat.mentionPatterns)
    रिमोट अटैचमेंट विफल होते हैं

    जाँचें:

    • channels.imessage.remoteHost
    • channels.imessage.remoteAttachmentRoots
    • Gateway होस्ट से SSH/SCP कुंजी प्रमाणीकरण
    • Gateway होस्ट पर ~/.ssh/known_hosts में होस्ट कुंजी मौजूद है
    • Messages चलाने वाले Mac पर रिमोट पथ की पठनीयता
    macOS अनुमति प्रॉम्प्ट छूट गए

    उसी उपयोगकर्ता/सत्र संदर्भ में किसी इंटरैक्टिव GUI टर्मिनल में फिर से चलाएँ और प्रॉम्प्ट स्वीकार करें:

    bash
    imsg chats --limit 1imsg send <handle> "test"

    पुष्टि करें कि OpenClaw/imsg चलाने वाले प्रक्रिया संदर्भ को Full Disk Access + Automation प्रदान किए गए हैं।

    कॉन्फ़िगरेशन संदर्भ संकेतक

    संबंधित

    Was this useful?
    On this page

    On this page