{"_id":"@dexterid/baileys","_rev":"4-f76ea1a25d0f3c2cd9feebb202b5498c","name":"@dexterid/baileys","dist-tags":{"latest":"2.2.9"},"versions":{"2.2.6":{"name":"@dexterid/baileys","version":"2.2.6","keywords":["baileys","baileys-mod","baileys-fork","dexter","dexterbot","dextertechdevil","baileys-advanced","whiskeysockets","whatsapp","whatsapp-api","whatsapp-web","whatsapp-bot","whatsapp-automation","whatsapp-web-api","whatsapp-client","whatsapp-multidevice","whatsapp-business","whatsapp-interactive","whatsapp-buttons","whatsapp-carousel","whatsapp-sticker","whatsapp-media","whatsapp-group","whatsapp-newsletter","whatsapp-channel","whatsapp-status","whatsapp-pairing","wa-api","wa-bot","wa-web","automation","bot","chatbot","messaging","websocket","multi-device","multidevice","interactive-messages","buttons","carousels","products","events","payments","polls","albums","sticker-pack","nodejs","typescript","javascript","esm","dexter-tech-devil","ios-buttons","native-flow-buttons","dexterid"],"author":{"url":"WhatsApp: +94 78 995 8225","name":"DEXTER TECH DEVIL"},"license":"MIT","_id":"@dexterid/baileys@2.2.6","maintainers":[{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"}],"homepage":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/","bugs":{"url":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/issues"},"dist":{"shasum":"f90a64bdb1937e9895ced94f5b0a6eeba06c8e26","tarball":"https://registry.npmjs.org/@dexterid/baileys/-/baileys-2.2.6.tgz","fileCount":110,"integrity":"sha512-u3a+8lSwKnhhix6K35K9+3nuL+qQsEBIKh1GyvZTwmVtZ2OnrDK1bRZn5/IcSY180HFFiqEgAHSZKkSKk/ILSg==","signatures":[{"sig":"MEQCIHbxwzLt8JFUTCGraF1TRmehtp1iuyruaQoqFEtTgfZ/AiA4g5sMDqx43Sz4RzuyjBerhgLBatXLglcIoKU76PK0Nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6413344},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","$schema":"https://json.schemastore.org/package.json","engines":{"node":">=20.0.0"},"gitHead":"8fd9a0ca6d51ca64203ecf783505ce0d41ee715c","scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","example":"node --inspect -r ts-node/register Example/example.ts","prepack":"echo 'DEXTER TECH DEVIL WhatsApp Library'","prepare":"echo 'DEXTER TECH DEVIL WhatsApp Library'","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:update":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","generate:license":"npx license","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"},"repository":{"url":"git+https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys.git","type":"git"},"_npmVersion":"10.8.2","description":"Advanced WhatsApp Web API built on Baileys with iOS-friendly native-flow buttons and no unsolicited newsletter following.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ws":"latest","keyv":"^5.6.0","pino":"^9.6","uuid":"latest","axios":"^1.6.0","fflate":"^0.8.2","p-queue":"^9.0.0","prismjs":"^1.30.0","rlottie":"^0.1.2","file-type":"^22.0.1","lru-cache":"^11.1.0","unfurl.js":"^6.4.0","@hapi/boom":"^9.1.3","@keyv/etcd":"^2.1.1","protobufjs":"latest","@keyv/mongo":"^3.1.0","@keyv/mysql":"^2.1.10","@keyv/redis":"^5.1.6","async-mutex":"^0.5.0","@keyv/sqlite":"^4.0.8","cache-manager":"latest","ffmpeg-static":"^5.3.0","@keyv/memcache":"^2.0.2","@keyv/postgres":"^2.2.3","music-metadata":"^11.7.0","url-regex-safe":"^4.0.0","gradient-string":"^2.0.2","qrcode-terminal":"^0.12.0","libphonenumber-js":"^1.13.3","wa-sticker-formatter":"^4.4.4","whatsapp-rust-bridge":"latest","@adiwajshing/keyed-db":"^0.2.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.0","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","ts-node":"^10.9.2","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^15.10.3","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","@types/sharp":"^0.31.1","protobufjs-cli":"^1.1.3","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"*","sharp":"*"},"peerDependenciesMeta":{"jimp":{"optional":true},"sharp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/baileys_2.2.6_1787905027772_0.7352082110139562","host":"s3://npm-registry-packages-npm-production"}},"2.2.7":{"name":"@dexterid/baileys","version":"2.2.7","keywords":["baileys","baileys-mod","baileys-fork","dexter","dexterbot","dextertechdevil","baileys-advanced","whiskeysockets","whatsapp","whatsapp-api","whatsapp-web","whatsapp-bot","whatsapp-automation","whatsapp-web-api","whatsapp-client","whatsapp-multidevice","whatsapp-business","whatsapp-interactive","whatsapp-buttons","whatsapp-carousel","whatsapp-sticker","whatsapp-media","whatsapp-group","whatsapp-newsletter","whatsapp-channel","whatsapp-status","whatsapp-pairing","wa-api","wa-bot","wa-web","automation","bot","chatbot","messaging","websocket","multi-device","multidevice","interactive-messages","buttons","carousels","products","events","payments","polls","albums","sticker-pack","nodejs","typescript","javascript","esm","dexter-tech-devil","ios-buttons","native-flow-buttons","dexterid"],"author":{"url":"WhatsApp: +94 78 995 8225","name":"DEXTER TECH DEVIL"},"license":"MIT","_id":"@dexterid/baileys@2.2.7","maintainers":[{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"}],"homepage":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/","bugs":{"url":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/issues"},"dist":{"shasum":"575b858cef4d50df65de4139c6d4a96e0c534d6f","tarball":"https://registry.npmjs.org/@dexterid/baileys/-/baileys-2.2.7.tgz","fileCount":109,"integrity":"sha512-hLTxt80fL6lD7ynQvI5kaPdyrBc2CDbJmBpcCpI2jVhdFJLDuxrvm5JWlAeAnyhJ/5D2bllFc/65hefHhaK6bQ==","signatures":[{"sig":"MEQCIBaGfShEuPrqAi9zrFpuxkWkT4uLqtX84M3AbVKvoiVSAiAR5pWAU0yi8CurGyR2Rf9m8cky1NIAsitkMr16sUpOsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6405848},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","$schema":"https://json.schemastore.org/package.json","engines":{"node":">=20.0.0"},"gitHead":"5cf0fbf1168156acbce11020d1dc9a5a9048d924","scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","example":"node --inspect -r ts-node/register Example/example.ts","prepack":"echo 'DEXTER TECH DEVIL WhatsApp Library'","prepare":"echo 'DEXTER TECH DEVIL WhatsApp Library'","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:update":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","generate:license":"npx license","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"},"repository":{"url":"git+https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys.git","type":"git"},"_npmVersion":"10.8.2","description":"Advanced WhatsApp Web API built on Baileys with iOS-friendly native-flow buttons and no unsolicited newsletter following.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ws":"latest","keyv":"^5.6.0","pino":"^9.6","uuid":"latest","axios":"^1.6.0","fflate":"^0.8.2","p-queue":"^9.0.0","prismjs":"^1.30.0","rlottie":"^0.1.2","file-type":"^22.0.1","lru-cache":"^11.1.0","unfurl.js":"^6.4.0","@hapi/boom":"^9.1.3","@keyv/etcd":"^2.1.1","protobufjs":"latest","@keyv/mongo":"^3.1.0","@keyv/mysql":"^2.1.10","@keyv/redis":"^5.1.6","async-mutex":"^0.5.0","@keyv/sqlite":"^4.0.8","cache-manager":"latest","ffmpeg-static":"^5.3.0","@keyv/memcache":"^2.0.2","@keyv/postgres":"^2.2.3","music-metadata":"^11.7.0","url-regex-safe":"^4.0.0","gradient-string":"^2.0.2","qrcode-terminal":"^0.12.0","libphonenumber-js":"^1.13.3","wa-sticker-formatter":"^4.4.4","whatsapp-rust-bridge":"latest","@adiwajshing/keyed-db":"^0.2.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.0","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","ts-node":"^10.9.2","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^15.10.3","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","@types/sharp":"^0.31.1","protobufjs-cli":"^1.1.3","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"*","sharp":"*"},"peerDependenciesMeta":{"jimp":{"optional":true},"sharp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/baileys_2.2.7_1787905260615_0.552044291166204","host":"s3://npm-registry-packages-npm-production"}},"2.2.8":{"name":"@dexterid/baileys","version":"2.2.8","keywords":["baileys","baileys-mod","baileys-fork","dexter","dexterbot","dextertechdevil","baileys-advanced","whiskeysockets","whatsapp","whatsapp-api","whatsapp-web","whatsapp-bot","whatsapp-automation","whatsapp-web-api","whatsapp-client","whatsapp-multidevice","whatsapp-business","whatsapp-interactive","whatsapp-buttons","whatsapp-carousel","whatsapp-sticker","whatsapp-media","whatsapp-group","whatsapp-newsletter","whatsapp-channel","whatsapp-status","whatsapp-pairing","wa-api","wa-bot","wa-web","automation","bot","chatbot","messaging","websocket","multi-device","multidevice","interactive-messages","buttons","carousels","products","events","payments","polls","albums","sticker-pack","nodejs","typescript","javascript","esm","dexter-tech-devil","ios-buttons","native-flow-buttons","dexterid"],"author":{"url":"WhatsApp: +94 78 995 8225","name":"DEXTER TECH DEVIL"},"license":"MIT","_id":"@dexterid/baileys@2.2.8","maintainers":[{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"}],"homepage":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/","bugs":{"url":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/issues"},"dist":{"shasum":"67c73a35f8b77dff5235a064422c76937968ed9c","tarball":"https://registry.npmjs.org/@dexterid/baileys/-/baileys-2.2.8.tgz","fileCount":109,"integrity":"sha512-qK9n1fIDtc9SBTW6hSZEHZhJSjWs24TOG5C+CjtA1qb/oeSVOVSo0B3AzDy0Ipy/a2CHjK8o2YjVUxU01Tg/7A==","signatures":[{"sig":"MEUCIQD08gcamhUOktGRz0I5xDhFniShTs5UPKZ8ZnS6HqysNAIgByYhRlgY9pXmOn4HLAklf4JgN+1RYrO6lSV7hzc9PD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6405843},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","$schema":"https://json.schemastore.org/package.json","engines":{"node":">=20.0.0"},"gitHead":"c1c695ac811650bde5149bebd4bfdf07ab94e395","scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","example":"node --inspect -r ts-node/register Example/example.ts","prepack":"echo 'DEXTER TECH DEVIL WhatsApp Library'","prepare":"echo 'DEXTER TECH DEVIL WhatsApp Library'","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:update":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","generate:license":"npx license","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"},"repository":{"url":"git+https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys.git","type":"git"},"_npmVersion":"10.8.2","description":"Advanced WhatsApp Web API built on Baileys with iOS-friendly native-flow buttons and no unsolicited newsletter following.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ws":"latest","keyv":"^5.6.0","pino":"^9.6","uuid":"latest","axios":"^1.6.0","fflate":"^0.8.2","p-queue":"^9.0.0","prismjs":"^1.30.0","rlottie":"^0.1.2","file-type":"^22.0.1","lru-cache":"^11.1.0","unfurl.js":"^6.4.0","@hapi/boom":"^9.1.3","@keyv/etcd":"^2.1.1","protobufjs":"latest","@keyv/mongo":"^3.1.0","@keyv/mysql":"^2.1.10","@keyv/redis":"^5.1.6","async-mutex":"^0.5.0","@keyv/sqlite":"^4.0.8","cache-manager":"latest","ffmpeg-static":"^5.3.0","@keyv/memcache":"^2.0.2","@keyv/postgres":"^2.2.3","music-metadata":"^11.7.0","url-regex-safe":"^4.0.0","gradient-string":"^2.0.2","qrcode-terminal":"^0.12.0","libphonenumber-js":"^1.13.3","wa-sticker-formatter":"^4.4.4","whatsapp-rust-bridge":"latest","@adiwajshing/keyed-db":"^0.2.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.0","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","ts-node":"^10.9.2","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^15.10.3","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","@types/sharp":"^0.31.1","protobufjs-cli":"^1.1.3","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"*","sharp":"*"},"peerDependenciesMeta":{"jimp":{"optional":true},"sharp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/baileys_2.2.8_1787905751614_0.11968297806863992","host":"s3://npm-registry-packages-npm-production"}},"2.2.9":{"$schema":"https://json.schemastore.org/package.json","name":"@dexterid/baileys","type":"module","version":"2.2.9","description":"Advanced WhatsApp Web API built on Baileys with iOS-friendly native-flow buttons and no unsolicited newsletter following.","keywords":["baileys","baileys-mod","baileys-fork","dexter","dexterbot","dextertechdevil","baileys-advanced","whiskeysockets","whatsapp","whatsapp-api","whatsapp-web","whatsapp-bot","whatsapp-automation","whatsapp-web-api","whatsapp-client","whatsapp-multidevice","whatsapp-business","whatsapp-interactive","whatsapp-buttons","whatsapp-carousel","whatsapp-sticker","whatsapp-media","whatsapp-group","whatsapp-newsletter","whatsapp-channel","whatsapp-status","whatsapp-pairing","wa-api","wa-bot","wa-web","automation","bot","chatbot","messaging","websocket","multi-device","multidevice","interactive-messages","buttons","carousels","products","events","payments","polls","albums","sticker-pack","nodejs","typescript","javascript","esm","dexter-tech-devil","ios-buttons","native-flow-buttons","dexterid"],"homepage":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/","bugs":{"url":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/issues"},"repository":{"type":"git","url":"git+https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys.git"},"license":"MIT","author":{"name":"DEXTER TECH DEVIL","url":"WhatsApp: +94 78 995 8225"},"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"build:all":"tsc && typedoc","build:docs":"typedoc","build:tsc":"tsc","generate:license":"npx license","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u","changelog:update":"conventional-changelog -p angular -i CHANGELOG.md -s -r 0","example":"node --inspect -r ts-node/register Example/example.ts","gen:protobuf":"sh WAProto/GenerateStatics.sh","lint":"eslint src --ext .js,.ts,.jsx,.tsx","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","prepack":"echo 'DEXTER TECH DEVIL WhatsApp Library'","prepare":"echo 'DEXTER TECH DEVIL WhatsApp Library'","preinstall":"node ./engine-requirements.js","release":"release-it","test":"jest"},"dependencies":{"@adiwajshing/keyed-db":"^0.2.4","@cacheable/node-cache":"^1.4.0","@hapi/boom":"^9.1.3","@keyv/etcd":"^2.1.1","@keyv/memcache":"^2.0.2","@keyv/mongo":"^3.1.0","@keyv/mysql":"^2.1.10","@keyv/postgres":"^2.2.3","@keyv/redis":"^5.1.6","@keyv/sqlite":"^4.0.8","async-mutex":"^0.5.0","axios":"^1.6.0","cache-manager":"latest","fflate":"^0.8.2","ffmpeg-static":"^5.3.0","file-type":"^22.0.1","gradient-string":"^2.0.2","keyv":"^5.6.0","libphonenumber-js":"^1.13.3","lru-cache":"^11.1.0","music-metadata":"^11.7.0","p-queue":"^9.0.0","pino":"^9.6","prismjs":"^1.30.0","protobufjs":"latest","qrcode-terminal":"^0.12.0","rlottie":"^0.1.2","unfurl.js":"^6.4.0","url-regex-safe":"^4.0.0","uuid":"latest","wa-sticker-formatter":"^4.4.4","whatsapp-rust-bridge":"latest","ws":"latest"},"devDependencies":{"@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.31.0","@types/jest":"^30.0.0","@types/node":"^20.9.0","@types/sharp":"^0.31.1","@types/ws":"^8.0.0","@typescript-eslint/eslint-plugin":"^8","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog":"^7.1.1","conventional-changelog-angular":"^8.0.0","esbuild-register":"^3.6.0","eslint":"^9","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","jest":"^30.0.5","jimp":"^1.6.0","jiti":"^2.4.2","json":"^11.0.0","lru-cache":"^11.1.0","open":"^8.4.2","pino-pretty":"^13.1.1","prettier":"^3.5.3","protobufjs-cli":"^1.1.3","release-it":"^15.10.3","ts-jest":"^29.4.0","ts-node":"^10.9.2","tsc-esm-fix":"^3.1.2","tsx":"^4.20.3","typedoc":"^0.27.9","typedoc-plugin-markdown":"4.4.2","typescript":"^5.8.2"},"peerDependencies":{"jimp":"*","sharp":"*"},"peerDependenciesMeta":{"jimp":{"optional":true},"sharp":{"optional":true}},"packageManager":"yarn@4.9.2","engines":{"node":">=20.0.0"},"_id":"@dexterid/baileys@2.2.9","gitHead":"d3ffb74a0b96f7044b0e2d23f9d642786cf8b7a7","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-4LbsWEm+aWLH/kPFLBPLGTbm6JenpbO8I6zScE8aPJPV43WC3mKdNx5pEfyNtl5STf17tCC2D/YPmezM/J5Hhw==","shasum":"61389dcca92693c20d9acc13e3361f0e5782970c","tarball":"https://registry.npmjs.org/@dexterid/baileys/-/baileys-2.2.9.tgz","fileCount":110,"unpackedSize":7747643,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGm39oNSsVEr0snk3Auj+ARrlI7MQlM92HAJfrgV9pdFAiBzDDXTwZHHD8AGHHF8BVk9cXI5IkuPdDfh5liM7iSCTQ=="}]},"_npmUser":{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"},"directories":{},"maintainers":[{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/baileys_2.2.9_1787905778694_0.36426512726205407"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-28T08:17:07.525Z","modified":"2026-08-28T08:29:39.132Z","2.2.6":"2026-08-28T08:17:07.943Z","2.2.7":"2026-08-28T08:21:00.779Z","2.2.8":"2026-08-28T08:29:11.768Z","2.2.9":"2026-08-28T08:29:38.884Z"},"bugs":{"url":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/issues"},"author":{"name":"DEXTER TECH DEVIL","url":"WhatsApp: +94 78 995 8225"},"license":"MIT","homepage":"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/","keywords":["baileys","baileys-mod","baileys-fork","dexter","dexterbot","dextertechdevil","baileys-advanced","whiskeysockets","whatsapp","whatsapp-api","whatsapp-web","whatsapp-bot","whatsapp-automation","whatsapp-web-api","whatsapp-client","whatsapp-multidevice","whatsapp-business","whatsapp-interactive","whatsapp-buttons","whatsapp-carousel","whatsapp-sticker","whatsapp-media","whatsapp-group","whatsapp-newsletter","whatsapp-channel","whatsapp-status","whatsapp-pairing","wa-api","wa-bot","wa-web","automation","bot","chatbot","messaging","websocket","multi-device","multidevice","interactive-messages","buttons","carousels","products","events","payments","polls","albums","sticker-pack","nodejs","typescript","javascript","esm","dexter-tech-devil","ios-buttons","native-flow-buttons","dexterid"],"repository":{"type":"git","url":"git+https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys.git"},"description":"Advanced WhatsApp Web API built on Baileys with iOS-friendly native-flow buttons and no unsolicited newsletter following.","maintainers":[{"name":"dexter77392006","email":"ridmaalahakoon3223@gmail.com"}],"readme":"<div align=\"center\">\n\n<p>\n  <!-- DEXTER TECH DEVIL package logo -->\n  <img src=\"https://raw.githubusercontent.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/main/assets/dexterid-baileys-logo.png\" alt=\"@dexterid/baileys logo — DEXTER TECH DEVIL\" width=\"420\" />\n</p>\n\n# @dexterid/baileys\n\n\n**DEXTER TECH DEVIL WhatsApp Web API — Built on WhiskeySockets/Baileys**\n\n<p>\n  <!-- NPM Version -->\n  <a href=\"https://www.npmjs.com/package/@dexterid/baileys\">\n    <img src=\"https://img.shields.io/npm/v/@dexterid/baileys?color=success&logo=npm&style=flat-square\" alt=\"NPM Version\" />\n  </a>\n  <!-- Downloads -->\n  <a href=\"https://www.npmjs.com/package/@dexterid/baileys\">\n    <img src=\"https://img.shields.io/npm/dt/@dexterid/baileys?color=blue&logo=npm&style=flat-square\" alt=\"Downloads\" />\n  </a>\n  <!-- License -->\n  <a href=\"https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys/blob/main/LICENSE\">\n    <img src=\"https://img.shields.io/npm/l/@dexterid/baileys?color=yellow&style=flat-square\" alt=\"License\" />\n  </a>\n  <!-- Node Version -->\n  <a href=\"https://nodejs.org\">\n    <img src=\"https://img.shields.io/node/v/@dexterid/baileys?style=flat-square\" alt=\"Node Version\" />\n  </a>\n  <!-- Socket Badge -->\n  <a href=\"https://socket.dev/npm/package/@dexterid/baileys\">\n    <img src=\"https://socket.dev/api/badge/npm/package/@dexterid/baileys\" alt=\"Socket Badge\" />\n  </a>\n</p>\n<p>\n  <!-- WhatsApp Channel -->\n  <a href=\"https://www.whatsapp.com/channel/0029VbBK53XBvvslYeZlBe0V\">\n    <img src=\"https://img.shields.io/badge/Join-WhatsApp%20Channel-25D366?logo=whatsapp&logoColor=white\" alt=\"WhatsApp Channel\" />\n  </a>\n</p>\n\n*Modern, feature-rich, and developer-friendly WhatsApp automation library*\n\n</div>\n\n---\n\n## 📱 DEXTER TECH DEVIL Contact\n\nWhatsApp: [+94 78 995 8225](https://wa.me/94789958225)\n\nWhatsApp JID examples use `94789958225@s.whatsapp.net`.\n\n## 📋 Table of Contents\n\n- [Installation](#-installation)\n- [Quick Start](#-quick-start)\n- [Authentication](#-authentication)\n- [Browser Options](#-browser-options)\n- [Socket Configuration](#-socket-configuration)\n- [Session Management](#-session-management)\n  - [File-based](#file-based-default)\n  - [Keyv-based (MongoDB, Redis, PostgreSQL, SQLite...)](#keyv-based-production)\n  - [Per-type routing](#per-type-routing-advanced)\n- [Sending Messages](#-sending-messages)\n  - [Text Messages](#text-messages)\n  - [Media Messages](#media-messages)\n  - [Buttons & Interactive](#buttons--interactive-messages)\n  - [Extended Types](#extended-message-types)\n  - [AI Rich Messages](#ai-rich-messages)\n  - [Status & Stories](#personal-status--story-statusbroadcast)\n  - [Sticker Pack](#sticker-pack)\n  - [Shorthand Wrappers](#shorthand-wrappers)\n- [Message Modifications](#️-message-modifications)\n- [Media Download](#-media-download)\n- [Group Management](#-group-management)\n  - [AI Groups](#ai-groups)\n- [User Operations](#-user-operations)\n  - [Usernames](#usernames)\n- [Check Number Status](#ban-checker)\n- [Privacy Controls](#-privacy-controls)\n- [Chat Operations](#-chat-operations)\n- [Newsletter / Channels](#-newsletter--channels)\n- [Events Reference](#-events-reference)\n- [Best Practices](#-best-practices)\n- [Disclaimer](#️-disclaimer)\n\n---\n\n## 📦 Installation\n\n```bash\n# npm\nnpm install @dexterid/baileys\n\n# yarn\nyarn add @dexterid/baileys\n```\n\n**Drop-in replacement for `@whiskeysockets/baileys`** — add this to `package.json`:\n```json\n{\n  \"dependencies\": {\n    \"@whiskeysockets/baileys\": \"npm:@dexterid/baileys\"\n  }\n}\n\n               // OR\n\n{\n    \"dependencies\": {\n        \"@dexterid/baileys\": \"latest\"\n    }\n}\n```\n\n**Import:**\n```javascript\n// ESM (recommended)\nimport makeWASocket from '@dexterid/baileys'\n\n// CommonJS\nconst { default: makeWASocket } = require('@dexterid/baileys')\n```\n\n---\n\n## 🚀 Quick Start\n\n```javascript\nimport makeWASocket, {\n  useMultiFileAuthState,\n  DisconnectReason,\n  makeCacheableSignalKeyStore,\n  Browsers\n} from '@dexterid/baileys'\nimport pino from 'pino'\n\nconst connectToWhatsApp = async () => {\n  const { state, saveCreds } = await useMultiFileAuthState('auth_session')\n  const logger = pino({ level: 'silent' })\n\n  const sock = makeWASocket({\n    auth: {\n      creds: state.creds,\n      keys: makeCacheableSignalKeyStore(state.keys, logger)\n    },\n    browser: Browsers.ubuntu('Chrome'),\n    generateHighQualityLinkPreview: true,\n    logger\n  })\n\n  sock.ev.on('connection.update', ({ connection, lastDisconnect }) => {\n    if (connection === 'close') {\n      const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut\n      if (shouldReconnect) connectToWhatsApp()\n    } else if (connection === 'open') {\n      console.log('✅ Connected!')\n    }\n  })\n\n  sock.ev.on('creds.update', saveCreds)\n\n  sock.ev.on('messages.upsert', async ({ messages }) => {\n    for (const msg of messages) {\n      if (!msg.key.fromMe && msg.message) {\n        await sock.sendMessage(msg.key.remoteJid, { text: 'Hello!' })\n      }\n    }\n  })\n}\n\nconnectToWhatsApp()\n```\n\n---\n\n## 🔐 Authentication\n\n### Pairing Code (Recommended)\n\nNo QR scanning — just a phone number. Call `requestPairingCode` directly after creating the socket. The socket internally waits for the WebSocket to be ready before sending the request, so **no manual polling or delays needed on your end**.\n\n```javascript\nimport makeWASocket, {\n  useMultiFileAuthState,\n  makeCacheableSignalKeyStore,\n  Browsers\n} from '@dexterid/baileys'\nimport pino from 'pino'\n\nconst { state, saveCreds } = await useMultiFileAuthState('auth_session')\nconst logger = pino({ level: 'silent' })\n\nconst sock = makeWASocket({\n  auth: {\n    creds: state.creds,\n    keys: makeCacheableSignalKeyStore(state.keys, logger)\n  },\n  browser: Browsers.ubuntu('Chrome'),\n  logger\n})\n\nsock.ev.on('creds.update', saveCreds)\n\n// Just call it — no need to wait or poll for WS state\nif (!sock.authState.creds.registered) {\n  const code = await sock.requestPairingCode('1234567890') // digits only, no + or spaces\n  console.log('Pairing code:', code)\n}\n```\n\n### Custom Pairing Code\n\n```javascript\n// Must be exactly 8 characters\nconst code = await sock.requestPairingCode('1234567890', 'DEXTER001')\nconsole.log('Custom code:', code)\n```\n\n### QR Code\n\nScan the QR with your WhatsApp mobile app under **Linked Devices**.\n\n```javascript\nimport makeWASocket, {\n  useMultiFileAuthState,\n  makeCacheableSignalKeyStore,\n  Browsers\n} from '@dexterid/baileys'\nimport qrcode from 'qrcode-terminal'\nimport pino from 'pino'\n\nconst { state, saveCreds } = await useMultiFileAuthState('auth_session')\nconst logger = pino({ level: 'silent' })\n\nconst sock = makeWASocket({\n  auth: {\n    creds: state.creds,\n    keys: makeCacheableSignalKeyStore(state.keys, logger)\n  },\n  browser: Browsers.ubuntu('Chrome'),\n  logger\n})\n\nsock.ev.on('connection.update', ({ connection, qr, lastDisconnect }) => {\n  if (qr) qrcode.generate(qr, { small: true })\n  if (connection === 'open') console.log('✅ Connected!')\n  if (connection === 'close') {\n    const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut\n    if (shouldReconnect) connectToWhatsApp()\n  }\n})\n\nsock.ev.on('creds.update', saveCreds)\n```\n\nInstall the QR renderer: `npm install qrcode-terminal`\n\n---\n\n## 🌐 Browser Options\n\nThe `browser` config tells WhatsApp what client you appear to be. This affects how WhatsApp treats your session and which features it enables.\n\n| Option | Value | Notes |\n|--------|-------|-------|\n| `Browsers.ubuntu('Chrome')` | `['Ubuntu', 'Chrome', '22.04.4']` | ✅ Recommended — stable, widely used |\n| `Browsers.macOS('Safari')` | `['Mac OS', 'Safari', '14.4.1']` | Good alternative |\n| `Browsers.windows('Chrome')` | `['Windows', 'Chrome', '10.0.22631']` | Works well |\n| `Browsers.baileys('Desktop')` | `['Baileys', 'Desktop', '6.5.0']` | Identifies as Baileys explicitly |\n| `Browsers.appropriate('Chrome')` | Auto-detects your OS | Uses your actual platform |\n\n```javascript\nimport { Browsers } from '@dexterid/baileys'\n\n// Pass any browser string as the second argument (Chrome, Safari, Firefox, etc.)\nconst sock = makeWASocket({\n  browser: Browsers.ubuntu('Chrome')   // recommended\n  // browser: Browsers.macOS('Safari')\n  // browser: Browsers.windows('Chrome')\n  // browser: Browsers.appropriate('Chrome') // auto-detects your server OS\n})\n```\n\n---\n\n## ⚙️ Socket Configuration\n\nKey options from `DEFAULT_CONNECTION_CONFIG`:\n\n```javascript\nconst sock = makeWASocket({\n  // Required\n  auth: { creds, keys },\n\n  // Browser identity\n  browser: Browsers.ubuntu('Chrome'),\n\n  // Link preview quality (true = upload full image, false = compressed local thumb)\n  generateHighQualityLinkPreview: true,\n\n  // Cache group metadata to avoid repeated fetches\n  cachedGroupMetadata: async (jid) => groupCache.get(jid),\n\n  // Suppress your online status when connecting\n  markOnlineOnConnect: false,\n\n  // Sync full message history on connect\n  syncFullHistory: false,\n\n  // Logger (use pino({ level: 'silent' }) to suppress logs)\n  logger: pino({ level: 'silent' }),\n\n  // Connection timeout in ms\n  connectTimeoutMs: 60000,\n\n  // Max retries for failed message sends\n  maxMsgRetryCount: 5,\n\n  // Custom message retrieval for retry/poll decryption\n  getMessage: async (key) => store.loadMessage(key.remoteJid, key.id),\n})\n```\n---\n\n## 💾 Session Management\n\nTwo adapters are available. They do **not** share an identical return shape — see the differences noted below each.\n\n### File-based (default)\n\nAtomic writes, sha256 checksum integrity, per-file mutex locking, corrupt file recovery, and legacy file upgrade. Best for single-instance bots or local development.\n\n```javascript\nimport { useMultiFileAuthState } from '@dexterid/baileys'\n\nconst { state, saveCreds, getStats } = await useMultiFileAuthState('auth_session', {\n    preKeyRetention:   150,  // how many recent prekeys to keep (default: 150)\n    cleanupThreshold:  50,   // new prekeys before a cleanup runs (default: 50)\n    logger,                  // optional — logs checksum mismatches and cleanup events\n})\n\nconst sock = makeWASocket({ auth: state })\nsock.ev.on('creds.update', saveCreds)\n\n// Diagnostics\nconst stats = await getStats()\n// { totalFiles: 42, preKeyCount: 150, nextPreKeyId: 3200, lastCleanupAt: '2026-07-05T...' }\n```\n\nTo fully log out and delete a session's files, remove the session folder directly (e.g. `fs.rm(folder, { recursive: true, force: true })`) — there is no `clearSession`/`close` method on this adapter.\n\n### Keyv-based (production)\n\nUniversal adapter for any database backend via [Keyv](https://github.com/jaredwray/keyv). Pass a connection string — the matching backend driver is resolved and imported automatically, no manual adapter imports needed.\n\nStorage format matches `useMultiFileAuthState` exactly: every value is wrapped as `{ data, __checksum }` with a sha256 integrity check, so corruption is detected and self-healed the same way on both adapters. Reads also auto-detect and repair values that were written by an older/buggy version of this adapter (including arbitrarily nested `{ value: { value: ... } }` wrapping) — no manual data-fixing needed if you're upgrading from an earlier release.\n\nThe first argument is the **session ID** — equivalent to the folder name in `useMultiFileAuthState`. It's used as the Keyv namespace, so multiple bots can safely share one backend. The second argument is a connection string, a pre-built `Keyv` instance, or a raw `KeyvStoreAdapter`:\n\n```javascript\nimport { useKeyvAuthState } from '@dexterid/baileys'\n\n// ── Redis ─────────────────────────────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'redis://localhost:6379')\n\n// ── PostgreSQL / Supabase / Neon ──────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'postgresql://user:pass@localhost/db')\n\n// ── MongoDB ───────────────────────────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'mongodb://localhost/baileys')\n\n// ── MySQL / PlanetScale ───────────────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'mysql://user:pass@localhost/db')\n\n// ── SQLite (local, zero-config) ───────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'sqlite://auth.db')\n\n// ── etcd ──────────────────────────────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'etcd://localhost:2379')\n\n// ── Memcache ──────────────────────────────────────────────────────────────────\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'memcache://localhost:11211')\n\n// ── In-memory (testing / ephemeral — data lost on restart) ───────────────────\nconst { state, saveCreds } = await useKeyvAuthState('test')\n```\n\nSupported connection string protocols: `redis:`/`rediss:`, `mongodb:`/`mongodb+srv:`, `postgres:`/`postgresql:`, `mysql:`, `sqlite:`, `etcd:`, `memcache:`/`memcached:`. All matching driver packages (`@keyv/redis`, `@keyv/mongo`, `@keyv/postgres`, `@keyv/mysql`, `@keyv/sqlite`, `@keyv/etcd`, `@keyv/memcache`) ship as regular dependencies of this package — nothing extra to install.\n\nFor backends without a connection string (e.g. DynamoDB), or to reuse one connection across multiple `useKeyvAuthState` calls yourself, pass a pre-built adapter or `Keyv` instance instead of a string:\n\n```javascript\nimport { useKeyvAuthState } from '@dexterid/baileys'\nimport KeyvMongo from '@keyv/mongo'\n\nconst backend = new KeyvMongo('mongodb://localhost/baileys') // build once, share across sessions\nconst { state, saveCreds } = await useKeyvAuthState('bot1', backend)\n```\n\nSame connection string passed as a plain string is automatically cached and reused across every `useKeyvAuthState` call in the process — you don't need to build the instance yourself just to avoid opening duplicate connections, but you can if you want the reference for other purposes.\n\nBy default, Mongo/Postgres/MySQL/SQLite store everything in a collection/table named `keyv` (each adapter's own default). Set `collectionName` to use your own name instead — it's mapped to whatever each backend actually calls it (`collection` for Mongo, `table` for Postgres/MySQL/SQLite):\n\n```javascript\nconst { state, saveCreds } = await useKeyvAuthState('bot1', 'mongodb://localhost/baileys', {\n    collectionName: 'baileys_auth', // instead of the default \"keyv\" collection\n})\n```\n\n> Per-type backend routing (e.g. prekeys on SQLite, sessions on Postgres) is not currently supported — one `useKeyvAuthState` call uses one backend for every key type.\n\n#### Clearing a session (logout)\n\n```javascript\nconst { state, saveCreds, clearSession } = await useKeyvAuthState('bot1', 'redis://localhost:6379')\n\n// on logout / when you want to wipe this session's auth entirely:\nawait clearSession()\n```\n\n`clearSession()` wipes every key belonging to that `sessionId` — creds, prekeys, sessions, sender keys, everything — using each backend's native namespace-scoped bulk delete (a real `deleteMany`/`DELETE WHERE`/`SCAN`+delete under the hood, not a per-key loop). It only affects this session; other sessions sharing the same backend are untouched. There's no equivalent method on `useMultiFileAuthState` — delete the session folder instead.\n\n#### Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `preKeyRetention` | `number` | `150` | Number of recent prekeys to keep |\n| `cleanupThreshold` | `number` | `50` | New prekeys generated before cleanup runs |\n| `logger` | `object` | `undefined` | Logger with `.info` / `.warn` methods |\n| `collectionName` | `string` | adapter's own default (`\"keyv\"`) | Custom collection/table name — Keyv-based adapter only, ignored for connection-string-less (in-memory) and pre-built adapter/`Keyv` instances |\n\n#### Return values\n\n| | `useMultiFileAuthState` | `useKeyvAuthState` |\n|---|---|---|\n| `state` | ✅ | ✅ |\n| `saveCreds` | ✅ | ✅ |\n| `getStats` | ✅ | ❌ |\n| `clearSession` | ❌ (delete the folder instead) | ✅ |\n| `close` | ❌ | ✅ (drops local listeners; safe to call, does not disconnect a shared backend) |\n\n---\n\n## 💬 Sending Messages\n\n`sock.sendMessage(jid, content, options?)` handles **every message type**. The `jid` can be a user, group, status broadcast, or newsletter.\n\n```javascript\n// JID formats\n'1234567890@s.whatsapp.net'     // personal chat\n'123456789-987654321@g.us'      // group\n'status@broadcast'               // story/status\n'120363...@newsletter'           // newsletter channel\n```\n\n### Text Messages\n\n```javascript\n// Plain text\nawait sock.sendMessage(jid, { text: 'Hello World!' })\n\n// With link preview (auto-detects URLs in text)\nawait sock.sendMessage(jid, { text: 'Check this out: https://github.com' })\n\n// Quote/reply\nawait sock.sendMessage(jid, { text: 'This is a reply' }, { quoted: message })\n\n// Mention users\nawait sock.sendMessage(jid, {\n  text: '@1234567890 hey!',\n  mentions: ['1234567890@s.whatsapp.net']\n})\n\n// AI-generated label\nawait sock.sendMessage(jid, { text: 'AI response here', ai: true })\n```\n\n### Media Messages\n\n> You can pass `{ url: '...' }`, a `Buffer`, a file path string, or `{ stream: Stream }` for any media type.\n\n#### Image\n```javascript\n// From URL\nawait sock.sendMessage(jid, {\n  image: { url: 'https://example.com/image.jpg' },\n  caption: 'Caption here'\n})\n\n// From Buffer\nawait sock.sendMessage(jid, { image: buffer, caption: 'From buffer' })\n\n// From file\nawait sock.sendMessage(jid, { image: fs.readFileSync('./image.jpg') })\n\n// View once\nawait sock.sendMessage(jid, { image: { url: './secret.jpg' }, viewOnce: true })\n```\n\n#### Video\n```javascript\nawait sock.sendMessage(jid, {\n  video: { url: './video.mp4' },\n  caption: 'Watch this!',\n  gifPlayback: false, // true for GIF\n  ptv: false          // true for video note (circle)\n})\n```\n\n#### Audio\n```javascript\nawait sock.sendMessage(jid, {\n  audio: { url: './audio.mp3' },\n  mimetype: 'audio/mp4',\n  ptt: true // true = voice message, false = audio file\n})\n```\n\n> Convert to voice-compatible format: `ffmpeg -i input.mp4 -avoid_negative_ts make_zero -ac 1 output.ogg`\n\n#### Document\n```javascript\nawait sock.sendMessage(jid, {\n  document: { url: './file.pdf' },\n  fileName: 'document.pdf',\n  mimetype: 'application/pdf',\n  caption: 'Here is the file'\n})\n```\n\n#### Sticker\n```javascript\nawait sock.sendMessage(jid, { sticker: { url: './sticker.webp' } })\n```\n\n#### Location\n```javascript\nawait sock.sendMessage(jid, {\n  location: {\n    degreesLatitude: 24.121231,\n    degreesLongitude: 55.1121221,\n    name: 'Location Name',\n    address: 'Full Address Here'\n  }\n})\n```\n\n#### Contact\n```javascript\nconst vcard = 'BEGIN:VCARD\\nVERSION:3.0\\nFN:John Doe\\nORG:DEXTER TECH DEVIL;\\nTEL;type=CELL;waid=94789958225:+94 78 995 8225\\nEND:VCARD'\n\nawait sock.sendMessage(jid, {\n  contacts: {\n    displayName: 'John Doe',\n    contacts: [{ vcard }]\n  }\n})\n```\n\n#### Reaction\n```javascript\nawait sock.sendMessage(jid, {\n  react: {\n    text: '💖',       // empty string removes reaction\n    key: message.key\n  }\n})\n```\n\n#### Poll\n```javascript\nawait sock.sendMessage(jid, {\n  poll: {\n    name: 'Favorite Color?',\n    values: ['Red', 'Blue', 'Green'],\n    selectableOptionsCount: 1,\n    toAnnouncementGroup: false\n  }\n})\n```\n\n#### Pin Message\n```javascript\nawait sock.sendMessage(jid, {\n  pin: {\n    type: 1,          // 0 to unpin\n    time: 86400,      // 24h = 86400 | 7d = 604800 | 30d = 2592000\n    key: message.key\n  }\n})\n```\n\n#### Keep Message\n```javascript\nawait sock.sendMessage(jid, {\n  keep: message.key,\n  type: 1,  // 2 to unkeep\n  time: 86400\n})\n```\n\n#### Disappearing Messages\n```javascript\n// Enable (seconds: 86400 = 24h, 604800 = 7d, 7776000 = 90d)\nawait sock.sendMessage(jid, { disappearingMessagesInChat: 86400 })\n\n// Disable\nawait sock.sendMessage(jid, { disappearingMessagesInChat: false })\n```\n\n#### Forward Message\n```javascript\nawait sock.sendMessage(jid, { forward: message, force: true })\n```\n\n#### Edit Message\n```javascript\nawait sock.sendMessage(jid, {\n  text: 'Updated text',\n  edit: originalMessage.key\n})\n```\n\n#### Delete Message\n```javascript\nconst sent = await sock.sendMessage(jid, { text: 'hello' })\nawait sock.sendMessage(jid, { delete: sent.key })\n```\n\n---\n\n### 🎭 Fake Quoted Messages\n\nFake a reply without an actual original message — useful for AI responses, status reposts, custom UIs and more. Only the bare minimum fields are needed — WhatsApp fills in the rest visually.\n\n#### Text Quote\n```javascript\nawait sock.sendMessage(jid, { text: 'Actual message' }, {\n  quoted: {\n    key: { remoteJid: jid, fromMe: false, id: 'FAKE_' + Date.now(), participant: '1234567890@s.whatsapp.net' },\n    message: { conversation: 'Fake quoted text' }\n  }\n})\n```\n\n#### Image Quote\n```javascript\nawait sock.sendMessage(jid, { text: 'Replying to image' }, {\n  quoted: {\n    key: { remoteJid: jid, fromMe: false, id: 'FAKE_' + Date.now(), participant: '1234567890@s.whatsapp.net' },\n    message: { imageMessage: { caption: 'Fake image caption' } }\n  }\n})\n```\n\n#### Sticker Quote\n```javascript\nawait sock.sendMessage(jid, { text: 'Replying to sticker' }, {\n  quoted: {\n    key: { remoteJid: jid, fromMe: false, id: 'FAKE_' + Date.now(), participant: '1234567890@s.whatsapp.net' },\n    message: { stickerMessage: {} }\n  }\n})\n```\n\n#### AI / Bot Quote\n```javascript\nawait sock.sendMessage(jid, { text: 'My response' }, {\n  quoted: {\n    key: { remoteJid: jid, fromMe: true, id: 'FAKE_' + Date.now() },\n    message: { extendedTextMessage: { text: 'AI generated this', title: 'DEXTERAI' } }\n  }\n})\n```\n\n#### Status Quote\n```javascript\nawait sock.sendMessage(jid, { text: 'Replying to your status!' }, {\n  quoted: {\n    key: { remoteJid: 'status@broadcast', fromMe: false, id: 'FAKE_' + Date.now(), participant: '1234567890@s.whatsapp.net' },\n    message: { conversation: 'Original status text' }\n  }\n})\n```\n\n#### Key Fields\n\n| Field | Description |\n|-------|-------------|\n| `remoteJid` | Where the quoted message appears to be from (`jid`, `status@broadcast`, group etc.) |\n| `fromMe` | `true` = appears sent by you/bot, `false` = appears sent by someone else |\n| `id` | Any unique string — `'FAKE_' + Date.now()` avoids collisions |\n| `participant` | Required in groups/status — the person who appears to have sent it |\n\n---\n\n### Buttons & Interactive Messages\n\n#### Text with Buttons\n```javascript\nawait sock.sendMessage(jid, {\n  text: 'Choose an option',\n  footer: '© DEXTER TECH DEVIL',\n  buttons: [\n    {\n      name: 'quick_reply',\n      buttonParamsJson: JSON.stringify({ display_text: 'Option 1', id: 'opt1' })\n    },\n    {\n      name: 'cta_url',\n      buttonParamsJson: JSON.stringify({\n        display_text: 'Visit Website',\n        url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys',\n        merchant_url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys'\n      })\n    }\n  ]\n})\n```\n\n#### Image / Video / Document with Buttons\n```javascript\nawait sock.sendMessage(jid, {\n  image: { url: 'https://example.com/image.jpg' },\n  caption: 'Description',\n  footer: '© DEXTER TECH DEVIL',\n  buttons: [\n    {\n      name: 'quick_reply',\n      buttonParamsJson: JSON.stringify({ display_text: 'Reply', id: 'btn1' })\n    }\n  ]\n})\n```\n\n#### All Button Types\n\n| Type | `name` value | Required params |\n|------|-------------|-----------------|\n| Quick Reply | `quick_reply` | `display_text`, `id` |\n| URL | `cta_url` | `display_text`, `url`, `merchant_url` |\n| Call | `cta_call` | `display_text`, `phone_number` |\n| Copy | `cta_copy` | `display_text`, `copy_code` |\n| List/Select | `single_select` | `title`, `sections[].rows[]` |\n| Call Permission | `call_permission_request` | `has_multiple_buttons` |\n\n#### List / Single Select\n```javascript\n{\n  name: 'single_select',\n  buttonParamsJson: JSON.stringify({\n    title: 'Select Option',\n    sections: [{\n      title: 'Section 1',\n      highlight_label: 'Popular',\n      rows: [\n        { title: 'Option 1', description: 'Desc 1', id: 'opt1' },\n        { title: 'Option 2', description: 'Desc 2', id: 'opt2' }\n      ]\n    }]\n  })\n}\n```\n\n#### Full Interactive Message\n```javascript\nawait sock.sendMessage(jid, {\n  interactiveMessage: {\n    title: 'Interactive',\n    footer: '© DEXTER TECH DEVIL',\n    image: { url: 'https://example.com/image.jpg' },\n    nativeFlowMessage: {\n      messageParamsJson: JSON.stringify({ /* optional advanced config */ }),\n      buttons: [\n        {\n          name: 'single_select',\n          buttonParamsJson: JSON.stringify({\n            title: 'Select',\n            sections: [{ title: 'Options', rows: [{ title: 'Option 1', id: 'opt1' }] }]\n          })\n        },\n        {\n          name: 'cta_copy',\n          buttonParamsJson: JSON.stringify({ display_text: 'Copy Code', copy_code: 'DEXTER2025' })\n        }\n      ]\n    }\n  }\n})\n```\n\n#### interactiveButtons Shorthand\n\n```javascript\n// Without media header\nawait sock.sendMessage(jid, {\n  text: 'Description of Message',\n  title: 'Title of Message',\n  subtitle: 'Subtitle Message',\n  footer: 'Footer Message',\n  interactiveButtons: [\n    {\n      name: 'quick_reply',\n      buttonParamsJson: JSON.stringify({ display_text: 'Quick Reply', id: 'button_1' })\n    },\n    {\n      name: 'cta_url',\n      buttonParamsJson: JSON.stringify({ display_text: 'Visit Website', url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys' })\n    }\n  ]\n}, { quoted: message })\n\n// With image header\nawait sock.sendMessage(jid, {\n  image: { url: 'https://example.jpg' }, // or buffer\n  caption: 'Description of Message',\n  title: 'Title of Message',\n  subtitle: 'Subtitle Message',\n  footer: 'Footer Message',\n  media: true,\n  interactiveButtons: [\n    {\n      name: 'quick_reply',\n      buttonParamsJson: JSON.stringify({ display_text: 'Quick Reply', id: 'button_1' })\n    },\n    {\n      name: 'cta_url',\n      buttonParamsJson: JSON.stringify({ display_text: 'Visit Website', url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys' })\n    }\n  ]\n}, { quoted: message })\n\n// With product header\nawait sock.sendMessage(jid, {\n  product: {\n    productImage: { url: 'https://example.jpg' }, // or buffer\n    productImageCount: 1,\n    title: 'Product Title',\n    description: 'Product Description',\n    priceAmount1000: 20000 * 1000,\n    currencyCode: 'USD',\n    retailerId: 'Retail',\n    url: 'https://example.com'\n  },\n  businessOwnerJid: '1234@s.whatsapp.net',\n  caption: 'Description of Message',\n  title: 'Title of Message',\n  footer: 'Footer Message',\n  media: true,\n  interactiveButtons: [\n    {\n      name: 'quick_reply',\n      buttonParamsJson: JSON.stringify({ display_text: 'Quick Reply', id: 'button_1' })\n    },\n    {\n      name: 'cta_url',\n      buttonParamsJson: JSON.stringify({ display_text: 'Visit Website', url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys' })\n    }\n  ]\n}, { quoted: message })\n```\n\n#### Classic Buttons (Old Style)\n\nFor compatibility with older WhatsApp versions or specific use cases:\n\n```javascript\n// Text with classic buttons\nawait sock.sendMessage(jid, {\n  text: 'Message with classic buttons',\n  footer: 'Footer text',\n  buttons: [\n    { buttonId: 'btn1', buttonText: { displayText: 'Button 1' }, type: 1 },\n    { buttonId: 'btn2', buttonText: { displayText: 'Button 2' }, type: 1 }\n  ],\n  headerType: 1\n})\n\n// Image header with classic buttons\nawait sock.sendMessage(jid, {\n  image: { url: 'https://example.com/image.jpg' },\n  caption: 'Body text',\n  footer: 'Footer',\n  buttons: [\n    { buttonId: 'btn1', buttonText: { displayText: 'Button 1' }, type: 1 }\n  ],\n  headerType: 3\n})\n```\n\n**Header Types:**\n\n| Value | Type | Description |\n|-------|------|-------------|\n| `0` | EMPTY | No header |\n| `1` | TEXT | Text header |\n| `2` | DOCUMENT | Document header |\n| `3` | IMAGE | Image header |\n| `4` | VIDEO | Video header |\n| `5` | LOCATION | Location header |\n\n**Button Types:**\n\n| Value | Type | Description |\n|-------|------|-------------|\n| `1` | RESPONSE | Standard clickable button |\n| `2` | NATIVE_FLOW | Native flow button |\n\n---\n\n### Extended Message Types\n\nAll of these go through `sock.sendMessage` — the library detects the type automatically.\n\n#### Album\n```javascript\nawait sock.sendMessage(jid, {\n  albumMessage: [\n    { image: { url: 'https://example.com/1.jpg' }, caption: 'Photo 1' },\n    { video: { url: 'https://example.com/2.mp4' }, caption: 'Video 1' }\n  ]\n}, { quoted: message })\n\n// Shorthand\nawait sock.sendAlbumMessage(jid, [\n  { image: { url: 'https://example.com/1.jpg' }, caption: 'Photo 1' }\n], message)\n```\n\n#### Carousel\n```javascript\nawait sock.sendMessage(jid, {\n  carouselMessage: {\n    caption: 'Our Products',\n    footer: 'Powered by DEXTER TECH DEVIL',\n    cards: [\n      {\n        headerTitle: 'Card 1',\n        imageUrl: 'https://example.com/1.jpg',\n        bodyText: 'Description',\n        buttons: [{ name: 'cta_url', params: { display_text: 'Visit', url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys' } }]\n      },\n      {\n        headerTitle: 'Product Card',\n        imageUrl: 'https://example.com/2.jpg',\n        productTitle: 'Premium Bot',\n        productDescription: 'Get access',\n        bodyText: 'Details here',\n        buttons: [{ name: 'cta_call', params: { display_text: 'Call', phone_number: '+94789958225' } }]\n      }\n    ]\n  }\n})\n```\n\n#### Event\n```javascript\nawait sock.sendMessage(jid, {\n  event: {\n    isCanceled: false,\n    name: 'Event Name',\n    description: 'Event Description',\n    location: { degreesLatitude: 0, degreesLongitude: 0, name: 'Venue' },\n    joinLink: 'https://meet.example.com/event',\n    startTime: Math.floor(Date.now() / 1000),\n    endTime: Math.floor(Date.now() / 1000) + 86400,\n    extraGuestsAllowed: true\n  }\n}, { quoted: message })\n```\n\n#### Product Message\n```javascript\nawait sock.sendMessage(jid, {\n  productMessage: {\n    title: 'Product Title',\n    description: 'Product Description',\n    thumbnail: 'https://example.com/img.png',\n    productId: '123456789',\n    retailerId: 'STORE',\n    url: 'https://example.com',\n    body: 'Product Body',\n    footer: 'Product Footer',\n    buttons: [\n      {\n        name: 'cta_url',\n        buttonParamsJson: JSON.stringify({ display_text: 'Buy Now', url: 'https://example.com' })\n      }\n    ]\n  }\n}, { quoted: message })\n```\n\n#### Request Payment\n```javascript\n// With note\nawait sock.sendMessage(jid, {\n  requestPayment: {\n    currency: 'IDR',\n    amount: '10000000',\n    from: '123456@s.whatsapp.net',\n    note: 'Payment for order #123'\n  }\n}, { quoted: message })\n\n// With sticker (URL or Buffer)\nawait sock.sendMessage(jid, {\n  requestPayment: {\n    currency: 'IDR',\n    amount: '10000000',\n    from: '123456@s.whatsapp.net',\n    sticker: { url: 'https://example.com/sticker.webp' }\n  }\n})\n```\n\n#### Poll Result (Newsletter Style)\n```javascript\nawait sock.sendMessage(jid, {\n  pollResult: {\n    name: 'Poll Title',\n    votes: [['Option A', 42], ['Option B', 17]]\n  }\n}, { quoted: message })\n```\n\n#### Group Story\n\nPost a story/status visible only to a specific group.\n\n> All media types accept a URL, Buffer, file path, or WhatsApp CDN URL — no manual download needed.\n\n```javascript\n// Text\nawait sock.sendMessage(jid, { groupStatus: { text: 'Hello group!' } })\n\n// Image\nawait sock.sendMessage(jid, { groupStatus: { image: { url: 'https://example.com/image.jpg' }, caption: 'Caption' } })\n\n// Video\nawait sock.sendMessage(jid, { groupStatus: { video: { url: 'https://example.com/video.mp4' }, caption: 'Caption' } })\n\n// Audio\nawait sock.sendMessage(jid, { groupStatus: { audio: { url: 'https://example.com/audio.mp3' }, ptt: false } })\n\n// Via shorthand\nawait sock.sendGroupStatusMessage(groupJid, { text: 'Hello group!' })\nawait sock.sendGroupStatusMessage(groupJid, { image: { url: 'https://example.com/image.jpg' }, caption: 'Caption' })\nawait sock.sendGroupStatusMessage(groupJid, { video: { url: 'https://example.com/video.mp4' }, caption: 'Caption' })\nawait sock.sendGroupStatusMessage(groupJid, { audio: { url: 'https://example.com/audio.mp3' }, ptt: false })\n\n// Media also accepts Buffer or file path\nawait sock.sendGroupStatusMessage(groupJid, { image: buffer })\nawait sock.sendGroupStatusMessage(groupJid, { image: fs.readFileSync('./image.jpg') })\n```\n\n#### Personal Status / Story (status@broadcast)\n\nPost a story visible to all your contacts or a specific list.\n\n```javascript\n// Text\nawait sock.sendMessage('status@broadcast', { text: 'My status update!' })\n\n// Image\nawait sock.sendMessage('status@broadcast', { image: { url: 'https://example.com/image.jpg' }, caption: 'Caption' })\n\n// Video\nawait sock.sendMessage('status@broadcast', { video: { url: 'https://example.com/video.mp4' }, caption: 'Caption' })\n\n// Audio\nawait sock.sendMessage('status@broadcast', { audio: { url: 'https://example.com/audio.mp3' }, ptt: false })\n\n// Send to specific contacts only\nawait sock.sendMessage('status@broadcast', {\n  text: 'Private status',\n  statusJidList: [\n    '1234567890@s.whatsapp.net',\n    '0987654321@s.whatsapp.net'\n  ]\n})\n```\n\n#### React to a Status\n```javascript\n// Method 1 — via sendMessage\nawait sock.sendMessage('status@broadcast', {\n  react: {\n    text: '❤️',\n    key: message.key  // the key of the status message\n  }\n}, {\n  statusJidList: [message.key.participant] // the person who posted the status\n})\n\n// Method 2 — via sendReaction shorthand\nawait sock.sendReaction('status@broadcast', message.key, '❤️', {\n  statusJidList: [message.key.participant]\n})\n```\n\n#### Status Mention (tag someone in your story)\n\nMention specific users or groups in a story. They get a private notification.\n\n```javascript\n// Text\nawait sock.sendStatusMentions({ text: 'Hey @someone check this out!' }, ['1234567890@s.whatsapp.net'])\n\n// Image\nawait sock.sendStatusMentions({ image: { url: 'https://example.com/image.jpg' }, caption: 'Caption' }, ['1234567890@s.whatsapp.net'])\n\n// Video\nawait sock.sendStatusMentions({ video: { url: 'https://example.com/video.mp4' } }, ['1234567890@s.whatsapp.net'])\n\n// Audio\nawait sock.sendStatusMentions({ audio: { url: 'https://example.com/audio.mp3' }, ptt: true }, ['1234567890@s.whatsapp.net'])\n\n// Tag a group (all members get notified)\nawait sock.sendStatusMentions({ text: 'Hey group!' }, ['123456789@g.us'])\n```\n\n#### Sticker Pack\n\nSend a full sticker pack. Supports buffers, file paths, and URLs. Packs over 60 stickers are automatically batched with a 2-second delay between batches.\n\n```javascript\n// Method 1 — via sendMessage\nawait sock.sendMessage(jid, {\n  stickerPack: {\n    name: 'My Stickers',\n    publisher: 'DEXTER TECH DEVIL',\n    stickers: [\n      { data: buffer,                              emojis: ['😊'] },\n      { data: './sticker.png',                     emojis: ['😂'] },\n      { data: './sticker.webp',                    emojis: ['🎉'] },\n      { data: './sticker.gif',                     emojis: ['✨'], isAnimated: true },\n      { data: './sticker.webm',                    emojis: ['🎬'], isAnimated: true },\n      { data: 'https://example.com/sticker.jpg',  emojis: ['❤️'] },\n      { data: buffer, type: StickerTypes.ROUNDED, emojis: ['🔥'] },\n    ],\n    cover: coverBuffer  // optional — defaults to first sticker\n  }\n}, { quoted: message })\n\n// Method 2 — dedicated shorthand\nawait sock.stickerPackMessage(jid, {\n  name: 'My Stickers',\n  publisher: 'DEXTER TECH DEVIL',\n  stickers: [\n    { data: buffer, emojis: ['😊'] },\n    { data: './sticker.png', emojis: ['😂'] }\n  ],\n  cover: coverBuffer\n}, { quoted: message })\n```\n\n**Per-sticker options:**\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `data` | Buffer \\| string | required | Buffer, file path, URL, or SVG string |\n| `emojis` | string[] | `[]` | Associated emojis shown in WhatsApp sticker picker |\n| `type` | StickerTypes | `ROUNDED` | Crop/shape style (see below) |\n| `isAnimated` | boolean | `false` | Mark as animated (for GIF/WebM inputs) |\n| `isLottie` | boolean | `false` | Mark as Lottie animated (for TGS inputs) |\n| `accessibilityLabel` | string | `''` | Accessibility label for the sticker |\n\n**Sticker types (`StickerTypes`):**\n\n| Value | Description |\n|-------|-------------|\n| `StickerTypes.DEFAULT` | Original aspect ratio, no crop |\n| `StickerTypes.CROPPED` | Cropped to 512×512 |\n| `StickerTypes.FULL` | Stretched to fill 512×512 |\n| `StickerTypes.CIRCLE` | Circular mask |\n| `StickerTypes.ROUNDED` | Rounded corners |\n\n**Supported input formats:**\n\n| Format | Support | Notes |\n|--------|---------|-------|\n| WebP | ✅ Full | Static and animated, passed through sharp |\n| PNG | ✅ Full | Auto-converted to WebP |\n| JPG/JPEG | ✅ Full | Auto-converted to WebP |\n| BMP | ✅ Full | Auto-converted to WebP |\n| SVG | ✅ Full | Rendered and converted to WebP |\n| GIF | ✅ Animated | Converted to animated WebP via sharp |\n| WebM (VP9) | ✅ Animated | Converted via ffmpeg → animated WebP |\n| MP4 | ✅ Animated | Converted via ffmpeg → animated WebP |\n| TGS | ✅ Animated | Telegram gzip-compressed Lottie — converted via rlottie WASM → animated WebP |\n\n\n**Key behaviours:**\n- Packs >60 stickers are auto-batched with a 2-second delay between batches\n- Animated stickers (WebM/MP4) are converted directly via ffmpeg for best quality; static formats go through wa-sticker-formatter. EXIF metadata is embedded automatically for all formats.\n- Invalid or unprocessable stickers are gracefully skipped\n- Cover defaults to the first sticker if not provided\n\n---\n\n---\n\n#### AI Rich Messages\n\n\nAll types can be sent two ways:\n- **`sock.sendMessage`** with an `aiRich` content key\n- **Shorthand methods** like `sock.sendCodeBlock`, `sock.sendTable`, etc.\n\n---\n\n##### Code Block\n\n```javascript\n// via sendMessage\nawait sock.sendMessage(jid, {\n  aiRich: {\n    language: 'javascript',\n    code: `async function fetchUser(id) {\n  const res = await fetch(\\`/api/users/\\${id}\\`)\n  if (!res.ok) throw new Error('Not found')\n  return res.json()\n}`,\n    header: '**Fetch User Example**',\n    footer: '_Requires Node 18+_'\n  }\n}, { quoted: message })\n\n// via shorthand (sendCodeBlock / sendCodeBlockV2)\nawait sock.sendCodeBlock(jid, code, quoted, {\n  language: 'javascript',\n  title: 'Example Code',\n  footer: 'Powered by DEXTER TECH DEVIL'\n})\n\nawait sock.sendCodeBlockV2(jid, code, quoted, {\n  language: 'go',\n  title: 'Go Example',\n  text: 'Here is a Go snippet:',\n  footer: 'Powered by DEXTER TECH DEVIL'\n})\n```\n\n**Supported languages:** Any of the 190+ languages supported by PrismJS — `javascript`, `typescript`, `python`, `rust`, `go`, `java`, `cpp`, `kotlin`, `swift`, `bash`, `sql`, `dockerfile`, `solidity`, `graphql`, and many more.\n\n---\n\n##### Table\n\n```javascript\n// via sendMessage\nawait sock.sendMessage(jid, {\n  aiRich: {\n    table: [\n      'Java vs JavaScript',             // title\n      ['Feature', 'Java', 'JavaScript'], // headers\n      ['Type', 'Compiled', 'Interpreted'],\n      ['Typing', 'Static', 'Dynamic'],\n      ['Main Use', 'Enterprise', 'Web']\n    ],\n    header: '**Comparison**',\n    footer: 'Hope this helps!'\n  }\n}, { quoted: message })\n\n// via shorthand (sendTable)\nawait sock.sendTable(\n  jid,\n  'Java vs JavaScript',\n  ['Feature', 'Java', 'JavaScript'],\n  [\n    ['Type', 'Compiled', 'Interpreted'],\n    ['Typing', 'Static', 'Dynamic'],\n    ['Main Use', 'Enterprise', 'Web']\n  ],\n  quoted,\n  { headerText: 'Comparison:', footer: 'Hope this helps!' }\n)\n\n// via shorthand (sendTableV2) — pipe-delimited string format\nawait sock.sendTableV2(\n  jid,\n  [\n    'Java vs JavaScript',\n    'Feature | Java | JavaScript',\n    'Type | Compiled | Interpreted;;Typing | Static | Dynamic;;Main Use | Enterprise | Web'\n  ],\n  quoted,\n  { headerText: 'Comparison:', text: 'Here is a table:', footer: 'Hope this helps!' }\n)\n\n// sendList — two-column key/value style\nawait sock.sendList(\n  jid,\n  'Bot Info',\n  [['Name', 'DEXTER TECH DEVIL'], ['Version', '2.2.9'], ['Developer', 'DEXTER TECH DEVIL']],\n  quoted,\n  { footer: '© DEXTER TECH DEVIL' }\n)\n```\n\n---\n\n##### Text\n\n```javascript\n// via sendMessage\nawait sock.sendMessage(jid, {\n  aiRich: {\n    text: '## Hello\\n\\nThis supports **markdown**:\\n\\n- Bold\\n- Lists\\n- Headers',\n    footer: '_Powered by DEXTER TECH DEVIL_'\n  }\n}, { quoted: message })\n\n// multiple text blocks\nawait sock.sendMessage(jid, {\n  aiRich: {\n    texts: ['## Title', 'First paragraph', 'Second paragraph'],\n    footer: '_DEXTER TECH DEVIL_'\n  }\n}, { quoted: message })\n```\n\n---\n\n##### Links & Search Sources\n\n```javascript\n// via sendMessage (with inline {{IE_N}} placeholders)\nawait sock.sendMessage(jid, {\n  aiRich: {\n    text: 'Upload complete:\\n✅ Freeimage — {{IE_0}}view here{{/IE_0}}\\n✅ Yardsansh — {{IE_1}}view here{{/IE_1}}',\n    sources: [\n      { url: 'https://freeimage.host', displayName: 'Freeimage', subtitle: 'freeimage.host' },\n      { url: 'https://yardsansh.com', displayName: 'Yardsansh', subtitle: 'yardsansh.com' }\n    ],\n    footer: '✨ Done!'\n  }\n}, { quoted: message })\n\n// via sendLink shorthand (bare URL array)\nawait sock.sendLink(\n  jid,\n  'Results:\\n🔗 {{IE_0}}link one{{/IE_0}}\\n🔗 {{IE_1}}link two{{/IE_1}}',\n  ['https://example.com/1', 'https://example.com/2'],\n  quoted,\n  { headerText: '📁 Upload Results', footer: '✨ Done!' }\n)\n\n// via sendLinkV2 shorthand (rich source objects with search engine)\nawait sock.sendLinkV2(\n  jid,\n  'Search results:\\n- {{IE_0}}Official docs{{/IE_0}}\\n- {{IE_1}}GitHub repo{{/IE_1}}',\n  [\n    { url: 'https://www.npmjs.com/package/@dexterid/baileys', displayName: 'Official docs', subtitle: 'npmjs.com' },\n    { url: 'https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys', displayName: 'GitHub repo', subtitle: 'github.com' }\n  ],\n  quoted,\n  { headerText: '@dexterid/baileys', footer: 'Reference links', searchEngine: 'MAME' }\n)\n```\n\n---\n\n##### Images\n\n```javascript\nawait sock.sendMessage(jid, {\n  aiRich: {\n    text: 'Here are some results:',\n    images: [\n      { url: 'https://example.com/img1.jpg', sourceUrl: 'https://example.com' },\n      { url: 'https://example.com/img2.jpg', sourceUrl: 'https://example.com' }\n    ],\n    footer: '_2 images found_'\n  }\n}, { quoted: message })\n```\n\n---\n\n##### Reels\n\n```javascript\nawait sock.sendMessage(jid, {\n  aiRich: {\n    text: 'Top reels for you:',\n    reels: [\n      {\n        title: 'Creator Name',\n        creator: 'Creator Name',\n        videoUrl: 'https://example.com/reel1.mp4',\n        thumbnailUrl: 'https://example.com/thumb1.jpg',\n        profileIconUrl: 'https://example.com/avatar.jpg',\n        view_count: 12000,\n        likes_count: 800,\n        is_verified: true,\n        reel_source: 'IG'\n      }\n    ]\n  }\n}, { quoted: message })\n```\n\n---\n\n##### Multiple Codes\n\n```javascript\nawait sock.sendMessage(jid, {\n  aiRich: {\n    texts: ['## Sorting Algorithms', 'Two implementations:'],\n    codes: [\n      { language: 'javascript', code: `const bubble = arr => { /* ... */ }` },\n      { language: 'python', code: `def quicksort(arr):\\n    # ...` }\n    ],\n    footer: '_O(n²) vs O(n log n)_'\n  }\n}, { quoted: message })\n```\n\n---\n\n##### Composite (mix everything in one message)\n\n```javascript\nawait sock.sendMessage(jid, {\n  aiRich: {\n    parts: [\n      { type: 'text', content: '## String Reversal' },\n      { type: 'code', language: 'javascript', content: `const reverse = s => s.split('').reverse().join('')` },\n      { type: 'text', content: 'Performance:' },\n      { type: 'table', table: ['Benchmarks', ['Method', 'Ops/sec'], ['split.reverse.join', '1.2M'], ['manual loop', '2.1M']] },\n      { type: 'sources', sources: [{ url: 'https://jsperf.app', displayName: 'JSPerf', subtitle: 'jsperf.app' }] }\n    ],\n    footer: '_DEXTER TECH DEVIL_'\n  }\n}, { quoted: message })\n\n// via sendRichMessage shorthand\nawait sock.sendRichMessage(jid, {\n  text: 'Hello from sendRichMessage!',\n  code: 'console.log(\"works!\")',\n  language: 'javascript',\n  footer: '_DEXTER TECH DEVIL_'\n}, quoted)\n```\n\n---\n\n##### LaTeX\n\n```javascript\nawait sock.sendMessage(jid, {\n  aiRich: {\n    latexText: 'The quadratic formula:',\n    latex: [\n      { latexExpression: 'x = \\\\frac{-b \\\\pm \\\\sqrt{b^2 - 4ac}}{2a}', url: '', width: 0, height: 0 }\n    ],\n    footer: '_Math rendering_'\n  }\n}, { quoted: message })\n\n// via shorthand\nawait sock.sendLatex(jid, [\n  { latexExpression: 'E = mc^2', url: '', width: 0, height: 0 }\n], quoted, { text: 'Mass-energy equivalence:', footer: '_Einstein_' })\n```\n\n---\n\n##### Capture & Relay (forward an AI message)\n\n```javascript\n// Capture a received AI rich message\nconst captured = sock.dexterHandler.captureAiRich(message.message)\n\n// Relay it to another jid\nif (captured) await sock.dexterHandler.relayAiRich(jid, captured, quoted)\n```\n\n---\n\n##### `aiRich` Options Reference\n\n| Key | Type | Description |\n|-----|------|-------------|\n| `text` | `string` | Single markdown text block |\n| `texts` | `string[]` | Multiple text blocks in order |\n| `code` | `string \\| { language, code }` | Single code block |\n| `codes` | `Array` | Multiple code blocks |\n| `language` | `string` | Default language for `code`/`codes` |\n| `table` | `Array` | `[title, headers[], ...rows[]]` |\n| `headers` + `rows` | `Array` | Alternative table format |\n| `images` | `Array` | Grid images with `url`, `sourceUrl` |\n| `sources` | `Array` | Search source cards |\n| `reels` | `Array` | Horizontal reel cards |\n| `latex` | `Array` | LaTeX expression objects |\n| `latexText` | `string` | Text shown above latex |\n| `parts` | `Array` | Composite ordered parts array |\n| `header` | `string` | Text prepended before content |\n| `footer` | `string` | Text appended after content |\n| `botJid` | `string` | Custom bot JID (default: `259786046210223@bot`) |\n| `forwardingScore` | `number` | Forward score (default: `2`) |\n| `disclaimerText` | `string` | Disclaimer shown in metadata |\n| `searchEngine` | `string` | Search engine label (default: `MAME`) |\n| `responseId` | `string` | Custom response UUID |\n| `forwarded` | `boolean` | Set `false` to disable forwarded context |\n| `includesUnifiedResponse` | `boolean` | Set `false` to send V1 only |\n\n---\n\n### Shorthand Wrappers\n\n```javascript\nawait sock.sendText(jid, 'Hello!', options)\nawait sock.sendImage(jid, { url: './image.jpg' }, 'Caption', options)\nawait sock.sendVideo(jid, buffer, 'Caption', options)\nawait sock.sendDocument(jid, { url: './file.pdf' }, 'Caption', options)\nawait sock.sendAudio(jid, { url: './audio.mp3' }, options)\nawait sock.sendLocation(jid, { degreesLatitude: 24.12, degreesLongitude: 55.11, name: 'Place' }, options)\nawait sock.sendPoll(jid, 'Question?', ['A', 'B', 'C'], false, options)\nawait sock.sendReaction(jid, message.key, '💖', options)\nawait sock.sendSticker(jid, { url: './sticker.webp' }, options)\nawait sock.sendContact(jid, { vcard }, options)\nawait sock.sendForward(jid, message, { force: true })\n\n// ── AI Rich Messages ──────────────────────────────────────────────────────────\nawait sock.sendCodeBlock(jid, code, quoted, { language, title, footer })\nawait sock.sendCodeBlockV2(jid, code, quoted, { language, title, text, footer })\nawait sock.sendTable(jid, title, headers, rows, quoted, { headerText, footer })\nawait sock.sendTableV2(jid, tableArray, quoted, { headerText, text, footer })\nawait sock.sendList(jid, title, items, quoted, { footer })\nawait sock.sendLink(jid, text, links, quoted, { headerText, footer, botJid })\nawait sock.sendLinkV2(jid, text, links, quoted, { headerText, footer, searchEngine })\nawait sock.sendLatex(jid, expressions, quoted, { text, headerText, footer })\nawait sock.sendRichMessage(jid, data, quoted)\n```\n\n---\n\n## ✏️ Message Modifications\n\n```javascript\n// Edit\nawait sock.sendMessage(jid, { text: 'Updated text', edit: originalMessage.key })\n\n// Delete for everyone\nconst sent = await sock.sendMessage(jid, { text: 'hello' })\nawait sock.sendMessage(jid, { delete: sent.key })\n\n// Pin (time in seconds: 86400=24h, 604800=7d, 2592000=30d)\nawait sock.sendMessage(jid, { pin: { type: 1, time: 86400, key: message.key } })\n\n// Unpin\nawait sock.sendMessage(jid, { pin: { type: 0, time: 0, key: message.key } })\n```\n\n---\n\n## 📥 Media Download\n\n```javascript\nimport { downloadMediaMessage, getContentType } from '@dexterid/baileys'\n\nsock.ev.on('messages.upsert', async ({ messages }) => {\n  const msg = messages[0]\n  if (!msg.message) return\n\n  const type = getContentType(msg.message)\n\n  if (type === 'imageMessage') {\n    const buffer = await downloadMediaMessage(\n      msg,\n      'buffer',\n      {},\n      { logger, reuploadRequest: sock.updateMediaMessage }\n    )\n    fs.writeFileSync('./downloaded.jpg', buffer)\n  }\n})\n\n// Re-upload expired media\nawait sock.updateMediaMessage(msg)\n```\n\n---\n\n## 👥 Group Management\n\n```javascript\n// Create group\nconst group = await sock.groupCreate('Group Name', ['1234567890@s.whatsapp.net'])\n\n// Add / Remove / Promote / Demote\nawait sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'add')\nawait sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'remove')\nawait sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'promote')\nawait sock.groupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'demote')\n\n// Update group info\nawait sock.groupUpdateSubject(groupJid, 'New Group Name')\nawait sock.groupUpdateDescription(groupJid, 'New description')\n\n// Settings\nawait sock.groupSettingUpdate(groupJid, 'announcement')     // only admins can send\nawait sock.groupSettingUpdate(groupJid, 'not_announcement') // everyone can send\nawait sock.groupSettingUpdate(groupJid, 'locked')           // only admins edit info\nawait sock.groupSettingUpdate(groupJid, 'unlocked')         // everyone edits info\n\n// Metadata\nconst metadata = await sock.groupMetadata(groupJid)\n\n// Invite link\nconst code = await sock.groupInviteCode(groupJid)\nconsole.log(`https://chat.whatsapp.com/${code}`)\n\nawait sock.groupRevokeInvite(groupJid)        // revoke invite\nawait sock.groupAcceptInvite('INVITE_CODE')   // join group\nawait sock.groupLeave(groupJid)               // leave group\n```\n\n### AI Groups\n\nWhatsApp AI Groups are a special group type with Meta AI built-in as a participant.\n\n```javascript\n// Create an AI group\nconst group = await sock.aiGroupCreate('AI Study Group', ['1234567890@s.whatsapp.net'])\n\n// Get AI group metadata\nconst metadata = await sock.aiGroupMetadata(groupJid)\n\n// Add the Meta AI bot to an existing AI group\nawait sock.aiGroupAddBot(groupJid)\n\n// Add / Remove / Promote / Demote participants\nawait sock.aiGroupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'add')\nawait sock.aiGroupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'remove')\nawait sock.aiGroupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'promote')\nawait sock.aiGroupParticipantsUpdate(groupJid, ['1234567890@s.whatsapp.net'], 'demote')\n\n// Update subject\nawait sock.aiGroupUpdateSubject(groupJid, 'New AI Group Name')\n\n// Invite link\nconst code = await sock.aiGroupInviteCode(groupJid)\nawait sock.aiGroupRevokeInvite(groupJid)\nawait sock.aiGroupAcceptInvite('INVITE_CODE')\n\n// Leave\nawait sock.aiGroupLeave(groupJid)\n\n// Settings (announcement, not_announcement, locked, unlocked)\nawait sock.aiGroupSettingUpdate(groupJid, 'announcement')\n\n// Ephemeral messages\nawait sock.aiGroupToggleEphemeral(groupJid, 86400) // 24h\nawait sock.aiGroupToggleEphemeral(groupJid, 0)     // disable\n```\n\n---\n\n## 📱 User Operations\n\n```javascript\n// Check if number exists on WhatsApp\nconst [result] = await sock.onWhatsApp('1234567890')\nif (result?.exists) console.log(result.jid)\n\n// Profile picture\nconst url = await sock.profilePictureUrl(jid, 'image') // 'image' = HD\nawait sock.updateProfilePicture(jid, { url: './profile.jpg' })\nawait sock.removeProfilePicture(jid)\n\n// Status & name\nconst status = await sock.fetchStatus(jid)\nawait sock.updateProfileStatus('Available 24/7')\nawait sock.updateProfileName('My Bot')\n\n// Business profile\nconst biz = await sock.getBusinessProfile(jid)\n\n// Presence\nawait sock.presenceSubscribe(jid)\nawait sock.sendPresenceUpdate('composing', jid) // available | unavailable | composing | recording | paused\n\n// Read messages\nawait sock.readMessages([message.key])\n\n// Block / Unblock\nawait sock.updateBlockStatus(jid, 'block')\nawait sock.updateBlockStatus(jid, 'unblock')\n\n// Blocklist\nconst blocked = await sock.fetchBlocklist()\n```\n\n### Usernames\n\n```javascript\n// Check if a username is available\nconst result = await sock.checkUsername('dextertechdevil')\n// { available: true, username: 'dextertechdevil', session_id: '...' }\n// { available: false, suggestions: ['dextertechdevil1', 'dextertechdevil_'], ... }\n\n// Check multiple usernames at once\nconst results = await sock.checkUsernameMulti(['dextertechdevil', 'dextertechdevil'])\n\n// Set your username\nawait sock.setUsername('dextertechdevil')\n\n// Set with options\nawait sock.setUsername('dextertechdevil', { pin: '1234' })\n\n// Check availability then set in one call\nawait sock.checkAndSetUsername('dextertechdevil')\n\n// Get your current username\nconst username = await sock.getMyUsername()\n\n// Delete your username\nawait sock.deleteUsername()\n\n// Set a PIN on your username\nawait sock.setUsernamePin('1234')\n\n// Find a user by their @username\nconst user = await sock.findUserByUsername('dextertechdevil')\n// { jid: '1234567890@s.whatsapp.net', contact: true }\n\n// Find a user with PIN-protected username\nconst user = await sock.findUserByUsername('dextertechdevil', '1234')\n\n// Fetch usernames of multiple contacts\nconst list = await sock.fetchContactUsernames('1234567890@s.whatsapp.net', '0987654321@s.whatsapp.net')\n\n// Get username suggestions from WhatsApp\nconst suggestions = await sock.getUsernameRecommendations()\n```\n\n---\n\n## 💬 Check Number Status\n\n```javascript\n// Via socket instance\nconst result = await sock.checkStatusWA('1234567890')\n\n// Or direct import (no socket needed)\nimport { checkStatusWA } from '@dexterid/baileys'\nconst result = await checkStatusWA('1234567890')\n\n// Response examples:\n// Active number\n{ number: '+94789958225', status: 'active', isBanned: false, isNeedOfficialWa: false, banInfo: null }\n\n// Banned number\n{\n  number: '+94789958225',\n  status: 'banned',\n  isBanned: true,\n  isNeedOfficialWa: false,\n  banInfo: {\n    banType: 'temporary',        // 'temporary' | 'permanent'\n    violationType: '2',\n    violationReason: 'Type 2',\n    canAppeal: true,             // false if permanent\n    appealToken: 'xxxxx',\n    banTime: 1716840000,\n    banDate: '2024-05-28T00:00:00.000Z',\n    appealStatus: 'PENDING',\n    appealCreatedAt: '2024-05-27T00:00:00.000Z'\n  }\n}\n\n// Blocked by custom screen (needs official WhatsApp)\n{ number: '+94789958225', status: 'blocked', isBanned: false, isNeedOfficialWa: true, banInfo: null }\n\n// Rate limited\n{ number: '+94789958225', status: 'rate_limited', isBanned: false, isNeedOfficialWa: false, banInfo: null }\n\n// Usage example\nimport { checkStatusWA } from '@dexterid/baileys'\nconst check = await checkStatusWA('1234567890')\nif (check.isBanned) {\n  console.log(`Banned: ${check.banInfo.banType}`)\n  if (check.banInfo.canAppeal) console.log(`Appeal token: ${check.banInfo.appealToken}`)\n} else {\n  console.log(`Status: ${check.status}`)\n}\n```\n\n---\n\n## 🔒 Privacy Controls\n\n```javascript\nconst settings = await sock.fetchPrivacySettings()\n\n// last seen: 'all' | 'contacts' | 'contact_blacklist' | 'none'\nawait sock.updateLastSeenPrivacy('contacts')\n\n// online: 'all' | 'match_last_seen'\nawait sock.updateOnlinePrivacy('all')\n\n// profile picture: 'all' | 'contacts' | 'contact_blacklist' | 'none'\nawait sock.updateProfilePicturePrivacy('contacts')\n\n// status: 'all' | 'contacts' | 'contact_blacklist' | 'none'\nawait sock.updateStatusPrivacy('contacts')\n\n// read receipts: 'all' | 'none'\nawait sock.updateReadReceiptsPrivacy('all')\n\n// groups add: 'all' | 'contacts' | 'contact_blacklist'\nawait sock.updateGroupsAddPrivacy('contacts')\n```\n\n### Extended Privacy (MEX-based)\n\n```javascript\n// Update your About/bio text (with optional emoji)\nawait sock.updateTextStatus('Available for chats', '👋')\n\n// Get About text of multiple contacts\nconst statuses = await sock.getTextStatusList(['1234567890@s.whatsapp.net'])\n\n// Fetch profile picture info for a user\nconst info = await sock.fetchUserPictureInfo('1234567890@s.whatsapp.net')\n\n// Set profile picture via MEX\nawait sock.setProfilePictureMex(imageBase64)\n\n// Trusted devices\nconst devices = await sock.getTrustedDevices()\nawait sock.addTrustedDevice('device_id', 'My Laptop')\nawait sock.untrustTrustedDevice('device_id')\nawait sock.deleteTrustedDevice('device_id')\n\n// Multi-account\nawait sock.addMultiAccountLink('1234567890')\nawait sock.revokeMultiAccount('1234567890@s.whatsapp.net')\n\n// Check if contacts/businesses are valid WA users\nconst contacts = await sock.contactIntegrityQuery(['1234567890@s.whatsapp.net'])\nconst businesses = await sock.bizIntegrityQuery(['1234567890@s.whatsapp.net'])\n\n// Link / unlink Facebook or Instagram profile\nawait sock.linkedProfilesSet([{ type: 'FB', username: 'myprofile' }])\nawait sock.linkedProfilesRemove(['FB'])\nawait sock.linkedProfilesUpdate([{ type: 'FB', showOnProfile: true }])\n\n// Migrate blocklist to LID system\nawait sock.migrateBlocklistLid(['1234567890@s.whatsapp.net'])\n\n// Notify group members of your push name\nawait sock.notifyPushName(groupJid, [{ jid: '1234567890@s.whatsapp.net', pushName: 'John' }])\n```\n\n---\n\n## 💬 Chat Operations\n\n```javascript\nconst lastMsg = await getLastMessageInChat(jid) // implement with your store\n\n// Archive / Unarchive\nawait sock.chatModify({ archive: true, lastMessages: [lastMsg] }, jid)\n\n// Mute (ms) / Unmute\nawait sock.chatModify({ mute: 8 * 60 * 60 * 1000 }, jid)\nawait sock.chatModify({ mute: null }, jid)\n\n// Pin / Unpin\nawait sock.chatModify({ pin: true }, jid)\nawait sock.chatModify({ pin: false }, jid)\n\n// Delete chat\nawait sock.chatModify({ delete: true, lastMessages: [{ key: lastMsg.key, messageTimestamp: lastMsg.messageTimestamp }] }, jid)\n\n// Mark read / unread\nawait sock.chatModify({ markRead: true }, jid)\nawait sock.chatModify({ markRead: false }, jid)\n```\n\n---\n\n## 📢 Newsletter / Channels\n\n```javascript\n// Create\nawait sock.newsletterCreate('Channel Name', { description: 'Description', picture: buffer })\n\n// Update\nawait sock.newsletterUpdateMetadata(newsletterJid, { name: 'New Name', description: 'New Desc' })\nawait sock.newsletterUpdatePicture(newsletterJid, buffer)\n\n// React to a message\nawait sock.newsletterReactMessage(newsletterJid, messageId, '👍')\n\n// Follow / Unfollow / Mute / Unmute\nawait sock.newsletterFollow(newsletterJid)\nawait sock.newsletterUnfollow(newsletterJid)\nawait sock.newsletterMute(newsletterJid)\nawait sock.newsletterUnmute(newsletterJid)\n```\n\n## 🤖 Meta AI Messages\n\nMeta AI bot messages (`msmsg` encrypted responses) are now automatically decrypted when received. They arrive as regular messages in `messages.upsert` once decrypted:\n\n```javascript\nsock.ev.on('messages.upsert', async ({ messages }) => {\n  for (const msg of messages) {\n    if (!msg.message) continue\n\n    // Meta AI responses appear as regular extendedTextMessage or other content\n    const content = extractMessageContent(msg.message)\n    if (content?.extendedTextMessage?.text) {\n      console.log('Message (possibly Meta AI):', content.extendedTextMessage.text)\n    }\n  }\n})\n```\n\nIf decryption fails (e.g. missing message secret), the message is gracefully NACKed and logged — it won't crash your session.\n\n---\n\n## 📡 Events Reference\n\n| Event | Trigger |\n|-------|---------|\n| `connection.update` | Connection state changed |\n| `creds.update` | Auth credentials updated |\n| `messages.upsert` | New message(s) received |\n| `messages.update` | Message status/content updated |\n| `messages.delete` | Message(s) deleted |\n| `message-receipt.update` | Read/delivered receipts |\n| `chats.set` | Initial chat list loaded |\n| `chats.upsert` | New chat(s) appeared |\n| `chats.update` | Chat metadata updated |\n| `chats.delete` | Chat(s) deleted |\n| `contacts.set` | Initial contacts loaded |\n| `contacts.upsert` | New contact(s) added |\n| `contacts.update` | Contact info updated |\n| `groups.upsert` | New group created/joined |\n| `groups.update` | Group metadata changed |\n| `group-participants.update` | Member added/removed/promoted |\n| `presence.update` | User presence changed |\n| `call` | Incoming call |\n| `blocklist.set` | Initial blocklist loaded |\n| `blocklist.update` | Block/unblock event |\n\n---\n\n## 🎯 Best Practices\n\n### Reconnection\n\n```javascript\nsock.ev.on('connection.update', ({ connection, lastDisconnect }) => {\n  if (connection === 'close') {\n    const code = lastDisconnect?.error?.output?.statusCode\n    const shouldReconnect = code !== DisconnectReason.loggedOut\n    if (shouldReconnect) connectToWhatsApp()\n    else console.log('Logged out — clear session and re-authenticate')\n  }\n})\n```\n\n### Cache Group Metadata\n\n```javascript\nimport NodeCache from '@cacheable/node-cache'\n\nconst groupCache = new NodeCache({ stdTTL: 5 * 60, useClones: false })\n\nconst sock = makeWASocket({\n  cachedGroupMetadata: async (jid) => groupCache.get(jid)\n})\n\nsock.ev.on('groups.update', async ([event]) => {\n  const metadata = await sock.groupMetadata(event.id)\n  groupCache.set(event.id, metadata)\n})\n```\n\n### Rate Limiting\n\n```javascript\nconst queue = []\nlet sending = false\n\nconst queueMessage = (jid, content) => {\n  queue.push({ jid, content })\n  if (!sending) processQueue()\n}\n\nconst processQueue = async () => {\n  sending = true\n  while (queue.length > 0) {\n    const { jid, content } = queue.shift()\n    await sock.sendMessage(jid, content)\n    await new Promise(r => setTimeout(r, 1000))\n  }\n  sending = false\n}\n```\n\n### Error Handling\n\n```javascript\ntry {\n  await sock.sendMessage(jid, { text: 'Hello' })\n} catch (error) {\n  if (error.output?.statusCode === 401) console.log('Unauthorized')\n  else console.error('Send failed:', error)\n}\n```\n\n### Poll Decryption\n\n```javascript\nimport { getAggregateVotesInPollMessage } from '@dexterid/baileys'\n\nsock.ev.on('messages.update', async (event) => {\n  for (const { key, update } of event) {\n    if (update.pollUpdates) {\n      const pollCreation = await getMessage(key)\n      if (pollCreation) {\n        const result = getAggregateVotesInPollMessage({\n          message: pollCreation,\n          pollUpdates: update.pollUpdates\n        })\n        console.log('Poll votes:', result)\n      }\n    }\n  }\n})\n```\n\n---\n\n## ⚠️ Disclaimer\n\nThis project is **not** affiliated with WhatsApp or Meta. Use responsibly:\n\n- Follow WhatsApp's Terms of Service\n- Do not spam or send unsolicited messages\n- Respect user privacy\n- Be aware of WhatsApp's rate limits\n- This library is for legitimate automation purposes only\n\n---\n\n## 🙏 Acknowledgments\n\n- [WhiskeySockets](https://github.com/WhiskeySockets) for the original Baileys library\n- All contributors and the open-source community\n\n---\n\n<div align=\"center\">\n\n**Made with ❤️ by [DEXTER TECH DEVIL](https://github.com/DEXTER-ID-NEW)**\n\n⭐ **Star us on GitHub!** ⭐\n\n[GitHub](https://github.com/DEXTER-ID-NEW/dexter-tech-devil-baileys) • [NPM](https://www.npmjs.com/package/@dexterid/baileys)\n\n</div>","readmeFilename":"README.md"}