Repository navigation
Releases: WireCatLabs/whatsapp-cli
Release list
0.21.0
Added
- A recorded run lists each request under its operation (cli-core 0.467.0). Every request to the
WhatsApp engine, and every Graph API call and media download ofwa <profile> bot, is awireline in the run's
events.jsonlwith its duration, outcome and error code. Engine lines keep a message's id, never a chat's id, a
phone number or text; Graph lines keep the path with ids as:id, never the address as sent or its query. search messagessays how many messages match in all:page.total(cli-core 0.501.0).--jsonadds
page.total: { value, relation }, shaped as Elasticsearch'shits.total:eqis the exact count,gtea lower
bound (counting stops at 10,000). The terminal addsshowing 1–20 of 144under the hits.search messages --discovershows follow-ups, later messages that may cancel or change a hit, and no longer
fails on a question with a time or a ratio ("until 22:00?") (cli-core 0.492.0, 0.496.0).messages list --offline,search messagesandsearch allsay when the store holds a chat only in part,
with themessages syncstep that would fill it (cli-core 0.493.0).
Changed — may break callers
-
search messages --discoversearches by meaning when the query uses-,NOT,OR, groups, phrases or
exact:(cli-core 0.506.0). Such a query ran strict search alone. Now its words still match the whole query
(discovery.method: "lexical-strict"), and messages near in meaning to its wanted words join them. Every hit found
by meaning, and every reply and follow-up added, matches every field of the query and every excluded word. -
whatsapp-cli requires cli-base 0.67.0 (cli-core 0.501.0).
-
search messages,search allandmessages list --offlineanswermeta.complete: falsewhen a chat they
read is held only in part, withmissingandnextnaming it (cli-core 0.493.0). A script that read
meta.completeas "every source answered" now also sees the archive's gaps. -
An unknown
transcribeWithin a profile refuses to transcribe withvalidation_error, naming the four values;
any value other thanlocalused to mean asking the messenger first (cli-core 0.499.0).
Fixed
search messages --discoverwith a narrow filter (chat:,date:) ranks that filter's own messages by
meaning when it holds at most 100,000 messages, instead of the 100 nearest overall, so it fills its page
(cli-core 0.506.0).search messages --discoverworks on a read-only store (cli-core 0.506.0).- A long rebuild in one process no longer makes another process's write fail with "database is locked"
(cli-core 0.506.0).
Security
- A run with moved folders no longer copies the owner's sign-in into the keyring when it refreshes a token
(cli-core 0.494.0).
0.20.0
Changed — may break callers
- Notes, documents and contact notes are found by any part of a word, in any letter case.
search notes 'bud'
finds «Budget», and a Cyrillic word matches whatever its case; the title is searched too, not only the text, and
results come back in milliseconds. A search of one or two characters is refused with "search needs at least three
characters", as message search already does; an empty one still filters nothing. The first run after the upgrade
moves your local store to a new format (version 40); notes stored before it are indexed in batches by
search notesorstore migrate, and until then they are matched as before. Nothing is fetched from WhatsApp. Run
every WireCat command line tool on this version the same day: an older one does not index new notes in a store
already at version 40. cli-core 0.490.0.
Fixed
- A budgeted mail sync finishes locating a large folder in the shared store (
memo,mail). cli-core 0.491.0.
0.19.0
Fixed
tags list name:ignores case in any alphabet, not only Latin.tags list 'name:*ТАРТ*'now finds a chat or
contact called «Тартус»; before, only A–Z folded, so a Cyrillic, Greek or accented name missed unless the case
matched. The first run after the upgrade moves your local store to a new format (version 38) and fills the folded
copies of chat titles and contact names; nothing is fetched from WhatsApp. cli-core 0.484.0.
Changed — may break callers
- The first screen (
--help) listsgcalunder "Works with", besidedrive. cli-core 0.482.0.
0.18.0
Added
messages transcribehears an audio file someone sent, not only a voice note. An iPhone recording reaches
WhatsApp as anaudio/mp4file; it is now transcribed by the local model. MP3, FLAC and Ogg Vorbis need nothing
extra; AAC/M4A needsffmpegon the machine, and without it the command says so. Audio longer than an hour is
refused. cli-core 0.481.0.
0.17.0
Added
- A shared contact card shows its name and phone, online and from the store: in JSON the attachment has
contact
(name,first_name,last_name,phone). The vCard itself is still never printed. Needs cli-core 0.477.0. reactions list <chat> <message>shows who reacted to a message, newest first, and takesreaction:🔥and
--limit/--cursor. WhatsApp has no request for it, so the list is what the local store received (the history push,
serveandwatch), not a live answer: a reaction sent withreactions add, or one that arrived while nothing
listened, is missing. Each person is listed once, with their newest reaction; one taken back is left out. A channel
refuses it (reactions.broadcast). Needs cli-core 0.480.0.
Changed — may break callers
contacts infoiscontacts show, which takes--offlineto answer from the store alone.--show-phoneis gone,
so a script that passes it fails as an unknown option; drop it.--hide-phoneis the opt-in that leaves a number out
(WhatsApp gives none for the account or a person, so it changes nothing here). The MCP toolcontacts infois gone
and a saved permissioncontacts.infois refused with theconfig unsetthat removes it;contacts.showcovers it.
0.16.0
Changed — may break callers
- The agent skill is listed on ClawHub as
wirecat-whatsapp. Install it with
openclaw skills install @wirecat/wirecat-whatsapp. Thewhatsapp-clilisting is no longer updated.
wa skill installstill writesskills/whatsapp-cli/.
0.15.0
Changed — may break callers
wa mcp servewith no profile is refused; name what it serves. Runwa <profile> mcp servefor one profile,
wa mcp serve --profiles work,personalfor a list, orwa mcp serve --profiles allfor every profile. With none it
exits2withvalidation_errorand lists the profiles. The same holds for--http,mcp revoke,
mcp server start|stop|statusandmcp config. An app entry that runswa mcp servewith no profile stops
working: print it again withwa mcp config --profiles all, orwa <profile> mcp config. The MCP Registry entry
now runswa mcp serve --profiles all(cli-core 0.470.0).- cli-core 0.473.0. Every message
waprints says whether you sent it (sender_is_me). A failed run's record
keeps the network's error code (runs show,error.cause_code).--offline --transcribelists the voice messages
it could not transcribe undermissing, with the command that does.
0.14.0
Changed — may break callers
- cli-core 0.469.0 and cli-base 0.65.0. cli-core 0.469 accepts only cli-base 0.65, so both pins move together.
cli-base 0.65 knows the verbsserveandrevoke, so their lint overrides are gone, and itscli-dev bundlefinds
a server started with a flag beforemcp serve. From cli-core 0.467 every run is recorded by default, successes
too, and says who asked for it (via);record: falsenow keeps failures. From cli-core 0.468, an MCP server offers
a command that only fetches into the store through its read tool. - The MCP server is
wa <profile> mcp serve;wa <profile> mcpalone prints help. Browser logins are
forgotten withwa <profile> mcp revokeinstead ofmcp --revoke, andwa mcp servewith no profile serves every
profile. A bot's server iswa <name> bot mcp serve. An app entry that runswa personal mcpmust change to
wa personal mcp serve: runwa personal mcp add <app>orwa personal mcp configagain.mcp server start,
the entriesmcp configprints and the MCP Registry entry already run the new command (cli-core 0.463.0). wa skill show|status|install --jsonprint{ item, meta }. The skill's fields moved underitem; the
Windows installer reads them from there (cli-core 0.462.0).wa account listsays whether each profile is signed in on this computer (signed_in), and search hits of
every kind name the fields an agent must read as data (untrusted). A caller that checks them against an older,
strict copy of the schema refuses the new field (cli-core 0.464.0 and 0.466.0).
Added
wa <profile> mcp server statussays what each logged-in browser app last did (cli-core 0.454.0).wa upgraderestarts the browser MCP server thatwa mcp server startlaunched on the same port, address and
limits (mcp_servers, old → new version); one started by hand is left running and named. Agent sessions over
stdio still on the old version are listed (stale_sessions): restart them from your agent app. This works from the
next upgrade on (cli-core 0.464.0).
Fixed
wastarts in about half the time: the package runs from a bundle. A command loaded about a thousand module
files before doing any work; it now loads a few dozen that hold the same code, built by cli-base's
cli-dev bundle. Warmwa messages list --helpwent from 416 to 200 ms,wa --versionfrom 39 to 18 ms. Output is
unchanged; the WhatsApp engine is still found in its platform package. A runningwa serveorwa mcp serveloads
all of its code soon after it starts, so upgradingwain place does not break it. The package is larger: 2.7 MB
to download instead of 0.3 MB.wa mcp servewith no profile marks the profiles that are not signed in. It listed every profile, so an app
could pick one with no linked device and fail. Each profile is now labelled (default — not signed in) in the
app's menu and in the description, and a call for one that is not signed in answers how to sign it in:
wa <profile> setup, or from WireCat Desktop.- The login page of the browser MCP server says each code works for one login. After an app logs in, a new code
appears in WireCat Desktop and inwa mcp server status(cli-core 0.466.0).
0.13.0
Added
wa mcpwith no profile serves every profile, on stdio and with--http(cli-core 0.450.0). An AI app needs one
connector for WhatsApp, not one per profile. Each tool takes a requiredprofile(every profile here, no default)
and the agent is told to ask when you did not name the account; the call runs in that profile's own
wa <profile> mcp, so its permissions apply as before. WhatsApp allows one connection per account: run
wa <profile> servewhile anotherwaprocess may hold it.--public-urltakes a path,https://<name>.ts.net/wa.- An unlinked profile's error also offers WireCat Desktop.
is not linked to WhatsAppnow says: runwa <profile> setupin a terminal, or link from WireCat Desktop (Tools → WhatsApp → Manage). The skill no longer sayschats delete|clearare left out of MCP: at levelaskMCP runs them. wa skill install --for hermesgives Hermes Agent the skill, andwa skill statussays what Hermes reads (cli-base 0.59.0). It adds~/.agents/skillsto Hermes'sskills.external_dirsthroughhermes config set, keeping the folders already listed, or copies the file into Hermes's home when that fails. With no Hermes installed it fails withnot_foundand writes nothing. A barewa skill installand--for allstill write only the Claude Code and~/.agents/skillscopies.skill status --jsongainshermesbesidetargets.- A run started by OpenClaw or Hermes Agent names that agent (cli-core 0.437.0).
runs showgivesagentasopenclawfor a command OpenClaw's agent ran, withfrom_chat: truewhen a chat message started it; a Hermes run carries its session, so a task claim from Hermes is held per session. - The
whatsapp-cliskill tells OpenClaw and ClawHub that it needswa, and how to install it (metadata.openclaw:requires.binsand the npm package@wirecat/whatsapp-cli). Withwamissing from PATH, OpenClaw marks the skill not ready and offers to install the package. Claude Code and Codex ignore the block. wa <profile> mcp server start|stop|statusruns the HTTP MCP server in the background (cli-core 0.445.0).starttakes--public-url,--portand--permissionasmcp --httpdoes and returns once the server listens;statusgives the port, the address, the one-time login code and the apps that logged in;stopends only the server it started.
Changed — may break callers
-
wa needs cli-base 0.63.0 (cli-core 0.452.0). Nothing wa uses changed in it.
-
A run record keeps the command line as typed (cli-core 0.439.0 to 0.447.0).
runs showandrun.jsoncarryargv, the words afterwa, with secrets[redacted](a secret-named option, a password in a URL, a known token format, a random-looking string) and a phone number never kept.wa <profile> config set record_input falsekeeps[redacted]in place of every typed value that may be text. Recorded events still hold ids, never a chat's title or a message's text.
Fixed
-
Search by meaning and
--discoverrun on the native ONNX Runtime on Windows too (cli-core 0.451.0). After
wa <profile> models download, text models and the reranker use the native library on Windows x64 and arm64, as
they already did on Linux and macOS: 2–3× faster than WebAssembly. The download takesonnxruntime.dllfrom the
onnxruntime-nodenpm package (113.5 MB, once, checked by sha256). Picture models (CLIP, SigLIP2) use the native
library as well, wherever it is installed. Results are the same. -
Every command spends less time getting ready (cli-base 0.62.0, cli-core 0.449.0). The check of shared commands now
describes each command once, not again for every group above it. It was about 60% of each command's setup; in tg a
warmrun(["--version"])went from 49 to 29 ms. It catches the same changes as before. -
Search by meaning and
search messages --discover's reranker run 2–3× faster on Linux and Apple-silicon Macs after the nextwa models download(cli-core 0.448.0). The download installs a native ONNX Runtime, and the models run on it; without it they run as before. The reranker now reads only the start of the message a hit replies to (cli-core 0.447.0).
0.12.0
Added
search messages --discoverreranks its first 50 hits once a reranker is downloaded (cli-core 0.435.0). A local model reads the question with each hit, and its score is mixed with discovery's own; the hits after the first 50 keep their order. The default is mMARCO (136 MB,wa models download mmarco); the profile settingsearch_rerankerpicksbge-reranker-v2-m3(588 MB) oroff. Each reranked hit hasdiscovery.reranker_score;scorestays discovery's. Without the model, discovery keeps its order and saysnot reranked: …(in--jsonand MCP:missingandnext). A search never downloads a model and never sends text anywhere;--exact,--newestand strict queries are untouched.search allfinds messages by meaning too, once e5-small is downloaded and messages have their vectors (cli-core 0.435.0). The meaning hits are merged with the word hits into one messages list; each item'sfoundBysays which search found it. A query with NOT, or with a filter under OR or in a group, stays words only. Without the model or the vectors,search allreads words as before and says why.--exactand--backend serverstay words only.
Changed — may break callers
- The shared store moves to version 34 (cli-core 0.434.0). Search by meaning ranks through a vector index kept in the store, built on the first open by this version. Once this version opens the store, a CLI on cli-core 0.433.0 or older refuses it and asks to be upgraded, so upgrade every WireCat CLI that shares the store together. When the index's SQLite extension is missing or does not load, opening the store fails with
store.vector-extension-missingorstore.vector-extension-failed: reinstall wa.store checkreportsvector_indexesand fails when an index is out of step. wa upgrade --helpshows onlywa upgrade --checkas its example (cli-core 0.433.0). The barewa upgradeexample is gone: copied and run, it upgraded.- Analysis through Anthropic sends the key as
Authorization: Bearer(cli-core 0.433.0). It used to sendX-Api-Key. A gateway at a custommodels.<purpose>.base_urlthat readsX-Api-Keymust readAuthorizationinstead.
Fixed
- A stored vector goes once no text in the store uses it (cli-core 0.435.0). An image whose picture changed and a purged chat (
store clear --left, a chat merged into another) left vectors behind, and no longer do.store rebuilddrops the ones older versions left (unused_vectors_dropped), andstore checkcounts them (vectors.unused). conversations embeddings clear --chatdrops the chat's message vectors too (cli-core 0.435.0), not only its conversations'.