一键导入
WhatsApp messages, contacts, groups, and live voice calls (place/answer, talk in your own voice; not generic text/message). Requires whatsapp daemon.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
WhatsApp messages, contacts, groups, and live voice calls (place/answer, talk in your own voice; not generic text/message). Requires whatsapp daemon.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use for any Microsoft account, personal or work (Outlook.com, Hotmail, Live, Microsoft 365); preferred over email-client for Microsoft accounts. Graph-based mail (read/send/reply/forward, drafts, flag/categorize, move/archive, folders, attachments, block senders), calendar and meetings, Microsoft Teams (chats, channels, presence), and new-mail/Teams notifications. Requires daemon.
Browse, navigate, click, fill forms, screenshot, or scrape web pages with a stealth (Camoufox) browser.
Design judgment and UI copy for building Vesta dashboard widgets that feel considered rather than templated, within the fixed design system.
Use before building or modifying the user's dashboard: widgets, pages, layouts, custom UI. Understand what the user wants, design it, write a spec, then dispatch the dashboard-builder to build it.
Use when someone who doesn't have their own vesta asks what vesta is, how to get one, or hints they want in. Vesta is invite-only: you gatekeep and build desire through scarcity, draw out what they want, then sell vesta as indispensable to their goals and set them up end-to-end in chat. Not for the owner, who already has one.
Talk to vestad, the host daemon that runs this container. Register a background service to get a port, build public URLs, update vestad to the latest release, check its version, and read gateway logs. Use when a skill needs an inbound port or a shareable link, when the user asks to update Vesta, or when debugging gateway/container issues.
| name | |
| description | WhatsApp messages, contacts, groups, and live voice calls (place/answer, talk in your own voice; not generic text/SMS). Use to message or call someone on WhatsApp. |
whatsapp)You never stop or restart anything, and you don't manage the daemon by hand. The
whatsapp CLI runs its own background daemon: the restart skill runs whatsapp start at boot to bring it up (so inbound WhatsApp notifications flow before you
send anything), and every command below also brings it up on demand. Your whole
world is four verbs: connect, status, send, messages (plus profile and calls).
If whatsapp status shows linked: false, run whatsapp connect, except when
it also shows connecting: true. In that case a QR page is already active:
wait for the user to scan it and do not start another connect. This is the only
recovery you ever need. Never re-link, re-pair, or "restart the daemon" any other
way; connect is idempotent outside an active QR session.
whatsapp connect is the single setup verb. It picks the right path for the box on
its own, so you never choose between modes. Every output carries a next: step, so
just do what it says:
whatsapp connect --opener '<your opener>'. The
opener is prefilled for the USER to send TO you, so phrase it as the user reaching
out. The command claims the agent's own managed number and links
it, returning {status:"linked", number, next:...}. Follow next: share the
number and its wa.me link so the user messages you FIRST (reply-first: never
cold-initiate), then reply only once they do.{status:"provisioning", next:...} means the number is still
being set up. Re-run whatsapp connect in about 30 seconds; repeating is safe.{status:"blocked", next:...} means that number was banned. Re-run
whatsapp connect to get a fresh one.{status:"rate_limited", reason, next:...} means the number keeps
failing to link and the ban guard paused pairing. Wait out the cooldown named in
reason before running whatsapp connect again; retrying sooner is what gets a
number banned.{status:"linking", url, next:...}. Send the user the URL to scan in WhatsApp >
Settings > Linked Devices. The command returns as soon as the live page is ready.
Wait for the user to say they scanned it, then run whatsapp status once. Never
choose a port, register a QR service, or run a second connect while the page is
active. If the user cannot scan a QR, and
explicitly approves a pairing attempt, run whatsapp connect --phone '+E.164'
with the exact account number. Confirm the echoed number, then send the returned
code for WhatsApp > Linked Devices > Link a Device > Link with phone number.
While that code is active, wait for the user and do not run connect again. See
SETUP.md / MANAGED_AUTH.md.whatsapp connect --own-number): the pool hands you a
fresh number and its verification code to relay; the USER registers that number on
their OWN phone and owns it, and you link only as a companion. Use this only when the
user wants the WhatsApp account to live on their own device: they keep their phone
online and re-link it themselves if it drops. Normal messaging applies (no reply-first
restriction, since the number is theirs, not a fresh pooled one).DOUBLETICK_API_URL and
DOUBLETICK_API_KEY (a per-account wak_ token they minted for you), whatsapp connect uses them automatically: the same managed number and pairing, straight to the
home box, no membership gate and no control plane in the loop. You do nothing
different, it is transparent. This is how a non-managed agent gets a pooled number
when the operator has handed them a token.Before the companion connects, egress selection is WHATSAPP_PROXY_URL, then a
doubletick residential lease, then direct. If you're managed or on a datacenter IP,
the skill leases a residential proxy from doubletick automatically; it hardfails
rather than run WhatsApp over a datacenter IP. A supplied proxy is validated too.
whatsapp status is your one diagnostic:
{"linked":true,"number":"+44...","connected":true}{"linked":false,"connecting":true,"method":"qr","next":"wait for the user to scan..."}{"linked":false,"connecting":true,"method":"phone","next":"wait for the user to enter..."}{"linked":false,"connected":false,"next":"run: whatsapp connect","reason":"<why>"}whatsapp <subcommand> [positionals] [--flag value ...]. Subcommand goes first, before any flags.whatsapp send 'Alice' 'Hi' is identical to whatsapp send --to 'Alice' --message 'Hi'). You can always use the flag form.whatsapp <subcommand> --help. The top-level whatsapp with no args prints the command list.--to / --chat-id / --group: contact name, phone (+E.164), group name, or JID; the CLI resolves them.--message - and a quoted heredoc, as in the example below. The shell expands nothing inside <<'MSG', so apostrophes, quotes, backticks, $(...) and newlines all pass through untouched. An inline --message 'text' breaks on the first apostrophe, so use it only for text you can see has none.send-message enforces short-bubble texting: a wall (over ~220 chars, or any text after a full stop) is rejected so you re-send as several short calls, one thought each. Don't use full stops at all: a ., ! or ? may only close a bubble, never carry text after it. Ellipses stay free, they're a beat rather than a stop. For genuine reference material the user asked for (a brief, a code block, a list), pass --longform to bypass. This applies to heredoc sends too, so --longform is the only escape hatch.1. or 2) is not a full stop, so a list does not need --longform.# The one shape to use for any message body. Replace only the middle line.
whatsapp send --to 'Alice' --message - <<'MSG'
can't wait to see you
MSG
whatsapp send --to 'Alice' --message - --reply-to '<message_id>' <<'MSG' # quote a message
same here
MSG
--to accepts a contact name, phone (+E.164), group name, or JID; the CLI resolves it.--message - reads the body from stdin; pair it with a quoted heredoc so the shell cannot
mangle or evaluate anything in the text.--longform only for genuine
reference material the user asked for (a brief, a code block, a list).add-contact (name + phone).whatsapp messages [--to <name>] [--query <text>] [--after <RFC3339>] [--limit N] reads the local DB.whatsapp chats, whatsapp contacts, whatsapp groups list the obvious things.whatsapp backfill --to <name> asks the phone for older history when the local DB is thin.whatsapp check-delivery --message-id <id> (or --recent) checks whether a send landed.message_id) or messages output.Change the agent's own WhatsApp name/picture from its own client (no phone, no QR, works while linked):
whatsapp profile name 'mozzy' sets the display (push) name. Account-wide and immediate, but a
contact keeps seeing the OLD name until you next message them, so message them once to refresh it.whatsapp profile photo ~/avatar.jpg sets the picture. JPEG (PNG is auto-converted), roughly square (~640x640).People change their minds after they hit send, so a message you already read can change or vanish:
edit notification whose body carries what the message says now, just like a plain message, naming the message that changed (target_message_id) and the text you last saw (old_text). The stored message is rewritten, so list-messages and search show only the new text. Answer again only if the edit asks something new: a fixed typo needs nothing from you.revoke notification with the text you last saw in old_text. They took it back, so treat it as unsaid and do not quote it at them.Hold a live call in your own voice (the voice skill's TTS) and hear the other person (its STT):
call_utterance notifications; it interrupts like any message,
so you answer live by speaking with whatsapp say '<one short line>' (one spoken thought at a
time, not a monologue). A newer say replaces whatever is still playing.whatsapp call --to <name> places a call and returns once answered; greet them with say.
Inbound calls answer automatically. whatsapp hangup ends it; whatsapp call-status reports the active call.voice skill with both STT and TTS; without it, calls are declined and you are told to set it up.whatsapp call for the genuinely
time-critical (a real deadline, a safety or money issue, something they asked to be called about)
and only after messages went unanswered. Respect anything the constitution says about calling.whatsapp with no args lists everything. Others (all take --help): send-file, send-audio,
react, revoke-message, download-media, create-group, leave-group, rename-group,
set-group-description, set-group-photo, get-group-invite-link, update-group-participants,
archive-chat, delete-chat, remove-contact.
say lines) in a parallel tool-call
block: if one fails you can't tell which landed, and a retry sends a duplicate; parallel say lines race.+ (e.g. +12025551234). Auth state lives in ~/.whatsapp/.Advanced setup (second/personal account, read-only, silent instances) and how to develop the CLI: see SETUP.md and DEVELOPING.md.
[How the user prefers to communicate with different contacts]