{"_id":"@alexbessarabenko/openclaw-max","_rev":"18-b01a255a0241369e30b5d96304e62a89","name":"@alexbessarabenko/openclaw-max","dist-tags":{"latest":"0.6.1"},"versions":{"0.1.0":{"name":"@alexbessarabenko/openclaw-max","version":"0.1.0","_id":"@alexbessarabenko/openclaw-max@0.1.0","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"d3f58c916889bf8893b0c939e4afd852b2df1c3d","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.1.0.tgz","fileCount":16,"integrity":"sha512-EBr980ZkPeofM8UN9cYQ2hwYTCzT0X5TPSndKweDv/1tjT3GMK7IIvJUkga6TQV1JkuIkN6u9R1vFvE1dLKw8A==","signatures":[{"sig":"MEYCIQC6ZPv7+328pV1s95GehJ4Idz2ekuJB98QOTzGKTzBZTgIhAK6IrVW2f0FyA57+5USWblPnR5zP6pV64ALR0TCHtO57","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44901},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"1ec6e18db7ce032fc3104bd15416f28e8e68feec","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.5.28","pluginSdkVersion":"2026.5.28"},"compat":{"pluginApi":">=2026.5.28","minGatewayVersion":"2026.5.28"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"10.9.4","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"22.22.0","dependencies":{"@maxhub/max-bot-api":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.5.28"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.1.0_1780487692335_0.5599985161404246","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alexbessarabenko/openclaw-max","version":"0.1.2","_id":"@alexbessarabenko/openclaw-max@0.1.2","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"8dbfe48482e2f26f49ef9438ab45380a4168813c","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.1.2.tgz","fileCount":16,"integrity":"sha512-2hXoG0yN2GabbTh04+v46WuuHCzaOXqAEOqudLCOq54vaFPaQR6KqPkTgbZ5BevGIKLiByGodW3Qu+qgmUEXTQ==","signatures":[{"sig":"MEUCIB1a7w+dcvaBsCoSAMaiRtWMctyxrTmggcifrBk3ruqGAiEAq7OVymdJowE6clkj3WSbdZUBMpGO5LgIdLTpRBhpD/Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45019},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"36c80783ada83468aa993a3ec1e5bcc09f504a65","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.5.28","pluginSdkVersion":"2026.5.28"},"compat":{"pluginApi":">=2026.5.28","minGatewayVersion":"2026.5.28"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"10.9.4","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"22.22.0","dependencies":{"@maxhub/max-bot-api":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.5.28"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.1.2_1780502538327_0.5611967741533652","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alexbessarabenko/openclaw-max","version":"0.2.0","_id":"@alexbessarabenko/openclaw-max@0.2.0","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"446adce12ad2ccacef78c76919bcbba9eb819657","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.2.0.tgz","fileCount":23,"integrity":"sha512-/IQruOXAnGzV8dmLsvoXudKJJ/5zQ7XUM4shdvMTt7udnNO2Q4SJ6sYq+qlQhlWnSncfKYowrsd1HD7BU3Xkcg==","signatures":[{"sig":"MEUCIEFrl3h5Ky+7BUGb6tIExhldp0M0JMUHwmKshjsRR7//AiEA5CvW0oVnjcY9u6Ek140MfW/pZnt2Zh6nW6zyTHSMZTI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69200},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"42bd473a0e50f3ed5a62b651ee78d35db883bba8","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"11.16.0","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.2.0_1784238496777_0.9251793408884881","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@alexbessarabenko/openclaw-max","version":"0.2.1","_id":"@alexbessarabenko/openclaw-max@0.2.1","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"300189fb3a8736b966c7c771993e76edf9ed53bb","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.2.1.tgz","fileCount":27,"integrity":"sha512-BTUutBI1UU+D3RYiJGMQ+iiJVhSfvVneG/fG7Res62gHZVRiioWMnvx242dw09mFScZbyJ9AjasoMjXKH8Rh0Q==","signatures":[{"sig":"MEUCICWi7M5gw+TPJo8wI0MwIC4mLvHjH1srlut7N8PnU+MMAiEAzZAmpKeXoMMRNitHx/MWfABVX6E2lZYnKNT50H6lOlI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94105},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"c015c9660d7b4ae15238a85a1be6c0704d6cd765","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"11.16.0","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.2.1_1784240671755_0.05378474462207272","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.0","_id":"@alexbessarabenko/openclaw-max@0.3.0","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"a9ca2f6d5a95872b4cfd8d71f0b18dc6fb1d2932","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.0.tgz","fileCount":27,"integrity":"sha512-fNtYYxTWnmbq0HsgslfziicoSZjM/4kmUbkT1pinc737IEjW8QHkv+nO6c+Pekd13ASpQLtf+vhfSCjfwAE+qQ==","signatures":[{"sig":"MEQCIB89gkqMSxWDa7oSygUMm5Fh0sipQpUrMGri5B3CJBjiAiAlyoSNG60n/cBi+J+wVXTEnyw7B1VEV0L8SPHgfnnM5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96214},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"c015c9660d7b4ae15238a85a1be6c0704d6cd765","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"11.16.0","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.0_1784250562827_0.06860019138401019","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.1","_id":"@alexbessarabenko/openclaw-max@0.3.1","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"5162fba87c0a058eeb3a7da203d0c828e924a288","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.1.tgz","fileCount":27,"integrity":"sha512-WES2soKRi6bnP5qbBEXEUbu5kgz6i3Mv5p2MyNeCQTXJfCNssnt5hyu+RpmVUi/Rl3S4nLgtqf46EHHZejufyA==","signatures":[{"sig":"MEYCIQCqFcmbOqtmi6GDLTs2TcWS6nUerdVQapL9yoh9s7LAQAIhAN9+9rIi+2A27PsUJ0vE4NBRAegOQ8EKyq1nvzcTqC4W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96219},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"acae4c640d11a8e31b738414567647d5dc55a35b","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"11.16.0","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.1_1784251218394_0.2747797567080865","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.2","_id":"@alexbessarabenko/openclaw-max@0.3.2","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"11fd62c64b026304ca28b0e0b1906e2e9da6394f","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.2.tgz","fileCount":27,"integrity":"sha512-umyBhwEvwJSxE9nW3wCVwNA6H1OY6VW/+EwraIYvuBz+EdDTUQvIAQOn0LpnQIl7+jFw0ka+dthz1s2ZLKgt7w==","signatures":[{"sig":"MEUCIQCgh6JDUA6sdURC73f8Xo8QXraPPTja7P8ZhRhcfWjiTAIgGKhOt6w2rvW9Cb4RVjZSRn1hiL/ir+VTmlb9j3WRUpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100357},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"f5396fb2367e7f47f91dab9b8d4d75bb7b5d4832","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"11.16.0","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.2_1784253226641_0.9413991336943566","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.3","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.3.3","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"a912324e580808be01fd58bd301055f3aee65354","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.3.tgz","fileCount":27,"integrity":"sha512-bz5e0mNPk/IpD+H9BGmia1YJEpNNrm4RjkrFfnRLWexBHfU5A0amN+5B9goSdLDdLX3t67ZAYBVEoJDUtvBRnA==","signatures":[{"sig":"MEUCICufbQwNqBGK6Egc6B96eRrBLievtAV9aft/806qP8IMAiEAgpsX/q+wfJ+oYjVYwMxuRk79EFxnOluAWrrSUuqytOM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101005},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"8085d073ff8dfd0e70a403536396a18a2839f72a","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"11.16.0","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.3_1784276329896_0.3422744222532059","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.4","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.3.4","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"ca398f7e1e7548ed979e4a0a0307731e557318a4","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.4.tgz","fileCount":27,"integrity":"sha512-vSlKsl3lgWSL2wrAG2/5ckSKs7jQExIKJeh9cmEbgOtWhcKU79O6yOVrrxrYm9fsIMd5Rs9QKmFGI6XvGgEyEQ==","signatures":[{"sig":"MEQCIGpaFMFE+GsYNkAN8/P7YsYKfVHdJKRq25B6Z0q+/m9tAiB2Nut7Ji1ylYT7yC0a/9BNFOTJiG9xIfKC+prj/UazOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":121599},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"6ee23eda7f59fa7d1fdb3621d8795caeee57d230","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.2.5"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.4_1788603994588_0.7378848146163242","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.5","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.3.5","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"42f40bc38db36b3854d3f3230cb09faf8ce2b3e1","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.5.tgz","fileCount":27,"integrity":"sha512-P0gLCt/2dyXRo4cl+lV/ITceWsCzfEwzZcrS5kMXPqrDSL1eAIsSYZDYaQgD1HkUv2mybktvhzg46oosVuCLUw==","signatures":[{"sig":"MEQCIH/+aZZMa4THUBH1tD5EWp1aDN2Q8aglKpxQkc39d2MTAiAdnoVwBkDVX0uCysLyHxWAEjh2ZJ4Xws1pVGrUtAUJjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144426},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"80eaf7140198b7b681eb2cc51c9bb0148cfdaa36","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.5_1788639511439_0.013625122032992376","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@alexbessarabenko/openclaw-max","version":"0.3.6","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.3.6","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"3e803d9ba660f90824fb829beed86fef4b647315","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.3.6.tgz","fileCount":27,"integrity":"sha512-6xMQ3ywy4QQxSrbfdNKkGeMIZkADjttSnC3ZRx3lxaLq69sroshcngSEYA7QjtCQu3w4p1nKJfBJXFTmdbl+Vg==","signatures":[{"sig":"MEUCICrY0qoFyMtGNE4NenyX1j8jXcJTMYZfiGYjW/Ta2oFHAiEAhuT8mxcS6WbeEX7VR7LXr+saU+jLt6Hkb7tjPF5Bqk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149288},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"f4b1ae93067371db8566521b2af9b77e6bd8cd68","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.3.6_1788643231874_0.8209973389321887","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alexbessarabenko/openclaw-max","version":"0.4.0","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.4.0","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"7e533dcd0753cc1368cf125e8904c442a7ddceec","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.4.0.tgz","fileCount":27,"integrity":"sha512-mDTuLmpC30hk0dPKjRpbq/nprgYgLPbIrDY/4f6ec4X9D1n1fsSZ8cYMNFY/zamPOK9C9Zh/l+ONFPLdQwO2xw==","signatures":[{"sig":"MEUCIQDebVLEmjlEnobVKuiNZ0HaP1gf1fyIIij+7dYhE1STcQIgKPqTmq/+57gitOyhbo9vYQaF2vpv3zPxMStVnFebtC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170901},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"5e00bb53be6a8b4c6c83805951ac6d48e44fa8c4","scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.4.0_1788645465182_0.5220376388519217","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alexbessarabenko/openclaw-max","version":"0.5.0","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.5.0","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"72e7da769901aa9168108a8df16f44c15c1a05ce","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.5.0.tgz","fileCount":63,"integrity":"sha512-CKtfevvStpamI4oZ4FCtlbF4+83XyNzO0c6ZYEBtJkIHQyCZ0D8u2p8yGTr3PxGiZ/f/dus41tCNVKpgvaUSfw==","signatures":[{"sig":"MEUCIQDNCJVgYSGHjGKSyXKr9YQgrATv9G6QQRYysfEFOvko2gIgCeXEdsz6EXh3TmWzLLA69BGXeSa0yPPxTWv5qGNH1wc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441513},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2a4885637cba7c45dc63f40ee44b063bfedfe455","scripts":{"dev":"tsc --watch","test":"vitest run && npm run check:sdk","build":"tsc","check:sdk":"node scripts/check-sdk-imports.mjs"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","openclaw":"^2026.9.3","typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.5.0_1788947288000_0.9126996524234412","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@alexbessarabenko/openclaw-max","version":"0.5.1","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.5.1","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"43f872e867bc0f293444420d231062af13fc4b36","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.5.1.tgz","fileCount":63,"integrity":"sha512-bOL+fdhqJCyp6tii+H76l9BqnEVVeCKcr3+qEycBLwZWaWXfoIzZIY/eM8REi3N+dYrgEegkXk92+XzfMpaFwg==","signatures":[{"sig":"MEUCIB8yB2kQXienRLkltjfMYWqqK+BS7PhLu3a6jiv25PjWAiEAmBc0uEh7jyxDxDYfuOuKnOzjeqoY94vul8fRxzX+GVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441829},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2fd3c67f8b72fca76b12496753ee3e00d865eebd","scripts":{"dev":"tsc --watch","test":"vitest run && npm run check:sdk","build":"tsc","check:sdk":"node scripts/check-sdk-imports.mjs"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","openclaw":"^2026.9.3","typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.5.1_1788948114979_0.10098865375374966","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@alexbessarabenko/openclaw-max","version":"0.5.2","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.5.2","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"5230e81c178029772f20a4768d0402e20487babe","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.5.2.tgz","fileCount":63,"integrity":"sha512-PLdKrSc8/4PyN0fitdj7YmaZq70lBTgTRJjGJcQ7OANRpNSxaws5Q+vJVXjnjD+zJ9yx61D/FTgreoxuS+HuUQ==","signatures":[{"sig":"MEUCIQDK+rTkJJUgGKeX7HOtfFbW5ID9SZLQ0FgmblXx8GO2fAIgXU4syo31Lcb7LF5OVUpHecMYnnB1Yz+RY7SLnTQdo6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":443919},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"7abac9786980c43adb424dc3920285cd1ee2da48","scripts":{"dev":"tsc --watch","test":"vitest run && npm run check:sdk","build":"tsc","check:sdk":"node scripts/check-sdk-imports.mjs"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","openclaw":"^2026.9.3","typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.5.2_1788948610734_0.6611386150633896","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@alexbessarabenko/openclaw-max","version":"0.5.3","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.5.3","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"09cf0d7466a554a5b88a3dbd068d06877c1e5c0b","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.5.3.tgz","fileCount":68,"integrity":"sha512-cLMHG1c5GEDsqJ5LQA4X5wYNFd52CUSCsh7saRrTQ20S4Zba93ksASXf+I9s3N2IL2HmjLwWAJpRfgHMw5CNsA==","signatures":[{"sig":"MEYCIQCX2jzyfYoB5CURh85WSIthcD7YWR+Rgec1PviJCZklKAIhAKm22cwvNrKcTnDGtvWgvo9UhR1ZaOt+HL9nFI9j6R14","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":462254},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"9ba8fcd4526fe0c734b4b59876d08229070dc1b4","scripts":{"dev":"tsc --watch","test":"vitest run && npm run check:sdk","build":"tsc","check:sdk":"node scripts/check-sdk-imports.mjs"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","openclaw":"^2026.9.3","typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.5.3_1788950807196_0.5547340353833752","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alexbessarabenko/openclaw-max","version":"0.6.0","license":"MIT","_id":"@alexbessarabenko/openclaw-max@0.6.0","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"dist":{"shasum":"e32808c319f17cbf1b28a4db97ee6d386b68fa62","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.6.0.tgz","fileCount":83,"integrity":"sha512-DyRi7BWlzu6W9miwI3OIMP/KvKrxTPx6RvavbdQ26eejieEfaqVsx8xK2Yk0RV5NW/0jEbZRnZ7tF9AzIxaBRw==","signatures":[{"sig":"MEUCIFq/LBhbIUF6fARJGn/Q5YRdPCBr0NOc11i2oKHgjqQcAiEArC5F7F3wan0Q+V65uM4WZnVd3+oiaMWOURpXR/aWedw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAC33IC2nwFXqzUoHXR0juGsXZF3YIiTMclSjhcKVE3FAiEAzNbBbaA/lWY1MYuxLTGyz6MNCBRwE3JQBIMh0/H7FkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":581134},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"e8519356aeeed2ec2f0ad337ae13891389a2df14","scripts":{"dev":"tsc --watch","test":"vitest run && npm run check:sdk","build":"tsc","check:sdk":"node scripts/check-sdk-imports.mjs","schema:update":"node scripts/update-schema.mjs"},"_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.1","vitest":"^3.2.4","openclaw":"^2026.9.6","typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"tmp":"tmp/openclaw-max_0.6.0_1790684672355_0.7888849555168427","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"_id":"@alexbessarabenko/openclaw-max@0.6.1","dist":{"shasum":"5acbb1d747a2d99a6a99a6ff8384b3da39d66437","tarball":"https://registry.npmjs.org/@alexbessarabenko/openclaw-max/-/openclaw-max-0.6.1.tgz","fileCount":88,"integrity":"sha512-00eUI8xo75WVao+BBSgu1PY6Ev7V6BnpCSAOBW+NDvttEXGDcs49eqYQkeUymUVPdFadMjPRn2VDvnsiAifgew==","signatures":[{"sig":"MEUCIQCroaILI8bpaUsoVx73CmpeI5ow6JyrhQEJTZYSd+kM9QIgbA9DBDHyKeuGG0a3AKKVvbt0W6CMv8TSYnqXMwzAXik=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDNKmkyd7PNKuEh7lxw3ny+TBtSKAVfI7BKK3POLkqNOwIhAJEun+x0iYgexpRK1mU0QI60h0+TVaMBD4bx5bX30MBG"}],"unpackedSize":592127},"main":"./dist/index.js","name":"@alexbessarabenko/openclaw-max","type":"module","types":"./dist/index.d.ts","gitHead":"328aabf565ddd12b171ac9f752c2e9d9bb0192f0","license":"MIT","scripts":{"dev":"tsc --watch","test":"vitest run && npm run check:sdk","build":"tsc","check:sdk":"node scripts/check-sdk-imports.mjs","schema:update":"node scripts/update-schema.mjs"},"version":"0.6.1","_npmUser":{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"},"openclaw":{"build":{"openclawVersion":"2026.7.1","pluginSdkVersion":"2026.7.1"},"compat":{"pluginApi":">=2026.7.1","minGatewayVersion":"2026.7.1"},"channel":{"id":"max","blurb":"Connect OpenClaw to MAX messenger.","label":"MAX Messenger"},"extensions":["./index.ts"],"setupEntry":"./setup-entry.ts","runtimeExtensions":["./dist/index.js"],"runtimeSetupEntry":"./dist/setup-entry.js"},"_npmVersion":"12.0.2","description":"MAX messenger channel plugin for OpenClaw","directories":{},"maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","undici":"^7.29.1","@maxhub/max-bot-api":"^0.3.1"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.1","vitest":"^3.2.4","openclaw":"^2026.9.6","typescript":"^5.4.2","@types/node":"^22.5.5"},"peerDependencies":{"openclaw":"^2026.7.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/openclaw-max_0.6.1_1790685140274_0.12086083918027324"}}},"time":{"created":"2026-06-03T11:54:52.097Z","modified":"2026-09-29T12:32:20.523Z","0.1.0":"2026-06-03T11:54:52.475Z","0.1.2":"2026-06-03T16:02:18.481Z","0.2.0":"2026-07-16T21:48:16.900Z","0.2.1":"2026-07-16T22:24:31.897Z","0.3.0":"2026-07-17T01:09:22.970Z","0.3.1":"2026-07-17T01:20:18.531Z","0.3.2":"2026-07-17T01:53:46.780Z","0.3.3":"2026-07-17T08:18:50.030Z","0.3.4":"2026-09-05T10:26:34.743Z","0.3.5":"2026-09-05T20:18:31.612Z","0.3.6":"2026-09-05T21:20:32.008Z","0.4.0":"2026-09-05T21:57:45.314Z","0.5.0":"2026-09-09T09:48:08.136Z","0.5.1":"2026-09-09T10:01:55.149Z","0.5.2":"2026-09-09T10:10:10.903Z","0.5.3":"2026-09-09T10:46:47.345Z","0.6.0":"2026-09-29T12:24:32.443Z","0.6.1":"2026-09-29T12:32:20.365Z"},"license":"MIT","description":"MAX messenger channel plugin for OpenClaw","maintainers":[{"name":"alexbessarabenko","email":"bessarabenkoalexander@gmail.com"}],"readme":"# OpenClaw MAX Messenger Plugin\n\nChannel plugin connecting OpenClaw to [MAX Messenger](https://max.ru) — Russian messaging platform.\nTested with OpenClaw **2026.9.3**, MAX Bot API v2 (`platform-api2.max.ru`).\n\n> **OpenClaw ≥ 2026.9 note:** gateway 2026.9.x starts channel accounts inside a\n> short-lived root-work admission context. Long-lived channel work (the polling\n> loop, post-ACK webhook processing) must detach from it, otherwise every\n> inbound dispatch is rejected with `GatewayDrainingError` — messages arrive,\n> but replies are never sent. Since **0.3.4** the plugin detaches automatically\n> (`runOutsideInheritedRootWork` in `channel.ts`). On plugin ≤ 0.3.3 replies\n> silently stop after a gateway restart.\n\n## Features\n\n- ✅ Two-way messaging (text, Markdown, 4000-char chunking; pipe tables in replies are auto-aligned into monospace blocks — MAX has no markdown table syntax)\n- ✅ **MAX Bot API v2** — `platform-api2.max.ru` by default, bundled Минцифры CA certificates\n- ✅ Webhook (auto-subscription, `X-Max-Bot-Api-Secret` validation, immediate 200 ACK) + Long Polling fallback\n- ✅ **Correct per-chat sessions** — canonical OpenClaw session keys, session recording and last-route updates (context no longer resets between messages)\n- ✅ DM security (`dmPolicy`: open/allowlist/closed) + pairing flow for new contacts\n- ✅ Direct messages and group chats (group sessions isolated per chat)\n- ✅ **Media support** — images, video and files are downloaded into the OpenClaw media store and analyzed by the configured multimodal models\n- ✅ **Voice transcription** — audio messages transcribed by the gateway's media-understanding pipeline (`tools.media.audio`, e.g. Groq Whisper); a server-side `transcription` sent by MAX wins and skips the gateway STT call\n- ✅ `bot_started` support — the \"Начать\" button becomes `/start` (deep-link payload appended)\n- ✅ Typing indicator with keepalive, `mark_seen` read receipts, bot-loop protection, message deduplication\n- ✅ **Streaming replies** — partial model output edits a single draft message in place (`editMessage`), final text replaces it; can be disabled\n- ✅ **Scoped HTTP proxy** — optional per-account proxy for MAX API traffic only, without touching the rest of the gateway\n- ✅ **Agent prompt hints** — the plugin teaches the agent MAX Markdown rules, the 4000-char limit and delivery-target syntax via `agentPrompt`\n- ✅ **Inline keyboards** — the agent attaches buttons via the `message` tool `presentation` param or `channelData.maxInlineKeyboard`; button presses arrive as inbound messages and are auto-acknowledged\n- ✅ **Message actions** — the agent edits/deletes its own messages, pins/unpins in chats, echoes stickers and sends native location pins / contact cards via the `message` tool\n- ✅ **`max_send_file` agent tool** — delivers a local file or an http(s) URL into the current MAX chat (media-roots confinement, SSRF-guarded download)\n- ✅ **Group policies** — `groupPolicy` (open/allowlist/disabled), per-group config with a `*` wildcard, `requireMention` (a reply to the bot or a structured `user_mention` markup counts as a mention)\n- ✅ **Reliable inbound** — persistent polling marker + dedup snapshot (at-least-once across restarts), `message_edited` tracking, send retry on `attachment.not.ready`, one retry on transient download failures\n- ✅ **Outbound rate limiting** — per-chat sliding window (2 messages/sec, MAX platform limit) with FIFO queueing across all send paths; edits/typing/callback answers are not throttled\n- ✅ **Webhook watchdog** — in webhook mode the subscription is re-verified every 12 minutes and re-created if MAX dropped it\n- ✅ **Media albums** — several images/videos go out as one album message (up to 12, the MAX limit); audio/files always send individually; the `message` tool reports all message ids\n- ✅ **Full presentation rendering** — `select` blocks become inline buttons, tables and charts render as aligned monospace blocks, `title`/`tone` produce a bold emoji-prefixed heading\n- ✅ **Operator buttons** — presentation `approval` / ask-user `question` actions resolve through OpenClaw's canonical approval/question runtimes; the keyboard message is replaced with a status line so a resolved control cannot be pressed twice (allowFrom-gated)\n- ✅ **All MAX button wire types** — `callback`, `link`, `clipboard`, `message`, `request_contact`, `request_geo_location`, `open_app`\n- ✅ **Security hardening** — SSRF-guarded downloads, media-roots confinement for local sends, access check before any attachment download, attachment limits (≤10 files, ≤25 MB each)\n- ✅ **Send options** — per-message silent (`channelData.maxNotify`) and link-preview suppression (`maxDisableLinkPreview`), with channel-level defaults; remote images attach by URL without a re-upload\n- ✅ **Pairing approval notice** — the user gets a ✅ confirmation in MAX after `openclaw pairing approve --notify`\n- ✅ **Status diagnostics** — `openclaw channels status` reports a masked token preview, policies, transport mode and proxy state (`inspectAccount`)\n\n## Installation\n\n### Via ClawHub (Recommended)\n\n```bash\nopenclaw plugins install clawhub:@alexbessarabenko/openclaw-max\n```\n\n### Via npm\n\n```bash\nopenclaw plugins install npm:@alexbessarabenko/openclaw-max\n```\n\n### Via GitHub\n\n```bash\nopenclaw plugins install github:AlexBessarabenko/openclaw-max-plugin\n```\n\n### Manual (Development)\n\n```bash\ncd ~/.openclaw/extensions\ngit clone https://github.com/AlexBessarabenko/openclaw-max-plugin.git max\ncd max\nnpm install\nnpm run build\n```\n\n## Configuration\n\n`~/.openclaw/config.json`:\n\n```json\n{\n  \"channels\": {\n    \"max\": {\n      \"token\": \"YOUR_MAX_BOT_TOKEN\",\n      \"dmPolicy\": \"allowlist\",\n      \"allowFrom\": [\"123456789\"],\n      \"webhookUrl\": \"https://your-host/max/webhook\",\n      \"webhookSecret\": \"random-long-secret\"\n    }\n  }\n}\n```\n\n| Option | Description |\n|--------|-------------|\n| `token` | Bot token from [MAX for Partners](https://partners.max.ru) (required) |\n| `dmPolicy` | `allowlist` (default), `open`, `closed` — who can DM the bot |\n| `allowFrom` | MAX user IDs allowed when policy is `allowlist` |\n| `groupPolicy` | `open` (default), `allowlist`, `disabled` — how the bot behaves in group chats (see \"Group chats\") |\n| `groupAllowFrom` | MAX user IDs allowed to trigger the bot in groups when `groupPolicy` is `allowlist` (empty = any member of an allowed group) |\n| `requireMention` | `false` (default) — in groups the bot answers only when @-mentioned or replied to |\n| `groups` | Per-group overrides keyed by chat id (or `\"*\"`): `{ \"requireMention\": bool, \"enabled\": bool }` |\n| `notify` | Channel default for outbound notifications; `false` = send silently. Per-message override: `channelData.maxNotify` |\n| `disableLinkPreview` | Channel default for suppressing link previews. Per-message override: `channelData.maxDisableLinkPreview` |\n| `logInboundPreview` | `false` (default) — the inbound log line carries metadata only (chat, type, sender, text length); `true` adds a 50-char text preview for debugging |\n| `markSeen` | `true` (default) — send a `mark_seen` read receipt once per inbound message; `false` disables read receipts |\n| `commands` | Optional bot command menu: array of `{ \"name\": \"start\", \"description\": \"…\" }` (≤32 entries, name 1–64 chars, description ≤128), registered via `PATCH /me/commands` at channel start |\n| `webhookUrl` | Public URL of the `/max/webhook` route. When set, the plugin subscribes via `POST /subscriptions` automatically. When empty — long polling |\n| `webhookSecret` | Optional secret; verified against the `X-Max-Bot-Api-Secret` header |\n| `apiBaseUrl` | API override, default `https://platform-api2.max.ru` |\n| `streaming` | `true` (default) — edit one draft message as the reply streams; `false` — send only the final message |\n| `httpProxy` | Optional HTTP/HTTPS proxy URL (`http://host:port`) for MAX API requests only |\n\n### Voice transcription\n\nSince plugin **0.3.0**, transcription runs through the gateway's media-understanding\npipeline — the plugin itself holds no API keys and uploads nothing to third parties.\nWhen MAX attaches a server-side `transcription` to an audio message (schema field,\nnot currently sent in production), it is used directly and the gateway STT call is\nskipped. Enable and configure `tools.media.audio` in `~/.openclaw/openclaw.json`, and supply\nthe provider key to the **gateway** (e.g. `env.GROQ_API_KEY`, or the official Groq\nprovider plugin):\n\n```json\n{\n  \"tools\": {\n    \"media\": {\n      \"audio\": {\n        \"enabled\": true,\n        \"language\": \"ru\",\n        \"models\": [{ \"provider\": \"groq\", \"model\": \"whisper-large-v3\" }]\n      }\n    }\n  }\n}\n```\n\n`language` is an operator choice — omit it for provider auto-detection. With no STT\nprovider configured, voice messages are delivered as audio attachments, untranscribed.\n\n**Migrating from 0.2.x:** up to 0.2.1 the plugin read `GROQ_API_KEY` from the\nenvironment itself and sent audio to Groq with a hardcoded Russian locale. If you\nrelied on that, add the `tools.media.audio` block above — a 1:1 replacement that is\nadditionally consent-gated and locale-configurable.\n\n**Inbound voice-note coverage is client-dependent.** Verified live: voice notes\nrecorded in the **iOS** app arrive over long polling; the same notes recorded in the\n**Android** app may not be delivered to bots over polling at all. For full coverage\nrun the bot in **webhook** mode (`webhookUrl`) behind a public HTTPS endpoint —\ne.g. Caddy or nginx with Let's Encrypt, or a tunnel like CloudPub.\n\n### Voice replies (TTS)\n\nReplies can be voiced through the gateway's TTS pipeline — the plugin only delivers\nthe resulting audio file. Verified working with the **free Microsoft Edge TTS**\nprovider (no API key required) — enable the bundled `microsoft` plugin and set it as\nthe TTS provider in `~/.openclaw/openclaw.json`:\n\n```json\n{\n  \"plugins\": { \"entries\": { \"microsoft\": { \"enabled\": true } } },\n  \"tts\": {\n    \"auto\": \"inbound\",\n    \"provider\": \"microsoft\",\n    \"providers\": {\n      \"microsoft\": { \"voice\": \"ru-RU-DmitryNeural\", \"lang\": \"ru-RU\" }\n    }\n  }\n}\n```\n\nRussian voices to choose from: **`ru-RU-DmitryNeural`** (male) or\n**`ru-RU-SvetlanaNeural`** (female). `auto: \"inbound\"` voices replies only to voice\nmessages; `\"always\"` voices every reply. OpenRouter (`hexgrad/kokoro-82m`) also\nworks, but Kokoro has no Russian language support — use it for English only.\n\n> Note: the `microsoft` plugin must be allowed by your `plugins.allow` list when one\n> is configured, and a gateway **restart** is required after enabling it (speech\n> providers register at startup; a hot reload is not enough).\n\n### TLS certificates (platform-api2.max.ru)\n\nMAX officially requires bots to migrate to `platform-api2.max.ru` and to trust the\nRussian national root CA (Минцифры / \"Russian Trusted Root CA\", distributed via\n[gosuslugi.ru/crt](https://www.gosuslugi.ru/crt)). Node.js does not trust this root\nout of the box, so the plugin ships the required PEM files in `certs/`.\n\nSince **0.3.6** the extra CAs are loaded into a dedicated undici dispatcher used\n**only for requests to MAX infrastructure hosts** (`*.max.ru`, `*.oneme.ru`) — the\nplugin passes a scoped `fetch` to the max-bot-api client and uses it for uploads,\nattachment downloads and probes. The process-wide TLS trust store is **never\nmodified** (`tls.setDefaultCACertificates` is not called): every other plugin and\nchannel in the gateway keeps Node's default trust. This addresses the ClawHub\nsecurity-audit note from earlier versions.\n\nOn Node older than 22.15 the plugin cannot read the default CA list at runtime\nand warns instead — install the certificates system-wide:\n\n```bash\nsudo cp certs/*.crt /usr/local/share/ca-certificates/mincifry/\nsudo update-ca-certificates\nexport NODE_EXTRA_CA_CERTS=/etc/ssl/certs/russian_trusted_root_ca_pem.pem\n```\n\n## Security\n\n- **Access check before download** — DM (`dmPolicy`/allowlist) and group policy gates\n  run before any attachment is fetched or written; a blocked sender cannot make the\n  plugin touch the network or disk.\n- **SSRF-guarded downloads** — all remote fetches (inbound attachments, outbound\n  media by URL, `max_send_file` URLs) go through the OpenClaw SSRF guard; image\n  URLs attached by link (no download) still get their host screened for\n  private/loopback addresses.\n- **Media confinement** — local files are read only through the gateway's media\n  reader or from the agent's allowed media roots; an agent-named arbitrary path is\n  refused.\n- **Attachment limits** — at most 10 attachments per message, 25 MB each; oversized\n  downloads abort before buffering.\n- **No token leakage** — diagnostics (`inspectAccount`) report only a masked\n  first4…last4 preview; the token never leaves the config.\n\n## ⚠️ Privacy & Consent Notice\n\nThis plugin talks **only** to the MAX Bot API. Any AI processing of message content\nis performed by the OpenClaw gateway under the operator's control:\n\n- **Voice / audio** is sent to a speech-to-text provider (e.g. Groq Whisper) **only**\n  when the operator has explicitly enabled and configured `tools.media.audio` —\n  provider, model, language and API key are all operator-chosen. With no STT provider\n  configured, audio never leaves the gateway for transcription.\n- **Images and PDFs** are analyzed **only** by the models the operator set in\n  `agents.defaults.imageModel` / `agents.defaults.pdfModel`; that content leaves the\n  host only towards those operator-configured providers.\n- The plugin reads no third-party API keys and uploads nothing on its own.\n\nIf you operate this bot, inform your users — in DMs and especially in group chats —\nthat their messages and media may be processed by the third-party AI providers you\nhave configured.\n\n## How sessions behave (context within one chat)\n\n- Every DM partner gets their own session (`agent:<id>:max:default:direct:<userId>`), every group chat gets its own session. Context persists across messages.\n- By default OpenClaw resets sessions **daily at 04:00** (`session.reset`) and honors `/new` and `/reset`. Tune via `session.reset`, `session.resetByType.{dm,group}`, `session.resetByChannel.max` or `session.idleMinutes` in the OpenClaw config.\n- \"🧹 Compacting context…\" is **compaction** (history is summarized, not wiped). Configure via `agents.defaults.compaction.notifyUser` / `agents.defaults.compaction.model`.\n- Session state lives in the agent store (`~/.openclaw/agents/<agentId>/sessions/sessions.json`); `bindings[]` routing of MAX peers to specific agents is respected.\n\n## Usage\n\n### Webhook (recommended)\n\nSet `webhookUrl` to the public address of your gateway's `/max/webhook` route — the plugin registers the subscription with MAX itself (`update_types: message_created, message_callback, bot_started, message_edited`). Set `webhookSecret` so MAX signs deliveries.\n\nA watchdog re-checks the subscription every 12 minutes: MAX drops webhooks\nafter ~8h of failed deliveries, and a missing subscription is re-created with\nthe same parameters (logged as `webhook subscription is missing, re-creating`).\n\n### Long polling\n\nLeave `webhookUrl` empty — the plugin polls `GET /updates` automatically. The polling\nmarker (plus a dedup snapshot) is **persisted after each fully processed batch**, so a\ngateway restart replays at most one batch and the snapshot absorbs it (at-least-once\ndelivery). Restarts after transient errors use exponential backoff with jitter (5 s →\n5 min, reset after a healthy minute) and are logged as\n`Long polling exited unexpectedly, restarting in Ns`.\n\n### Delivery targets (`message` tool, `openclaw message send`)\n\nSince **0.3.5** the plugin ships a `messaging` target adapter, so the agent's `message`\ntool and `openclaw message send --channel max --to <target>` accept MAX chat ids directly\n(`max:` prefix optional).\n\n**DMs:** since **0.4.0** you can address a user directly with `user:<userId>` — the\nplugin then calls `sendMessageToUser`, which resolves the dialog itself\n(`openclaw message send --channel max --to user:8740709 …`). A bare numeric id is still\ntreated as a **chat id** (the dialog chat id works too). Group/channel ids are negative.\nThe dialog chat id appears in the gateway log on every inbound message\n(`[MAX] inbound: chat=<id> …`).\n\n### Streaming replies\n\nSince **0.4.0**, when the model streams partial output, the plugin sends one draft\nmessage and keeps editing it in place (throttled, `format: \"markdown\"`); the final reply\nreplaces the draft text. Long final answers are still chunked at 4000 chars — the first\nchunk edits the draft, the rest arrive as follow-up messages. Set\n`channels.max.streaming: false` to restore the old send-once behavior.\n\n### Inline keyboards (buttons)\n\nThe agent can attach inline keyboards to the final reply and react to button\npresses. Two ways to describe buttons:\n\n**Portable `presentation` param of the `message` tool** (works on the tool send\npath, including `openclaw message send`-style deliveries):\n\n```json\n{\n  \"presentation\": {\n    \"blocks\": [\n      {\n        \"type\": \"buttons\",\n        \"buttons\": [\n          { \"label\": \"Да\", \"value\": \"vote:yes\" },\n          { \"label\": \"Нет\", \"action\": { \"type\": \"callback\", \"value\": \"vote:no\" } },\n          { \"label\": \"Открыть\", \"url\": \"https://dev.max.ru\" }\n        ]\n      }\n    ]\n  }\n}\n```\n\n`value` (or `action` `callback`/`command`) makes a callback button; `url` (or\naction type `url`/`web-app`) makes a link button. Buttons pack three per row.\n\n**`channelData.maxInlineKeyboard`** — on the agent's reply path (one inner\narray = one row), giving explicit control over row layout:\n\n```json\n{\n  \"channelData\": {\n    \"maxInlineKeyboard\": [\n      [{ \"text\": \"Да\", \"payload\": \"vote:yes\" }, \"Нет\"],\n      [{ \"text\": \"Открыть\", \"url\": \"https://dev.max.ru\" }]\n    ]\n  }\n}\n```\n\n- Simplified `{text, url?, payload?}` (and plain strings — payload = label) or full wire\n  buttons `{type: \"callback\"|\"link\"|\"clipboard\"|\"message\"|\"request_contact\"|\"request_geo_location\"|\"open_app\", …}`;\n  URL buttons win over payload.\n- Wire types follow the MAX API schema: `message` sends the button text as a user\n  message; `request_contact`/`request_geo_location` ask for the user's contact /\n  location (`quick: true` sends location without confirmation); `open_app` opens a\n  mini app (`web_app`: public bot name, optional slug `payload`, ≤ 512 chars).\n- On any single payload `channelData.maxInlineKeyboard` wins over `presentation`\n  and legacy `interactive` buttons.\n- MAX limits enforced by validation: ≤ **210** buttons, ≤ **30** rows, ≤ **7** buttons\n  per row (≤ **3** when the row contains a `link`/`open_app`/`request_*` button),\n  link URL ≤ **2048** chars, label ≤ **128** chars, callback payload ≤ **1024** bytes.\n- The keyboard rides only the **final** message (a streaming draft is edited into the\n  final text with the keyboard attached; long replies carry it on the last chunk).\n- Invalid keyboards are logged and dropped — the text reply still goes out.\n- `message_callback` updates arrive as regular inbound messages carrying the button\n  payload as text; the callback is auto-acknowledged (`POST /answers`), so no spinner\n  is left hanging on the button. Make payloads self-describing — MAX does not echo the\n  button label.\n\n**Presentation buttons vs. verbatim keyboards.** Buttons produced from the portable\n`presentation` param carry private envelopes, so typed actions survive the round trip:\n`callback` values arrive as `callback_data: <value>` (never parsed as a slash command),\n`command` actions re-enter as the command itself, and `approval` / ask-user `question`\nactions are resolved by OpenClaw's canonical approval/question runtimes — the keyboard\nmessage is then replaced with a status line (buttons removed, so a resolved control\ncannot be pressed twice). Approval buttons require the pressing user to be listed\nexplicitly in `channels.max.allowFrom` (a `*` wildcard is enough for questions, never\nfor approvals). Buttons from `channelData.maxInlineKeyboard` keep arriving verbatim.\n\n**Selects, tables and charts.** `select` blocks render as callback buttons (two per\nrow, `placeholder` shown as an italic prompt). Tables and charts render as aligned\nmonospace blocks (MAX has no native data blocks). A `presentation.title` renders bold\non the first line, prefixed with a tone emoji (`info` ℹ️, `success` ✅, `warning` ⚠️,\n`danger` ⛔).\n\n### Message actions (message tool)\n\nSince **0.5.0** the plugin owns a set of actions on the agent's shared `message` tool\n(plain text/media send stays on the core delivery path):\n\n```\nmessage(action=\"edit\",    messageId=\"<mid>\", message=\"new text\")\nmessage(action=\"delete\",  messageId=\"<mid>\")\nmessage(action=\"pin\",     target=\"<chat_id>\", messageId=\"<mid>\", notify=false)\nmessage(action=\"unpin\",   target=\"<chat_id>\")\nmessage(action=\"sticker\", target=\"<chat_id>\", stickerId=\"<code>\")   // code optional\nmessage(action=\"sendAttachment\", type=\"location\", target=\"<chat_id>\", latitude=\"55.75\", longitude=\"37.62\")\nmessage(action=\"sendAttachment\", type=\"contact\",  target=\"<chat_id>\", contactName=\"Имя\", vcfPhone=\"+79001234567\")\nmessage(action=\"sendAttachment\", type=\"contact\",  target=\"<chat_id>\", contactId=\"<max_user_id>\")\n```\n\n- **Edit limits:** the bot's own messages can be edited up to **7 days** in dialogs;\n  messages with an inline keyboard and messages in groups/channels have **no time\n  limit**. Deletion has **no time limit**. MAX allows at most **2 edit/delete\n  operations per second per chat**.\n- **Stickers are echo-only:** there is no public sticker catalog API in MAX (a\n  scraped static catalog was rejected as brittle), so `stickerId` must be a code the\n  bot has actually seen. Incoming stickers arrive as `[Sticker (code …)]` markers;\n  the last code per chat is cached for 30 minutes — omitting `stickerId` resends it.\n  `replyTo` (a message id) is supported on sticker/location/contact sends.\n- **Contacts** use the snake_case wire payload (`vcf_info` VCard signed with an\n  HMAC of the bot token, or `max_info` for a MAX user id).\n- **Pin/unpin are group-only:** MAX rejects pins in direct chats (400 \"not\n  available for dialogs\"), so a dialog target (positive chat id or `user:<id>`)\n  short-circuits without an API call and returns\n  `{ pinned: false, reason: \"pins are not supported in direct chats\" }`.\n- **Chat scoping (since 0.5.3):** these moderation actions may target dialogs\n  (DMs) freely, but a **group/channel chat only when it is admitted by the\n  group policy** (`groupPolicy` / `groups`, same rules as the inbound gate) —\n  a prompt injection in one chat cannot reach another chat the bot sits in.\n  `edit`/`delete` carry only a `messageId`, so the chat is resolved via\n  `GET /messages/{mid}` (`recipient.chat_type`/`chat_id`, cached for the\n  process lifetime); if the chat cannot be resolved the action is refused\n  (fail-closed). Explicit chat targets are classified by the MAX id\n  convention (dialog ids positive, group/channel ids negative) — no extra API\n  calls. A rejected action fails with `chat … is not admitted by the\n  channels.max group policy`.\n\n### Sending files (`max_send_file` tool)\n\nSince **0.5.0** agents get a `max_send_file` tool that delivers a file into the\n**current** MAX chat (the chat is bound from the session's delivery context — the\nagent cannot redirect it elsewhere):\n\n- `path` — a local file inside the agent's allowed media roots (or session\n  workspace); or\n- `url` — an http(s) URL, downloaded through the SSRF guard;\n- `caption` — optional text sent with the file.\n\nThe file type (image/video/audio/file) is derived from the filename and uploaded via\nthe raw `POST /uploads` endpoint.\n\n### Group chats\n\nSince **0.5.0** group traffic is governed by `groupPolicy` (default `open`,\npreserving pre-0.5 behavior):\n\n- `disabled` — all group traffic is ignored;\n- `allowlist` — the chat must appear in `groups` (a `\"*\"` entry allows any group);\n  when `groupAllowFrom` is non-empty, the sender must be listed there too;\n- `open` — every group the bot joins is served (a startup warning is logged).\n\n`requireMention` (per-group → `\"*\"` → top-level, default `false`): the bot answers\nonly when @-mentioned by username (plain text or a structured `user_mention`\nmarkup element referencing the bot's user id / `@username`) or when its own\nmessage is replied to; button\npresses on the bot's keyboard always count. A single group can be switched off with\n`enabled: false`. Downloads are gated the same way — a dropped message never\ntriggers an attachment fetch.\n\n```json\n{\n  \"channels\": {\n    \"max\": {\n      \"token\": \"…\",\n      \"groupPolicy\": \"allowlist\",\n      \"groupAllowFrom\": [\"123456789\"],\n      \"groups\": {\n        \"-900100\": { \"requireMention\": true },\n        \"-900200\": { \"enabled\": false },\n        \"*\": { \"requireMention\": true }\n      }\n    }\n  }\n}\n```\n\n### HTTP proxy\n\n`channels.max.httpProxy` (e.g. `http://proxy.local:3128`) routes **only** MAX API\ntraffic (bot client, uploads, attachment downloads, probes) through an undici\n`ProxyAgent`; every other plugin and channel keeps direct connections. The Минцифры CA\nbundle stays in effect through the proxy (`CONNECT` + custom `requestTls.ca`). Proxy\nauthentication can be embedded in the URL (`http://user:pass@host:port`).\n\n### Supported message types\n\n| Type | Incoming | Outgoing | Notes |\n|------|----------|----------|-------|\n| Text | ✅ | ✅ | Markdown, chunked at 4000 chars |\n| Images | ✅ | ✅ | Saved to media store, analyzed via imageModel; remote image URLs attach by link (no re-upload) |\n| Audio/Voice | ✅* | ⚠️ | Transcribed via gateway STT (`tools.media.audio`). *Inbound voice notes verified from iOS via polling; Android may require webhook mode |\n| Video | ✅ | ⚠️ | Saved to media store; token-only videos resolve a playback URL via `GET /videos/{token}` |\n| Files | ✅ | ⚠️ | PDFs analyzed via pdfModel; agent-served files via the `max_send_file` tool |\n| Polls | ❌ | — | MAX does not deliver poll events to bots at all (neither polling nor webhook) |\n| Stickers | ✅ | ✅ | Incoming arrive as `[Sticker (code …)]` (cached 30 min per chat); outgoing = echo by code (`action=\"sticker\"`) |\n| Contacts | ✅ | ✅ | Incoming `[Contact: Name]`; outgoing via `sendAttachment type=\"contact\"` |\n| Locations | ✅ | ✅ | Incoming as a Yandex Maps link; outgoing via `sendAttachment type=\"location\"` |\n| Share cards | ✅ | — | Marked `[Shared: title (url)]` |\n| `bot_started` | ✅ | — | Becomes `/start [payload]` |\n| Forwarded | ✅ | — | Content unwrapped from `link.message`, marked `[Forwarded from …]`; media processed as usual |\n| Replies | ✅ | — | Quoted original shown as `[Reply to …: \"…\"]` (≤200 chars) |\n| Edited messages | ✅ | ✅ | `message_edited` arrives marked `[Edited]`; the bot edits its own messages via `action=\"edit\"` |\n| Keyboard buttons | ✅ | ✅ | Attach via the `message` tool `presentation` param or `channelData.maxInlineKeyboard`; presses arrive as inbound messages |\n| Unknown types | ✅ | — | Marked `[Unsupported attachment: <type>]` so the agent knows something arrived |\n| Group chats | ✅ | ✅ | Per-chat sessions; `groupPolicy` / `requireMention` gates |\n\n### Outgoing media\n\nSince **0.3.5** the plugin implements the `sendMedia` outbound adapter: the agent's\n`message` tool can attach images, video, audio and files from a URL or a local path\n(subject to the gateway's outbound-media access rules). Uploads go through the raw\n`POST /uploads` endpoint because max-bot-api 0.2.5 drops the upload token on the\nBuffer code path. Since **0.5.0** http(s) **image** URLs are attached by link\n(`payload.url`, no re-upload) after a private/loopback host check; every other\nremote file is still downloaded through the SSRF guard and uploaded. Since **0.6.0**\nseveral attached images/videos are grouped into **albums** of up to 12 per message\n(the MAX limit); audio and files always go one per message, and the tool result\ncarries every sent message id.\n\nPer-message send options (reply path, alongside the keyboard pattern):\n`channelData.maxNotify: false` sends silently, `channelData.maxDisableLinkPreview: true`\nsuppresses link previews. Channel-wide defaults: `channels.max.notify` /\n`channels.max.disableLinkPreview`. The core `silent` flag maps to `notify: false`\non the outbound adapter.\n\n### Multimodal models (images & PDFs)\n\n```json\n{\n  \"agents\": {\n    \"defaults\": {\n      \"imageModel\": \"kimi/kimi-for-coding\",\n      \"pdfModel\": \"kimi/kimi-for-coding\"\n    }\n  }\n}\n```\n\n## Development\n\n```bash\nnpm run dev    # watch mode\nnpm run build  # build to dist/\nnpm test       # vitest + SDK import guard (check:sdk)\n```\n\nThe MAX API surface is pinned by a schema-conformance test against a snapshot of\nthe official schema (`src/__fixtures__/max-schema-*.yaml`). Refresh it with\n`npm run schema:update` (clones max-messenger/api-schema); a failing conformance\ntest afterwards means MAX renamed or removed something the plugin relies on.\nChat-administration and comment-thread update types (`bot_added`, `dialog_*`,\n`comment_*`, …) are deliberately ignored and noted once per type at debug level.\n\n## Troubleshooting\n\n### Bot is silent\n- Check the token (`GET /me` is verified at startup in webhook mode)\n- Without `webhookUrl` the plugin uses polling — make sure no webhook is stuck in MAX (delete it in bot settings)\n- With `dmPolicy: \"allowlist\"`, add your MAX user ID to `allowFrom`\n\n### Bot is silent in a group chat\n- With `groupPolicy: \"allowlist\"` the chat id (negative) must appear in `groups` (or be covered by `\"*\"`), and the sender in `groupAllowFrom` when it is non-empty\n- With `requireMention` the bot answers only when @-mentioned by username or replied to — check the log for `group message dropped: bot not mentioned`\n- Drops are always logged: `[MAX] group message dropped: <reason> (chat=<id>)`\n\n### A sticker action fails with \"stickerId is required\"\n- Stickers are echo-only: pass a code from a `[Sticker (code …)]` marker of a\n  recently received sticker (cached 30 minutes per chat), or have the user send a\n  sticker first. There is no sticker catalog.\n\n### Edit fails with \"7 days in dialogs\"\n- Bot messages in dialogs can be edited within 7 days; messages with an inline\n  keyboard or in groups/channels have no time limit. Deletion has no time limit.\n  Bursts are capped at 2 operations per second per chat.\n\n### Messages arrive but no replies (`GatewayDrainingError`)\n- Symptom: gateway logs show `[MAX] inbound: …` followed by\n  `Gateway is draining; new tasks are not accepted`. This is the OpenClaw ≥ 2026.9\n  root-work admission issue described at the top of this README — update the plugin\n  to ≥ 0.3.4.\n- `openclaw channels status` should show `MAX Messenger default: enabled, configured, running, connected`; if it shows `not-running`, update to ≥ 0.3.4 (earlier versions never reported channel status).\n\n### TLS errors to platform-api2.max.ru\n- Update to plugin ≥ 0.2.0 (bundles the Минцифры CAs) or install them system-wide (see above)\n\n### Context feels reset\n- Daily 04:00 reset and `/new` are default OpenClaw behavior, not a bug — see \"How sessions behave\"\n- Repeated 🧹 notices on small-context models were fixed in OpenClaw 2026.7.1 (#100621)\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Links\n\n- [MAX Bot API docs](https://dev.max.ru/docs-api)\n- [max-bot-api-client-ts](https://github.com/max-messenger/max-bot-api-client-ts)\n- [OpenClaw](https://github.com/openclaw/openclaw)\n- Issues: [github.com/AlexBessarabenko/openclaw-max-plugin/issues](https://github.com/AlexBessarabenko/openclaw-max-plugin/issues)\n","readmeFilename":"README.md"}