{"_id":"@diegomarvid/whatsapp-assistant","_rev":"10-3f81cf62973fdbc7cba18351230c0644","name":"@diegomarvid/whatsapp-assistant","dist-tags":{"latest":"0.9.7"},"versions":{"0.8.5":{"name":"@diegomarvid/whatsapp-assistant","version":"0.8.5","_id":"@diegomarvid/whatsapp-assistant@0.8.5","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"0b7e772a8ce78c886d3660cf4bce35c7fe4b19a6","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.8.5.tgz","fileCount":21,"integrity":"sha512-sUNtqb9prD9wwgQt8gHzQMLqF2ZaT3Qcy5awFrWCvUtLLPKlG5xa5ogfjTQ2JxzQ203ggk8we0RWCtLGnhjjpA==","signatures":[{"sig":"MEQCIGI9yDmzXwdO6+2fM6Gbkb90akMLhr7AJ4GJpqS1RmddAiAoweJP8PBaPzQB+TWzkpHrp0xP77i7GtVs6OjzYoG8oA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":391812},"type":"module","_from":"file:/var/folders/js/z6tnxlwx7gx01nvhmd8r0_w00000gq/T/tmp.Wd1BXczMHC/diegomarvid-whatsapp-assistant-0.8.5.tgz","engines":{"node":">=22"},"scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"_resolved":"/var/folders/js/z6tnxlwx7gx01nvhmd8r0_w00000gq/T/tmp.Wd1BXczMHC/diegomarvid-whatsapp-assistant-0.8.5.tgz","_integrity":"sha512-sUNtqb9prD9wwgQt8gHzQMLqF2ZaT3Qcy5awFrWCvUtLLPKlG5xa5ogfjTQ2JxzQ203ggk8we0RWCtLGnhjjpA==","repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"11.17.0","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"26.5.0","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.8.5_1784643715341_0.5472661629730744","host":"s3://npm-registry-packages-npm-production"}},"0.8.6":{"name":"@diegomarvid/whatsapp-assistant","version":"0.8.6","_id":"@diegomarvid/whatsapp-assistant@0.8.6","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"070453a237c77227e8bc6d586c25ee8c1d214795","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.8.6.tgz","fileCount":25,"integrity":"sha512-Vyk8wo0nGR6YBuDcr06VsRZ2MTPCb9t7PFeHZb8svA15JSfsWUuPx8uJCMXrtaENMjesT7xjrKWba8UhJTtvkA==","signatures":[{"sig":"MEYCIQDWxA5Bf2/5X+d3fsZShWayjYOICpmE2iMBnK8/xVJELgIhAPaSAhL8+rI/0e71CoRGA7FMThNzLJm7SYZiP+8P+bI3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":405276},"type":"module","engines":{"node":">=22"},"gitHead":"7945056f895cdd406439ad6dd5dec66a004a6668","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/bridge-endpoint.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"11.17.0","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"26.5.0","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.8.6_1784646207030_0.1871365336948434","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.0","_id":"@diegomarvid/whatsapp-assistant@0.9.0","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"dc903316687b116d9c20e80874e9505b2cf77516","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.0.tgz","fileCount":25,"integrity":"sha512-zTfiUf3BjzRItNabmoTHtDX9X3BBQiEvNd37gmvEZsq7Y4n+/fDfIRQxgRXo/NxDoLXuYubAO18c/4nTG7eK6w==","signatures":[{"sig":"MEYCIQCIhpS/ELaR3Uqt0ennhTyHebirziZ9tQRWTb/g7O3+ZQIhAL/IU53f0FeKL3Zc4Ulkz4FYDT+PmasprNxo1mVE62V1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":415986},"type":"module","engines":{"node":">=22"},"gitHead":"4a8908837261a0d9ddee74ce1d566e154eaf18e5","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/bridge-endpoint.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.0_1784647827319_0.8259128837590146","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.1","_id":"@diegomarvid/whatsapp-assistant@0.9.1","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"0567cd796e4671e98994247d133b5da6c079a936","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.1.tgz","fileCount":34,"integrity":"sha512-0BP5xhvLaQ2FEVwvVoROvJN7C2qwKNOWZKRSKjW35q/KVkTacdVDVysbbuD90KEB6TKqXJODu5DZQYgykNWmyQ==","signatures":[{"sig":"MEYCIQDzy7YcVSwpMYTBbZk9QBxx4h/xbH5SxW99FZ7V3autegIhAPuIZ/WEOebtH9uWE5uL4FWd3m+mmr/qUiFepQy98+d2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":419362},"type":"module","engines":{"node":">=22"},"gitHead":"f9cff54d06a1eb080d5310c52e44e45428edcd5f","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.1_1784649533715_0.9726638841179751","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.2","_id":"@diegomarvid/whatsapp-assistant@0.9.2","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"448156b5ce865a03db5cf25550abce8b26dbbb5d","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.2.tgz","fileCount":34,"integrity":"sha512-P2jTGvv3TQx4f2msGmZf2yvaRfNgVgcKAAg4Q11eord9Hdgaeo2Yb5IUlGkRH/gURcphiZnOG8jsvEsxl6sPjg==","signatures":[{"sig":"MEUCIDD6FLU7jv2YO8pYVSxEuid9Xyelesu09bySWGuX2yKUAiEA+lTBOsC+TL/IRd1vCR20PdY4jTZqzBXy9bElAHA80Us=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":538527},"type":"module","engines":{"node":">=22"},"gitHead":"fa099f28b5314893e18b4513920683d1820f240e","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.2_1784650414996_0.8400984686302517","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.3","_id":"@diegomarvid/whatsapp-assistant@0.9.3","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"698537bfd60c45abd5a4fb1fee44836c9220752f","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.3.tgz","fileCount":36,"integrity":"sha512-mezNPyyJVIdI/XtSnphOTBSAZ3zAvqk4BA6G353KWFsA58b1+GTp+Ss8uj5awOLihybgmvUzkc2b1O5ghHs9+g==","signatures":[{"sig":"MEQCIChuRB7sHSidI7uUV/r/kb+CthYZkKFzFF9So96vngZrAiBBJSUqouUjoZyVfY7Wh0RyxQuMIf4FNdEhuiDrreOZ6w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":548539},"type":"module","engines":{"node":">=22"},"gitHead":"7d03b1435d43fe12e1dce65b33e9597d009499a1","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/outbound-idempotency.js && node --check src/pending-outbound-requests.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.3_1784662145479_0.5722175353958712","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.4","_id":"@diegomarvid/whatsapp-assistant@0.9.4","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"e7be0097997b2cd26763a05d1348e98e407c90c0","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.4.tgz","fileCount":36,"integrity":"sha512-X6YLl1iC073IwGfN0t8CQgp1Xl3osDK8cZ7Wb7foJ9bvYWiTQsFUFafSsJvbbmeaz+DDHGcotyk8FoXnEXR3Cw==","signatures":[{"sig":"MEMCH2xHbiJ4Tz2Jl9NdP6L6LVyXX8Myh4xgm94FIkQD4WcCIC0nPcKqJXwd0UcdLHUTS7LXhCRilvZ5Ch7vDzS5xcid","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":549463},"type":"module","engines":{"node":">=22"},"gitHead":"87df73ff0dcabecaf375a058c9980727e27b0bd5","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/outbound-idempotency.js && node --check src/pending-outbound-requests.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.4_1784676018917_0.37474585400068117","host":"s3://npm-registry-packages-npm-production"}},"0.9.5":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.5","_id":"@diegomarvid/whatsapp-assistant@0.9.5","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"cc526bc519531134bc4ed43a83240c151efebcf7","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.5.tgz","fileCount":36,"integrity":"sha512-N8WqphtU1HTBoyxASmYnk2H1Urf5rBqwvP7eDV29xCmQli++tSqNAIxwm6iiFoGbJEJ9fRcv+zEOzfeyCqn5kA==","signatures":[{"sig":"MEQCIBdi7lRk06a1p0ca17D4JsE3OtLcBF1raID0NHsg7kuIAiAnR9bX5cB0wOmp6e9TViwucdsrA9tXAIeiAIc9tUATTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":552627},"type":"module","engines":{"node":">=22"},"gitHead":"1009fdafc6e45f8a6668b6b94ca64e4d0091ab03","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/outbound-idempotency.js && node --check src/pending-outbound-requests.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.5_1784718345482_0.678828816912562","host":"s3://npm-registry-packages-npm-production"}},"0.9.6":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.6","_id":"@diegomarvid/whatsapp-assistant@0.9.6","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"bin":{"wa":"bin/wa.js"},"dist":{"shasum":"cf8e7bdc64dd3ba9d5522d53ab1f114f13274355","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.6.tgz","fileCount":36,"integrity":"sha512-yQkIvfHE7Al3ILNJUtd7hEm9vtB1D7KAvX7Zm3wI5W+Jaa9D7BoeN1DIhY4DZOD0OltgJi+y80XBmcz6XMJPgw==","signatures":[{"sig":"MEYCIQCD0+LmgzMg/8N6WfcrkbPkdd55zdwjdnM1vIlhYInXuwIhAKp8F6KM8rhcZOOHO9VV5fNMKhJcv/8L5x0PjjGKSnHR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":553198},"type":"module","engines":{"node":">=22"},"gitHead":"5e797c2ea513dc3e55bb1defc8dcb57c61bf81e1","scripts":{"dev":"node --watch src/server.js","test":"node --test","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/outbound-idempotency.js && node --check src/pending-outbound-requests.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","start":"node src/server.js"},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"repository":{"url":"git+https://github.com/diegomarvid/whatsapp-assistant.git","type":"git"},"_npmVersion":"10.9.8","description":"Local, read-only WhatsApp Web bridge powered by Baileys","directories":{},"_nodeVersion":"22.23.1","dependencies":{"pino":"^9.6.0","qrcode":"^1.5.4","baileys":"7.0.0-rc13","qrcode-terminal":"^0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/whatsapp-assistant_0.9.6_1784729162612_0.005401054752273815","host":"s3://npm-registry-packages-npm-production"}},"0.9.7":{"name":"@diegomarvid/whatsapp-assistant","version":"0.9.7","description":"Local, read-only WhatsApp Web bridge powered by Baileys","homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","repository":{"type":"git","url":"git+https://github.com/diegomarvid/whatsapp-assistant.git"},"bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"publishConfig":{"access":"public"},"type":"module","scripts":{"start":"node src/server.js","dev":"node --watch src/server.js","check":"node --check src/server.js && node --check src/message-engagement.js && node --check src/message-normalizer.js && node --check src/mirror-store.js && node --check src/chat-coverage.js && node --check src/chat-identity.js && node --check src/search-scope.js && node --check src/quoted-reply.js && node --check src/outbound-idempotency.js && node --check src/pending-outbound-requests.js && node --check src/bridge-endpoint.js && node --check src/bridge-client.js && node --check src/contact-resolve.js && node --check src/cli-format.js && node --check src/group-lists.js && node --check src/mac-contacts.js && node --check src/exec.js && node --check src/state-dirs.js && node --check src/daemon-control.js && node --check src/transcription.js && node --check src/history-policy.js && node --check src/runtime-paths.js && node --check src/launch-agent.js && node --check src/systemd-service.js && node --check src/transcription-runtime.js && node --check bin/wa.js","test":"node --test"},"bin":{"wa":"bin/wa.js"},"engines":{"node":">=22"},"dependencies":{"baileys":"7.0.0-rc13","pino":"^9.6.0","qrcode":"^1.5.4","qrcode-terminal":"^0.12.0"},"_id":"@diegomarvid/whatsapp-assistant@0.9.7","gitHead":"e8180c8818c98c442d89ce31082a4f8cf772efb8","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-C4Jor1z3AxNg8N+xE5B7WDNZvFoWojqPelgjQEub8Hz90UC1hrL3wwrgniPXOmrb7Bef56UYEhxxWCcpQDv/1A==","shasum":"0fa5b958382bba865d291019effa94f9e5d4e0b0","tarball":"https://registry.npmjs.org/@diegomarvid/whatsapp-assistant/-/whatsapp-assistant-0.9.7.tgz","fileCount":36,"unpackedSize":553455,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGoDfQBhA0FSJ2mYqaOMloxXCT67ETgBzgySJFSRFBFJAiA98ImKSeP9umuwBHS1Cb8InAtuyvFUPu7/AQyqo6E/Ug=="}]},"_npmUser":{"name":"diegomarvid","email":"diegomarvid99@gmail.com"},"directories":{},"maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/whatsapp-assistant_0.9.7_1784730676566_0.20816296186374905"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-21T14:21:55.215Z","modified":"2026-07-22T14:31:16.887Z","0.8.5":"2026-07-21T14:21:55.571Z","0.8.6":"2026-07-21T15:03:27.226Z","0.9.0":"2026-07-21T15:30:27.515Z","0.9.1":"2026-07-21T15:58:53.985Z","0.9.2":"2026-07-21T16:13:35.245Z","0.9.3":"2026-07-21T19:29:05.666Z","0.9.4":"2026-07-21T23:20:19.167Z","0.9.5":"2026-07-22T11:05:45.710Z","0.9.6":"2026-07-22T14:06:02.807Z","0.9.7":"2026-07-22T14:31:16.727Z"},"bugs":{"url":"https://github.com/diegomarvid/whatsapp-assistant/issues"},"homepage":"https://github.com/diegomarvid/whatsapp-assistant#readme","repository":{"type":"git","url":"git+https://github.com/diegomarvid/whatsapp-assistant.git"},"description":"Local, read-only WhatsApp Web bridge powered by Baileys","maintainers":[{"name":"diegomarvid","email":"diegomarvid99@gmail.com"}],"readme":"# 💬 WhatsApp Assistant\n\n> **Tu WhatsApp reciente, disponible para vos o tu agente de IA desde una CLI\n> local.** Lee el chat correcto, recupera adjuntos, entiende los hechos que\n> WhatsApp reporta y actúa sólo cuando se lo pedís.\n\nWhatsApp Assistant convierte una cuenta vinculada de WhatsApp en contexto local\n**reciente, verificable y accionable**. En vez de hacer que un agente adivine\nqué chat mirar o trabaje con una copia vieja, el comando `wa` le da mensajes,\nmedia, replies, receipts, reacciones y cobertura de sincronización desde un\nmirror privado de los últimos siete días por defecto —o de la ventana que la\npersona configure conscientemente durante el onboarding.\n\nNo es una integración oficial de WhatsApp. Nunca publica una API a Internet ni\ninterpreta el significado de tus conversaciones por reglas de texto.\n\n**Instalación en dos líneas** (detalle en [Instalación rápida](#-instalación-rápida)):\n\n```bash\n# macOS\nbrew tap diegomarvid/tap && brew install whatsapp-assistant && wa setup\n# Linux / VPS (Node 22+ y systemd)\nnpm install -g @diegomarvid/whatsapp-assistant && wa setup\n```\n\n![Arquitectura del bridge local](docs/assets/whatsapp-assistant-architecture.drawio.png)\n\n## ⚡ Una conexión, mucho más contexto útil\n\n| | |\n| --- | --- |\n| 🔄 **Siempre reciente** | Un bridge en segundo plano recibe eventos y conserva una ventana móvil de siete días por defecto; se puede ampliar explícitamente cuando el caso lo justifica. |\n| 🎯 **El chat correcto** | Resuelve números, aliases, nombres de WhatsApp y el LID actual antes de leer, responder o reaccionar. |\n| ✅ **Acciones sobre hechos frescos** | `latest`, replies y reacciones validan cobertura `fresh` para no actuar sobre un mensaje que quedó viejo. |\n| 🔒 **Privado por diseño** | API sólo en `127.0.0.1`; sesión, SQLite, aliases y adjuntos quedan en tu máquina, fuera de Git y Homebrew. |\n| 🧠 **Ideal para agentes** | Devuelve datos estructurados y paths absolutos; la IA interpreta el contenido con sus propias capacidades, en cualquier idioma. |\n\n## ✨ Todo lo que podés hacer\n\n### 💬 Leer conversaciones con contexto real\n\n- Encontrar personas por alias, teléfono, nombre de WhatsApp o actividad\n  reciente: `wa find \"Florencia\"`.\n- Ver el último mensaje entrante, la conversación reciente o buscar en todos\n  los chats de la ventana: `latest-incoming`, `history`, `search` y\n  `search-all`.\n- Saber si una lectura está realmente al día antes de concluir algo:\n  `wa coverage contacto`.\n- Mantener listas privadas de grupos de trabajo, inspeccionarlos y descubrir\n  nuevos sin hardcodear el universo de grupos.\n\n### 👀 Ver lo que pasó alrededor de un mensaje\n\n- Consultar entrega, leído, reproducido y receipts por participante para\n  mensajes propios; sin convertir la falta de un receipt en una conclusión.\n- Ver reacciones actuales, encuestas y votos observables, respuestas\n  interactivas, ubicaciones, contactos, llamadas perdidas y eventos de grupo.\n- Listar URLs HTTP(S) como hechos estructurales con mensaje, autor, hora e ID;\n  la IA las abre con su propia herramienta web, sin que el bridge scrapee ni\n  clasifique destinos.\n- Conservar el estado actual de mensajes editados, efímeros o revocados dentro\n  de la ventana reciente.\n\n### 📎 Trabajar con los adjuntos, no sólo con el texto\n\n- Listar y descargar selectivamente audios, imágenes, videos, stickers y\n  documentos. El resultado es un path local que cualquier IA puede abrir con\n  su herramienta visual o documental.\n- Transcribir audios localmente con un runtime Python privado y reutilizar un\n  modelo Whisper ya descargado cuando existe.\n- No asumir que una imagen o un PDF es texto: el bridge entrega el archivo y\n  deja su interpretación al runtime que lo invoca.\n\n### ✉️ Actuar cuando vos lo indicás\n\n- Enviar texto, documentos, imágenes, videos, audios y notas de voz.\n- Responder citando exactamente un mensaje o reaccionar al último entrante\n  **confirmado**.\n- Mencionar participantes explícitos en grupos.\n- Nada se envía por iniciativa del bridge: cada `send`, `reply` o `react`\n  requiere una instrucción explícita.\n\n### 🧱 Dejarlo funcionando una vez\n\n- Escaneás un QR una vez; el servicio se reconecta luego de reinicios de macOS\n  o Linux/VPS sin un navegador.\n- En onboarding elegís 7 días (default) o una ventana mayor; el CLI explica\n  que pedir full-history a WhatsApp no garantiza que el proveedor lo entregue.\n- Funciona como LaunchAgent en macOS o servicio `systemd --user` en Linux.\n- La sesión y SQLite sobreviven actualizaciones de Homebrew; `wa doctor` y\n  `wa status` muestran qué falta sin revelar chats ni secretos.\n\n## 🎯 Ejemplos que justifican tenerlo siempre activo\n\n| Si necesitás… | El agente puede hacer… |\n| --- | --- |\n| **No perder un follow-up** | Leer los últimos mensajes de una persona o de un conjunto de grupos, con hora, autor y adjuntos reales. |\n| **Responder con precisión** | Verificar cobertura, leer el último entrante y ejecutar un `reply` que cita ese mensaje —no uno anterior. |\n| **Entender un audio o una foto** | Descargar el adjunto puntual, abrirlo con la capacidad disponible y transcribirlo localmente si es audio. |\n| **Saber qué pasó en un grupo** | Consultar reacciones, receipts de tus mensajes, votos, participantes y eventos de grupo que WhatsApp haya reportado. |\n| **Compartir una entrega** | Enviar un PDF, imagen, video o audio por WhatsApp desde una ruta local con un mensaje explícito. |\n\n## 🤖 Guía rápida para una IA\n\nLa interfaz está diseñada para que un agente no tenga que conocer Baileys ni\nadivinar el estado de WhatsApp. El recorrido seguro es:\n\n```bash\n# 1. Resolver la persona y comprobar que el mirror está actualizado\nwa find \"Nombre\"\nwa coverage contacto\n\n# 2. Leer hechos recientes, con IDs para cualquier acción posterior\nwa latest-incoming contacto --ids\nwa history contacto 20 --ids\n\n# 3. Sólo ante una instrucción explícita: actuar sobre el ID confirmado\nwa reply contacto <message-id> \"Mensaje pedido por el usuario\"\n```\n\nPara límites temporales, receipts, reacciones y datos que no pueden\nreconstruirse del pasado, ejecutar siempre `wa help data` antes de inferir algo.\nPara la instalación y recuperación completa, seguir\n[`docs/onboarding-and-recovery.md`](docs/onboarding-and-recovery.md).\n\n## 🤔 ¿Por qué no wacli?\n\n[wacli](https://wacli.sh/) es una excelente CLI de WhatsApp (Go, whatsmeow,\nbúsqueda FTS5, canales, multi-cuenta) y para muchos usos es la mejor opción.\nEste proyecto apunta a otra cosa: **que un agente de IA pueda actuar sobre tu\nWhatsApp real sin equivocarse**, y varias decisiones salen de ahí.\n\n| | WhatsApp Assistant | wacli |\n| --- | --- | --- |\n| Modelo | Observer permanente (daemon gestionado) + contrato de frescura | Sync bajo demanda (`sync --follow` opcional) |\n| ¿Actuar sobre cache viejo? | `latest`/`reply`/`react` **se niegan** si el chat no está `fresh` | Devuelve lo que haya sincronizado |\n| Identidad | PN → LID vivo antes de cada acción; ambigüedad = error, nunca adivina el chat | Por chat/contacto sincronizado |\n| Señales | Receipts/reacciones/votos con semántica explícita (“sin receipt ≠ no lo vio”) | Datos crudos |\n| Audio | Transcripción Whisper local opcional | No incluida |\n| Historial | Ventana móvil acotada (7 días default) con poda: privacidad por diseño | Acumula lo sincronizado; backfill best-effort |\n| Superficie WhatsApp | Chats directos y grupos | Más amplia: canales, presencia, multi-cuenta, archivar/fijar |\n| Búsqueda | Substring sobre la ventana | FTS5 full-text |\n\nEn corto: si querés WhatsApp completo en la terminal, usá wacli. Si querés que\nClaude Code u otro agente lea y responda tu WhatsApp con un harness que le\nimpida contestar al chat equivocado o sobre información vieja, este proyecto\nexiste para eso.\n\n## 🚀 Instalación rápida\n\n### 🍺 macOS con Homebrew (recomendada)\n\n```bash\nbrew tap diegomarvid/tap\nbrew install whatsapp-assistant\nwa setup\n```\n\n`wa setup` instala y arranca un LaunchAgent local, y abre la imagen QR sólo si\nla cuenta todavía no está vinculada. Antes de iniciar el bridge, pregunta\ncuántos días querés conservar: **7** es el default. Si elegís más, solicita\nfull-history a WhatsApp con perfil desktop y guarda esa preferencia privada. La\nsolicitud puede tardar, consumir más disco y WhatsApp puede entregar menos —o\nfallar el sync—; no se borra la sesión para cambiarla. Después del vínculo\ninicial, el servicio se reconecta automáticamente al iniciar sesión en macOS.\n\nSi venías corriendo el bridge desde un checkout de desarrollo de este\nrepositorio, migrá primero el estado privado para conservar la sesión y el\nmirror sin escanear otro QR (una instalación nueva no necesita este paso):\n\n```bash\nwa migrate-state /ruta/al/checkout\nwa setup\n```\n\nEl estado instalado queda en `~/Library/Application Support/WhatsApp Assistant/`:\nahí viven `auth/`, SQLite, aliases, token y logs. Homebrew puede actualizar o\ndesinstalar el código sin borrar conversaciones recientes ni credenciales.\n\n### 🗓️ Elegir la ventana de historial\n\nLa retención local y el pedido de historial a WhatsApp son explícitos y quedan\nen un archivo privado. En una terminal interactiva `wa setup` pregunta la\nventana; para una IA o instalación no interactiva, el default seguro es siete\ndías.\n\n```bash\nwa history-policy show       # ver política activa y qué solicitó al proveedor\nwa history-policy set 30     # conservar 30 días y pedir full-history\nwa history-policy set 365    # un año, si WhatsApp lo entrega\nwa history-policy set all    # hasta 10 años locales; puede ser pesado\nwa daemon restart            # aplica un cambio a una sesión ya instalada\n```\n\nMás de siete días activa `syncFullHistory` y un perfil desktop de Baileys, que\nes un **pedido** al proveedor, no una garantía ni un bypass de WhatsApp. Si el\nvínculo o sync extendido falla, volver a `wa history-policy set 7`, reiniciar el\ndaemon y conservar `auth/`; no hace falta borrar estado ni escanear un QR de\nnuevo salvo que WhatsApp haya cerrado la sesión.\n\nSi una persona o un agente necesita orientación dentro del propio CLI:\n\n```bash\nwa --help\nwa help setup\nwa help data\nwa doctor\n```\n\n`wa setup` espera el arranque del bridge, abre el QR en macOS cuando WhatsApp\nnecesita vincular un dispositivo y deja como verificación final `wa status`.\n`wa doctor` muestra rutas, estado del daemon, presencia de SQLite/auth y si hay\nun QR pendiente; nunca muestra credenciales ni contenido de chats.\n\n### 🐧 Linux / VPS con systemd\n\nRequiere Node.js 22+ y una distribución con systemd. No requiere navegador ni\ninterfaz gráfica. Usá un usuario normal del VPS —no `root` ni `sudo wa`— para\nque el servicio, QR y sesión privada pertenezcan al mismo usuario. Si todavía\nno tenés Node, la ruta recomendada evita permisos globales de npm instalándolo\ncon `nvm` para el mismo usuario que va a vincular WhatsApp:\n\n```bash\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash\n. \"$HOME/.nvm/nvm.sh\"\nnvm install 22\n```\n\nAbrí una shell nueva si el instalador lo indica y confirmá antes de seguir:\n\n```bash\nnode --version # v22 o superior\n```\n\nDespués instalá el paquete público desde npm:\n\n```bash\nnpm install -g @diegomarvid/whatsapp-assistant\nwa setup\n```\n\nnpm moderno puede avisar que omitió scripts `postinstall` de dependencias\n(`allow-scripts ... baileys, protobufjs`). Es esperable e inofensivo: el bridge\nfunciona sin esos scripts y no hace falta habilitarlos.\n\nSi `npm install -g` falla con `EACCES` es porque el Node instalado es del\nsistema (root). La salida recomendada es instalar Node con `nvm` como el\nusuario final (arriba); alternativamente `sudo npm install -g …` funciona,\npero el estado privado y el servicio siguen siendo del usuario que corre\n`wa setup`, nunca de root.\n\n`wa setup` crea un servicio de usuario de systemd en\n`~/.config/systemd/user/whatsapp-assistant.service`, conserva el estado privado\nen `~/.local/state/whatsapp-assistant/` (o `WA_STATE_DIR`) e imprime el QR\ndirectamente en la terminal SSH, además de guardar una imagen privada. Para que\nel observer siga vivo al cerrar la sesión SSH o reiniciar el VPS, habilitá\nlinger una sola vez con permisos de administrador:\n\n```bash\nsudo loginctl enable-linger \"$USER\"\n```\n\n`wa setup` detecta si no hay un `systemd --user` utilizable o si Node es\ndemasiado viejo y devuelve una instrucción accionable antes de crear estado\nparcial. Al finalizar, `wa doctor` no dice `ready` mientras falte `linger`.\n\nVerificá el servicio sin exponer la cuenta:\n\n```bash\nwa doctor\nwa daemon status\nwa status\n```\n\nEsto asume una distro con systemd. En un contenedor o distro sin systemd, el\nbridge sigue funcionando con `npm start`, pero hay que ejecutarlo bajo el\nsupervisor propio del entorno.\n\n### 🛠 Desarrollo desde checkout (opcional)\n\nPara contribuir o correr el bridge desde el repositorio en vez de instalar el\npaquete, necesitás Node.js **22 o superior**. La búsqueda opcional en Contactos\nes una mejora exclusiva de macOS.\n\n```bash\ngit clone https://github.com/diegomarvid/whatsapp-assistant.git\ncd whatsapp-assistant\nnpm install\nnpm link\nnpm start\n```\n\nEn el primer arranque aparece un QR. En WhatsApp móvil: **Ajustes →\nDispositivos vinculados → Vincular un dispositivo**. Escanealo una sola vez.\nDespués, conservar `auth/` permite reconectar tras reiniciar la Mac sin volver a\nescanear.\n\nEn un checkout de desarrollo, el estado se conserva en `auth/` y `data/` del\nproyecto para compatibilidad. En la instalación Homebrew queda fuera del\npaquete. En ambos casos, el token, las credenciales y el mirror privado están\nexcluidos de Git.\n\n> [!IMPORTANT]\n> Antes de tocar una sesión, pedir un QR o modificar sincronización, leer\n> [`docs/onboarding-and-recovery.md`](docs/onboarding-and-recovery.md). El modo\n> normal es **sync reciente**, no un archivo histórico completo.\n\n### 🕰️ Qué se puede saber y desde cuándo\n\nEl CLI lo explica también con `wa help data`, pensado para que una persona o una\nIA conozca el límite antes de interpretar una salida.\n\n| Dato | De antes de instalar | Desde que el bridge está activo |\n| --- | --- | --- |\n| Texto, hora, remitente, citas y adjuntos | Sí, sólo si WhatsApp lo incluyó en el sync y sigue dentro de la ventana local configurada. | Sí, mientras WhatsApp lo entregue. |\n| Edición y contenido efímero | Puede verse el estado actual que llegó en el sync; no la versión original ni la secuencia anterior. | Se registran los cambios recibidos. |\n| Reacciones, entregas y vistos | Sólo si ese dato vino incluido en el mensaje sincronizado; no se promete para mensajes pasados. | Se registran las actualizaciones que WhatsApp reporte. |\n| Votos de encuestas | No se pueden reconstruir si no se observó la clave local y el voto. | Sí, cuando se observan creación y actualización. |\n| Llamadas perdidas y eventos de grupo | No se reconstruyen retroactivamente. | Sí, cuando WhatsApp los entrega al observer. |\n\nNunca se obtiene un historial completo ni se interpreta la falta de un *read\nreceipt* como “no lo vio” o “me está ignorando”. Los receipts individuales de\nun grupo sólo aplican a mensajes propios. Los mensajes *view once* no se\nexponen ni descargan. Antes de responder sobre “el último” mensaje, la IA debe\nconsultar `wa coverage contacto`; `fresh` confirma cobertura reciente, no una\nprueba de que WhatsApp haya emitido cada señal de interacción posible.\n\n### 🎧 Transcripción local (opcional)\n\nEl bridge funciona sin Whisper. La transcripción se instala aparte, pero queda\nencapsulada en un venv privado del CLI: no modifica el Python global ni depende\nde `ct`.\n\n```bash\nwa transcribe doctor       # inspecciona runtime y modelos locales; no descarga\nwa transcribe setup        # opcional: instala anticipadamente la librería Python adecuada\nwa transcribe pull         # descarga un modelo, explícitamente\nwa transcribe flor latest\n```\n\nAl pedir una transcripción por primera vez, el CLI crea ese runtime privado\nautomáticamente. Nunca baja un modelo de forma implícita: si\nno encuentra uno local, termina con una instrucción para que la IA pida\naprobación antes de ejecutar `wa transcribe pull`.\n\nEn Apple Silicon usa `mlx-whisper`; en Linux y Macs Intel usa\n`faster-whisper`. Ambos backends usan el cache estándar de Hugging Face. Antes\nde descargar, el CLI busca un snapshot compatible ya presente allí —por ejemplo\nun `mlx-community/whisper-large-v3-turbo` existente— y le pasa su path local al\nbackend, sin pedir ni bajar el modelo de nuevo.\n\nSi no hay modelo, `wa transcribe doctor` devuelve el modelo sugerido y el\ncomando exacto, pero **no descarga nada por sí mismo**. La IA debe consultar al\nusuario si prefiere descargarlo o indicar una carpeta local existente:\n\n```bash\nwa transcribe config model-path /ruta/al/modelo\nwa transcribe config model mlx-community/whisper-large-v3-turbo\nwa transcribe pull mlx-community/whisper-large-v3-turbo\nwa transcribe config language en   # default: es; \"auto\" delega la detección a Whisper\n```\n\nEn macOS, `mlx-whisper` necesita `ffmpeg` disponible; instalalo con `brew\ninstall ffmpeg` si hiciera falta. `faster-whisper` en Linux usa su runtime\nPython aislado.\n\n## 🧭 Uso diario\n\n```bash\nwa status\nwa find \"Florencia\"\nwa latest-incoming Florencia --ids\nwa history Florencia 20 --ids\n```\n\nGuardá una relación estable entre un nombre y un teléfono como alias privado:\n\n```bash\nwa alias add flor +598XXXXXXXX \"Florencia Ferrario\"\nwa latest-incoming flor\n```\n\nLos aliases viven en `data/aliases.json`, fuera de Git. `wa find` también puede\nusar nombres sincronizados por WhatsApp, mensajes recientes y, en macOS,\nContactos como complemento. No copia la agenda al mirror.\n\n## ⌨️ Comandos\n\n### Consultar chats y cobertura\n\n| Comando | Para qué sirve |\n| --- | --- |\n| `wa status` | Estado del bridge y cantidad de mensajes cacheados. |\n| `wa doctor` | Diagnóstico sin secretos: daemon, rutas privadas, SQLite, QR y health. |\n| `wa qr` | Abre el QR en macOS o lo imprime en la terminal (ideal por SSH). |\n| `wa find \"Nombre\"` | Busca aliases, identidad WhatsApp, mensajes recientes y Contactos de macOS opcionales. |\n| `wa recent 20` | Chats individuales recientes con identidad WhatsApp. |\n| `wa latest contacto` | Último evento del chat, entrante o saliente. |\n| `wa latest-incoming contacto` | Último mensaje **recibido** de ese contacto. |\n| `wa history contacto 20 --ids` | Últimos mensajes, con IDs para descargar, responder o reaccionar. |\n| `wa coverage contacto` | Indica si el chat está sincronizado (`fresh`) o si hay un hueco verificable. |\n| `wa help data` | Explica qué hechos recientes pueden venir del sync y qué eventos sólo se conocen desde que el bridge los observó. |\n| `wa message contacto <message-id>` | Hechos completos del evento: hora, autor, adjuntos, estado, reactions y receipts que el mirror haya recibido. |\n| `wa delivery contacto <message-id>` | Estado agregado de un mensaje propio en un chat directo (`enviado`, `entregado`, `leído` o `reproducido`) y su timestamp reportado por WhatsApp. |\n| `wa receipts grupo <message-id>` | Receipts individuales reportados por WhatsApp para **un mensaje propio** de grupo: entregado, leído o reproducido por participante. |\n| `wa unread-by grupo <message-id>` | Para un mensaje propio, participantes actuales sin **read receipt reportado**. No los llama “no leídos”. |\n| `wa reactions contacto-o-grupo <message-id>` | Reacciones actuales al mensaje, participante, emoji y hora si WhatsApp la reportó. |\n| `wa polls contacto` / `wa poll contacto <message-id>` | Encuestas observadas y sus votos descifrables, agrupados por opción y participante. |\n| `wa calls contacto` | Eventos de llamada que WhatsApp entregó mientras el bridge estaba activo, más mensajes de llamada perdida cuando existan. |\n| `wa links contacto` | URLs HTTP(S) literales del chat, con ID, autor, hora y cobertura del mirror; no abre ni resume destinos. |\n| `wa group-events grupo` | Cambios de participantes y metadatos de grupo observados por el bridge. |\n| `wa search contacto \"presupuesto\"` | Busca texto dentro de un chat. |\n| `wa search-all \"Oracle\" [--since 7d] [--ids]` | Busca texto en todos los chats de la ventana retenida (toda la ventana si no se acota) e indica de qué chat es cada resultado. |\n\n> `latest` incluye tus propios mensajes; para “¿qué me mandó X?”, usar siempre\n> `latest-incoming`. Ambos exigen cobertura reciente antes de responder.\n> El CLI no clasifica saludos, urgencia ni “pendientes”: expone eventos y la IA\n> decide su significado, en cualquier idioma.\n>\n> Un participante sin read receipt no es evidencia de que no haya visto el\n> mensaje. WhatsApp puede omitirlo por privacidad, conectividad o porque el\n> bridge todavía no recibió el evento. La salida usa deliberadamente\n> `withoutReportedReadReceipt` para reflejar ese límite.\n>\n> Los mensajes editados, efímeros y respuestas interactivas se representan como\n> tales. Un mensaje revocado se marca como eliminado y se purgan sus adjuntos\n> locales. Los mensajes *view once* no se abren ni descargan deliberadamente.\n>\n> Cada mensaje nuevo también preserva hechos de contexto: mensaje citado\n> (sin revelar contenido *view once*), menciones, si fue reenviado, preview\n> local de un link (URL/título/descripción) y metadatos de media como tamaño,\n> dimensiones, duración, nota de voz, GIF y páginas de documento. No son\n> resúmenes generados por IA.\n\n### 👥 Grupos de trabajo\n\n| Comando | Para qué sirve |\n| --- | --- |\n| `wa groups find maspeak` | Muestra grupos ya confirmados y propone candidatos recientes. |\n| `wa groups inspect <jid>` | Lee título, descripción y mensajes recientes antes de clasificar. |\n| `wa groups add maspeak <jid>` | Guarda un grupo confirmado en la lista privada. |\n| `wa groups participants <jid>` | Lista participantes y rol de un grupo para poder mencionarlos explícitamente. |\n| `wa coverage <grupo-jid>` | Verifica cobertura de un grupo usando su JID `…@g.us`. |\n\nLa lista está en `data/group-lists.json`, no en el código ni en Git. `find`\nsiempre vuelve a revisar los grupos actuales para poder descubrir nuevos.\n\n### 📎 Media y mensajes estructurados\n\n| Comando | Para qué sirve |\n| --- | --- |\n| `wa audios contacto` | Lista audios recientes y si su envelope está disponible. |\n| `wa audio contacto <message-id>` | Descarga un audio seleccionado. |\n| `wa transcribe setup` | Instala el backend Python aislado, sin descargar modelo. |\n| `wa transcribe doctor` | Muestra backend, runtime y modelos locales compatibles. |\n| `wa transcribe pull [modelo]` | Descarga explícitamente un modelo compatible. |\n| `wa transcribe contacto latest` | Descarga el audio más reciente y lo transcribe localmente. |\n| `wa transcribe contacto <message-id>` | Transcribe un audio concreto; el ID sale de `wa audios` o `wa history --ids`. |\n| `wa images contacto` / `wa image contacto <message-id>` | Lista o descarga una imagen seleccionada. |\n| `wa videos contacto` / `wa video contacto <message-id>` | Lista o descarga un video o GIF seleccionado. |\n| `wa stickers contacto` / `wa sticker contacto <message-id>` | Lista o descarga un sticker seleccionado. |\n| `wa files contacto` / `wa file contacto <message-id>` | Lista o descarga un documento entrante seleccionado. |\n| `wa locations contacto` | Devuelve coordenadas y datos de ubicación como JSON factual. |\n| `wa contacts contacto` | Devuelve tarjetas de contacto/vCard como JSON factual. |\n| `wa polls contacto` | Devuelve pregunta y opciones de encuestas, sin inferir intención ni votos. |\n| `wa message contacto <message-id>` | Devuelve el evento normalizado completo, incluidos los datos estructurados. |\n\nEl comando de transcripción correcto es `wa transcribe contacto latest` o\n`wa transcribe contacto <message-id>`: no recibe un selector genérico\n`<id|latest>` en la tabla porque el ID tiene que corresponder a un audio.\n\n`wa image`, `wa video`, `wa sticker`, `wa file` y `wa audio` descargan sólo el adjunto seleccionado y\ndevuelven su **path absoluto privado**. La CLI no interpreta imágenes, PDFs ni\ndocumentos: el agente que la invoca abre ese path con la capacidad visual o de\ndocumentos que tenga disponible. Así no se asume que una imagen es texto ni se\nacopla el bridge a un runtime concreto de IA.\n\n### ✉️ Acciones explícitas\n\n| Comando | Para qué sirve |\n| --- | --- |\n| `wa react contacto latest-incoming 👍` | Reacciona al último mensaje entrante confirmado. |\n| `wa reply contacto latest-incoming \"Entendido\"` | Responde citando un mensaje concreto. |\n| `wa send contacto \"mensaje\"` | Envía un texto. |\n| `wa send-file contacto /ruta/resumen.pdf \"mensaje\"` | Envía un archivo como documento. |\n| `wa send-image contacto /ruta/foto.jpg \"caption\" --reply-to latest-incoming` | Envía una imagen nativa, opcionalmente citando un mensaje. |\n| `wa send-video contacto /ruta/video.mp4 \"caption\"` | Envía un video nativo. |\n| `wa send-audio contacto /ruta/audio.ogg --voice` | Envía audio; `--voice` lo marca como nota de voz. |\n| `wa send grupo@g.us \"Hola\" --mention flor` | Envía texto y menciona contactos explícitos en un grupo. |\n| `wa edit contacto <id\\|latest> \"texto nuevo\"` | Edita un mensaje **propio** ya enviado. |\n| `wa unsend contacto <id\\|latest>` | Revoca (elimina para todos) un mensaje **propio**. |\n| `wa mark-read contacto <id\\|latest-incoming>` | Emite un read receipt explícito para un mensaje entrante. El bridge nunca marca leído por su cuenta. |\n\nEl bridge nunca envía, reacciona ni responde por su cuenta. `send`, `send-file`, `send-image`, `send-video`, `send-audio`,\n`react` y `reply` requieren un comando explícito; las operaciones que usan\n`latest` sólo se ejecutan si el mismo chat tiene cobertura `fresh`.\n\n### 🛡️ Confirmación de envíos\n\nCada envío explícito (`send`, `reply` y cualquier adjunto) lleva un identificador\nde idempotencia privado durante 24 horas. Si WhatsApp aceptó el envío pero la\nrespuesta local se perdió —por una desconexión o un timeout— repetir exactamente\nel comando recupera la confirmación original; **no crea un segundo mensaje**.\n\nSi el bridge se interrumpió cuando el estado quedó incierto, el CLI responde que\nel envío anterior sigue sin confirmar y tampoco lo reintenta a ciegas. Verificá\nprimero con el destinatario o con `wa history`; sólo enviá un reemplazo si se\npidió explícitamente. El registro local conserva únicamente un fingerprint, no\nel texto, caption, número ni ruta del archivo.\n\n## 🏗️ Cómo se mantiene actualizado\n\nWhatsApp puede representar el mismo contacto con un número telefónico (PN,\n`…@s.whatsapp.net`) o un identificador privado de cuenta (LID, `…@lid`). Los\nmensajes nuevos pueden llegar bajo el LID aunque un alias viejo señale al PN.\n\n1. El observer de Baileys recibe eventos en tiempo real y persiste el batch en\n   SQLite antes de que el CLI lo consulte.\n2. Cuando se consulta un contacto directo, el CLI pide `/resolve`: el bridge\n   traduce PN → LID actual usando el mapping de Baileys.\n3. `coverage` comprueba conexión, salud del observer y cursor. Un chat sin\n   eventos nuevos cuenta como `fresh` recién cuando WhatsApp confirmó que\n   drenó la cola offline de la conexión actual; hasta entonces —o si el cursor\n   remoto está adelante del mirror— el CLI no inventa un “último mensaje” ni\n   actúa sobre uno viejo.\n4. Una acción usa el JID y el message ID que salieron de esa misma lectura\n   confirmada.\n\n```mermaid\nflowchart LR\n  U[\"👤 Usuario / alias / teléfono\"] --> C[\"⌨️ CLI wa\"]\n  C --> R[\"🔎 /resolve\\nPN → LID actual\"]\n  R --> B[\"🔌 Bridge Baileys\\n127.0.0.1\"]\n  B --> M[(\"🗄️ SQLite\\nventana configurable\\n7 días por default\")]\n  W[\"💬 WhatsApp Web events\"] --> B\n  C --> V{\"✅ coverage\\nfresh?\"}\n  M --> V\n  V -->|\"sí\"| Q[\"latest / history /\\nreply / react\"]\n  V -->|\"no\"| S[\"⛔ sin conclusión ni acción\"]\n```\n\nLos grupos mantienen su JID `…@g.us` y no se remapean como contactos.\n\n## 🔐 Privacidad y límites\n\n- La API escucha solamente en `127.0.0.1`; todas las rutas salvo `/health`\n  requieren el token local.\n- El mirror conserva **siete días y hasta 10.000 mensajes** por default. Una\n  persona puede ampliar la ventana con `wa history-policy`; eso solicita más\n  historial a WhatsApp, pero nunca promete recuperar lo que el proveedor no\n  entregue y puede usar bastante más disco.\n- También guarda envelopes raw recientes para reintentos de Baileys, media\n  seleccionada y un audit técnico sin texto. Nada se sube.\n- El CLI no intenta detectar saludos, urgencia, intención ni “pendientes” por\n  regex o palabras clave. La IA interpreta el contenido después de leer los\n  hechos estructurales.\n- Canales/newsletters (`…@newsletter`), comunidades y estados de WhatsApp no\n  se espejan: el mirror cubre chats directos, grupos y sus eventos. Si un JID\n  de canal aparece en una cita o reenvío se conserva como dato, pero no hay\n  historial ni acciones sobre él.\n- `unknownTypeMessages` en `wa status` es el canary de drift: si WhatsApp\n  cambia formatos de mensaje sin romper la API, ese contador sube.\n\nPara el detalle de qué estado es privado y queda excluido de Git, ver\n[`docs/private-state.md`](docs/private-state.md).\n\n### 🔔 Las notificaciones del teléfono siguen llegando\n\nUn daemon conectado 24/7 puede robarle las notificaciones push a tu teléfono:\nBaileys marca la conexión como cliente “activo” tras el login, y WhatsApp\ntrata al cliente activo como el que muestra las notificaciones. El bridge\n**reafirma modo companion pasivo en cada conexión** (desde v0.9.4), así que tu\ncelular sigue sonando normalmente. Verificable: `wa status` debe mostrar\n`passiveModeAssertedAt` con un timestamp posterior a `lastConnectedAt`. Si\ndejás de recibir notificaciones en el teléfono, revisá primero eso y que no\nhaya otro cliente/bot vinculado a tu cuenta en modo activo.\n\n## 🩺 Operación y recuperación\n\n- `wa daemon status` muestra el servicio; `wa daemon restart` lo reinicia sin\n  desvincular WhatsApp. `wa daemon uninstall` elimina sólo el servicio y deja\n  intacto el estado privado.\n- `wa setup` instala un LaunchAgent en macOS o un servicio `systemd --user` en\n  Linux. En SSH imprime el QR en la terminal, sin navegador.\n- Dejá el proceso/LaunchAgent corriendo para recibir los eventos nuevos.\n- Si algo parece viejo, usar primero `wa status`, `wa coverage contacto` y\n  `wa latest-incoming contacto`.\n- Un reinicio normal con las credenciales existentes **no necesita QR**.\n- Pedir o resetear la sesión es el último recurso: seguí el checklist completo\n  en [`docs/onboarding-and-recovery.md`](docs/onboarding-and-recovery.md).\n\n## 🔌 API local\n\nTodas las rutas, salvo `GET /health`, requieren:\n\n```text\nAuthorization: Bearer <contenido de data/bridge-token>\n```\n\nEl endpoint default es `127.0.0.1:3847`; se puede cambiar con la variable\n`WA_BRIDGE_PORT` (si está definida al correr `wa setup`, queda fijada en el\nservicio). El CLI y el bridge la leen del mismo lugar, y la API nunca deja de\nser loopback-only.\n\n| Ruta | Uso |\n| --- | --- |\n| `GET /health` | Estado de conexión, sin token. |\n| `GET /snapshot` | Vista reciente consistente del mirror. |\n| `GET /resolve?jid=<jid>` | Resuelve un PN al LID vivo conocido por Baileys. |\n| `GET /coverage?jid=<jid>` | Frescura verificable de un chat (`fresh`, razones y timestamps). |\n| `GET /identities` | Nombres, actividad y conteos por chat, sin cuerpos de mensajes. |\n| `GET /chats?limit=50` | Chats conocidos, más recientes primero. |\n| `GET /messages?jid=<jid>&limit=50` | Mensajes sincronizados de un chat. |\n| `GET /search?q=&since=&scope=&jids=&normalized=1` | Búsqueda local con ventana, alcance y folding de diacríticos opcionales. |\n| `GET /events?kind=group\\|call&jid=` | Eventos de grupo o llamadas observados por el bridge. |\n| `POST /messages/edit` / `POST /messages/revoke` | Edita o revoca un mensaje propio. |\n| `POST /messages/read` | Emite un read receipt explícito para un mensaje entrante. |\n| `GET /groups` / `GET /groups?jid=<jid>` | Grupos participados o detalle con participantes. |\n| `POST /messages/send` | Envía texto, opcionalmente citando un mensaje (usa el envelope raw local para que la cita de media renderice) y con menciones. |\n| `POST /messages/react` | Reacciona a un mensaje concreto. |\n| `POST /documents/send` / `POST /media/send` | Envía documento, imagen, video o audio desde un path local. |\n| `POST /audio\\|images\\|videos\\|stickers\\|documents/download` | Descarga selectiva del adjunto de un mensaje. |\n\n---\n\nHecho para ser un asistente de contexto reciente: **local, verificable y sin\nconvertirse en un archivo de toda la cuenta**.\n","readmeFilename":"README.md"}