Skip to content

Releases: WireCatLabs/whatsapp-cli

0.21.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 22:57
7c21751

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 of wa <profile> bot, is a wire line in the run's
    events.jsonl with 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 messages says how many messages match in all: page.total (cli-core 0.501.0). --json adds
    page.total: { value, relation }, shaped as Elasticsearch's hits.total: eq is the exact count, gte a lower
    bound (counting stops at 10,000). The terminal adds showing 1–20 of 144 under the hits.
  • search messages --discover shows 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 messages and search all say when the store holds a chat only in part,
    with the messages sync step that would fill it (cli-core 0.493.0).

Changed — may break callers

  • search messages --discover searches 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 all and messages list --offline answer meta.complete: false when a chat they
    read is held only in part, with missing and next naming it (cli-core 0.493.0). A script that read
    meta.complete as "every source answered" now also sees the archive's gaps.

  • An unknown transcribeWith in a profile refuses to transcribe with validation_error, naming the four values;
    any value other than local used to mean asking the messenger first (cli-core 0.499.0).

Fixed

  • search messages --discover with 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 --discover works 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

Choose a tag to compare

@github-actions github-actions released this 31 Oct 03:24
e3345f7

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 notes or store 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

Choose a tag to compare

@github-actions github-actions released this 31 Oct 00:28
5e0c287

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) lists gcal under "Works with", beside drive. cli-core 0.482.0.

0.18.0

Choose a tag to compare

@github-actions github-actions released this 30 Oct 08:04
646cc20

Added

  • messages transcribe hears an audio file someone sent, not only a voice note. An iPhone recording reaches
    WhatsApp as an audio/mp4 file; it is now transcribed by the local model. MP3, FLAC and Ogg Vorbis need nothing
    extra; AAC/M4A needs ffmpeg on the machine, and without it the command says so. Audio longer than an hour is
    refused. cli-core 0.481.0.

0.17.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 22:53
eec26f7

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 takes reaction:🔥 and
    --limit/--cursor. WhatsApp has no request for it, so the list is what the local store received (the history push,
    serve and watch), not a live answer: a reaction sent with reactions 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 info is contacts show, which takes --offline to answer from the store alone. --show-phone is gone,
    so a script that passes it fails as an unknown option; drop it. --hide-phone is the opt-in that leaves a number out
    (WhatsApp gives none for the account or a person, so it changes nothing here). The MCP tool contacts info is gone
    and a saved permission contacts.info is refused with the config unset that removes it; contacts.show covers it.

0.16.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 17:24
f86b373

Changed — may break callers

  • The agent skill is listed on ClawHub as wirecat-whatsapp. Install it with
    openclaw skills install @wirecat/wirecat-whatsapp. The whatsapp-cli listing is no longer updated.
    wa skill install still writes skills/whatsapp-cli/.

0.15.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 16:17
9431ad1

Changed — may break callers

  • wa mcp serve with no profile is refused; name what it serves. Run wa <profile> mcp serve for one profile,
    wa mcp serve --profiles work,personal for a list, or wa mcp serve --profiles all for every profile. With none it
    exits 2 with validation_error and lists the profiles. The same holds for --http, mcp revoke,
    mcp server start|stop|status and mcp config. An app entry that runs wa mcp serve with no profile stops
    working: print it again with wa mcp config --profiles all, or wa <profile> mcp config. The MCP Registry entry
    now runs wa mcp serve --profiles all (cli-core 0.470.0).
  • cli-core 0.473.0. Every message wa prints 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 --transcribe lists the voice messages
    it could not transcribe under missing, with the command that does.

0.14.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 15:06
0b93bbb

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 verbs serve and revoke, so their lint overrides are gone, and its cli-dev bundle finds
    a server started with a flag before mcp serve. From cli-core 0.467 every run is recorded by default, successes
    too, and says who asked for it (via); record: false now 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> mcp alone prints help. Browser logins are
    forgotten with wa <profile> mcp revoke instead of mcp --revoke, and wa mcp serve with no profile serves every
    profile. A bot's server is wa <name> bot mcp serve. An app entry that runs wa personal mcp must change to
    wa personal mcp serve: run wa personal mcp add <app> or wa personal mcp config again. mcp server start,
    the entries mcp config prints and the MCP Registry entry already run the new command (cli-core 0.463.0).
  • wa skill show|status|install --json print { item, meta }. The skill's fields moved under item; the
    Windows installer reads them from there (cli-core 0.462.0).
  • wa account list says 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 status says what each logged-in browser app last did (cli-core 0.454.0).
  • wa upgrade restarts the browser MCP server that wa mcp server start launched 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

  • wa starts 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. Warm wa messages list --help went from 416 to 200 ms, wa --version from 39 to 18 ms. Output is
    unchanged; the WhatsApp engine is still found in its platform package. A running wa serve or wa mcp serve loads
    all of its code soon after it starts, so upgrading wa in place does not break it. The package is larger: 2.7 MB
    to download instead of 0.3 MB.
  • wa mcp serve with 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 in wa mcp server status (cli-core 0.466.0).

0.13.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 16:28
bff57a8

Added

  • wa mcp with 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 required profile (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> serve while another wa process may hold it. --public-url takes a path, https://<name>.ts.net/wa.
  • An unlinked profile's error also offers WireCat Desktop. is not linked to WhatsApp now says: run wa <profile> setup in a terminal, or link from WireCat Desktop (Tools → WhatsApp → Manage). The skill no longer says chats delete|clear are left out of MCP: at level ask MCP runs them.
  • wa skill install --for hermes gives Hermes Agent the skill, and wa skill status says what Hermes reads (cli-base 0.59.0). It adds ~/.agents/skills to Hermes's skills.external_dirs through hermes config set, keeping the folders already listed, or copies the file into Hermes's home when that fails. With no Hermes installed it fails with not_found and writes nothing. A bare wa skill install and --for all still write only the Claude Code and ~/.agents/skills copies. skill status --json gains hermes beside targets.
  • A run started by OpenClaw or Hermes Agent names that agent (cli-core 0.437.0). runs show gives agent as openclaw for a command OpenClaw's agent ran, with from_chat: true when a chat message started it; a Hermes run carries its session, so a task claim from Hermes is held per session.
  • The whatsapp-cli skill tells OpenClaw and ClawHub that it needs wa, and how to install it (metadata.openclaw: requires.bins and the npm package @wirecat/whatsapp-cli). With wa missing 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|status runs the HTTP MCP server in the background (cli-core 0.445.0). start takes --public-url, --port and --permission as mcp --http does and returns once the server listens; status gives the port, the address, the one-time login code and the apps that logged in; stop ends 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 show and run.json carry argv, the words after wa, 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 false keeps [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 --discover run 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 takes onnxruntime.dll from the
    onnxruntime-node npm 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
    warm run(["--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 next wa 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

Choose a tag to compare

@github-actions github-actions released this 26 Oct 00:36
0eaae4b

Added

  • search messages --discover reranks 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 setting search_reranker picks bge-reranker-v2-m3 (588 MB) or off. Each reranked hit has discovery.reranker_score; score stays discovery's. Without the model, discovery keeps its order and says not reranked: … (in --json and MCP: missing and next). A search never downloads a model and never sends text anywhere; --exact, --newest and strict queries are untouched.
  • search all finds 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's foundBy says 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 all reads words as before and says why. --exact and --backend server stay 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-missing or store.vector-extension-failed: reinstall wa. store check reports vector_indexes and fails when an index is out of step.
  • wa upgrade --help shows only wa upgrade --check as its example (cli-core 0.433.0). The bare wa upgrade example is gone: copied and run, it upgraded.
  • Analysis through Anthropic sends the key as Authorization: Bearer (cli-core 0.433.0). It used to send X-Api-Key. A gateway at a custom models.<purpose>.base_url that reads X-Api-Key must read Authorization instead.

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 rebuild drops the ones older versions left (unused_vectors_dropped), and store check counts them (vectors.unused).
  • conversations embeddings clear --chat drops the chat's message vectors too (cli-core 0.435.0), not only its conversations'.