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
zm <profile> stats meetings show|top: who talks and how much (cli-core 0.389.0). Talk time, lines and words
per speaker (the linked person, else the participant, else the transcript's name) and meetings and talk time per
week, over a date window, a project, a topic or an event. Numbers only; no transcript text is read.
Permissions per profile (WC-PERM-1..3, 9, 10): zm <profile> config set permissions '{"recordings": "readonly"}'.
A key is a command path, dotted; a level is deny, readonly, ask or allow, and the most specific key wins. --yes answers ask and never lifts deny or readonly. Settings, login, help and the MCP server are never gated.
meetings transcribe takes Zoom's recordings. A file that is not already a 16 or 48 kHz PCM16 WAV — MP4, M4A,
other audio and video — is decoded by the installed ffmpeg into a private temporary folder first, bit-exact, so
transcribing it again is a replay. zm does not install ffmpeg.
zm models audio list|download. The speech models transcription runs, in the folder every WireCat CLI shares. download checks every file's sha256, also the voice-activity model, and fetches again what does not match, so it
repairs a model left by another version.
Fixed
A speech model of the wrong version no longer crashes transcription with "this is a bug". The engine throws a
bare number when it cannot read a file; zm now says to run zm models audio download <model>, which repairs it.
Changed — may break callers
The profile is the first word: zm personal meetings list.ZM_PROFILE names it for a shell session and ZM_PROFILE_LOCK pins a process to one (another named profile → permission_error). The account.profile
setting no longer picks the profile, and zm config set account.profile is refused. A command that uses an
account and names no profile fails with validation_error, listing the profiles in details.profiles (it was configuration_error, exit 3). Login, import and sync record a profile; doctor lists them (profiles, was data_profile).
Each profile has its own Zoom login, in the keyring as <client id>:<profile>. The login saved before this
version moves to the profile that account.profile named, the first time that profile is used. session status names the profile; the verified Zoom user is now zoom_user.
context.sources belongs to the profile named on the command: zm research config set context.sources ….
A recording schedule's timer runs zm <profile> recordings schedule run. A timer installed by an earlier
version names no profile; create the schedule again.
Creating, updating or cancelling a Zoom meeting asks first. At a terminal zm asks y/N; without one and without --yes the command fails with confirmation_required (exit 7). It printed a preview and exited 0; --dry-run
still previews. A profile with "remote-meetings": "allow" applies without --yes.
zm <profile> mcp replaces zm serve --mcp (WC-MCP-1..10, WC-CMD-5). One server offers zm's commands as the
shared three tools zm_tools_search, zm_read, zm_write, and runs each call as the command line does. The eight
fixed tools and the serve flags (--meeting-context, --meeting-preparation, --semantic and the rest) are gone;
each tool they added is a command the server offers. The profile's permissions decide what it offers; over MCP a
change at level ask runs without a question, so give an agent's profile {"remote-meetings": "readonly"} to keep
it from changing Zoom meetings. MCP entries change args to ["<profile>", "mcp"]; zm serve now says so. The
library exports createMeetingMcpServer and serveMeetingMcp are removed.
search meetings --model ranks words and meaning together (cli-core 0.385.0 → 0.388.0). It searched by meaning
alone, ranked each page on its own and ignored the meeting filters. Now the date, meeting, series, event, person,
project and tag filters apply, one ranking runs across pages, a line found both ways ranks first and is cited by its
line, and a question — "what did we decide about pricing?" — is searched by its content words, where the word
search alone refused the «?» and found nothing without it. The answer is a list of hits with by, score and passage; it was one item holding items. A cursor from an earlier version is refused.