You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Added
Date filters say how they read the date (cli-core 0.384.0). The JSON answer of a command with a date filter,
such as contacts context, contacts timeline, messages sync, chats moderate and store export, gives meta.window with the since and until it used, in UTC, and meta.timezone when a date you typed had no zone
and was read in the local one.
cli-core 0.382.0. The first run opens the local store as version 28, which adds columns and removes
nothing.
Your messages show whether they were delivered and read. In a one-to-one chat, a message you sent carries delivery: delivered once it reached the other person's phone, read once they opened it. It comes from
WhatsApp's receipts, which serve, watch and any other command keep, and from the history push. It only moves
forward. A group's messages have none. watch --events prints each receipt. Needs cli-core 0.382.0 (store version
27). The engine speaks protocol 44.
A chat's mute, archive and unread mark from the phone are kept (cli-core 0.382.0). While serve or watch
runs, and from the history push, the local store saves whether a chat is archived, muted and until when, and
marked unread. So inbox and review over the store leave out muted and archived chats, and inbox lists a chat
you marked unread. A chat read on the phone loses its unread mark, and the store now counts each new message from
someone else after that read, so inbox shows a chat again once a new message arrives. chats show shows muted_until and marked_unread. What to watch for: a read on the phone resets the chat's last-message time to the
newest message the phone read. Engine wire change: mutedUntil and markedUnread on a chat. Engine protocol 45.
Calls to you are kept as messages, so inbox and review show who called. While serve or watch runs, a
call becomes a message in the caller's chat: "Incoming voice call" as it rings, then "Missed voice call", "Declined
voice call" or "Voice call" when it ends. It carries "action": "call" in provider_metadata, as tg marks its calls,
so chat stats do not count it as something said. A group call is kept as it rings. wa never answers or declines a
call. The engine speaks protocol 42.
Fixed
A store the pre-rename cli-messaging wrote is refused again, and left untouched (cli-core 0.385.0). Since
cli-core 0.382.0 such a file was opened and failed with internal_error; it now fails with configuration_error.
chats list shows the groups you are in. WhatsApp has no chat list, so the store knew only the groups a
history push or a message had named, and chats list kind:group could come back empty. Every connection now saves
the groups you are in, with their names and member counts; run serve (or any command that connects) once for
them to appear.
A chat is found by a name copied with its emoji, by part of its name and whatever the case. "Семья❤️" copied
from WhatsApp carries an invisible mark after the heart, and was refused as "no chat by that name or id" while
"Семья❤" worked. Names now match without that mark, ignoring case, and by part of the name, as wa already finds
a person (cli-core 0.381.0). A name that matches several chats is refused as before; the refusal now reads "N chats
match that name". What to watch for: a part of a name that used to be refused may now name a chat, when exactly
one chat matches it.
Reactions that other people send are stored (cli-core 0.381.0). serve and watch keep each
person's newest reaction, live and from the history push, and watch --events passes each one on as a person_reaction event. A message then shows its reaction counts and your own reaction, from the phone, in reactions. A reaction taken back is dropped, and an older history push no longer undoes a newer change. What to
watch for: a reaction you send with reactions add still goes to WhatsApp only, not to the store. Engine wire
change: a reaction event and a history push's reactions. Engine protocol 43.
stats chats retention and chats stats show read --since-time/--until-time in their --timezone, and a
date alone in retention's --until-time covers that whole local day (cli-core 0.380.0). stats charts, contacts timeline and the MCP stats tool name the zone in meta.timezone and give the UTC window in meta.window.
A chat you read on the phone stops counting as unread. While serve or watch runs, reading a chat on the
phone sets its unread count in the local store to 0, so inbox no longer shows it. Before, the count stayed until
the next history push. What to watch for: new messages do not raise a stored count, here or in any other chat, so
until the next history push inbox finds them only with --new. Archiving, muting, pinning, marking a chat unread,
deleting or clearing a chat on the phone are not saved yet, so inbox still lists an archived or muted chat. watch --events prints none of these changes, as in tg.
The ban error says its end time is in UTC. "the ban ends 2026-10-21T14:03:00.000Z" now ends in "UTC", so it is
not read as local time. standing.until is unchanged.
Changed — may break callers
A typed date or time is read in your zone, and a date alone covers your whole local day (cli-core 0.379.0). --since-time 2026-10-01 used to start at UTC midnight; it now starts at local midnight, and --until-time with a
date alone ends at the end of that local day. A time without an offset, such as chats mute --until 2026-10-09T09:00, is read in the command's --timezone where it has one, else in the computer's zone. A value
with Z or an offset means what it says, as before. What to watch for: a script that passed a date alone and
expected the UTC day now gets the local one; pass 2026-10-01T00:00:00Z to keep the old window. Stored and printed times stay
UTC.