Skip to content

feat(voice): control berd-call from the menu bar - #345

Open
johnmatthewtennant wants to merge 1 commit into
mainfrom
jtennant/berd-call-menu-bar
Open

johnmatthewtennant wants to merge 1 commit into
mainfrom
jtennant/berd-call-menu-bar

Conversation

@johnmatthewtennant

@johnmatthewtennant johnmatthewtennant commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a macOS menu bar to berd-call start with the call controls VCCLI's menu bar offers.

  • The menu shows the call mode, a Speech Rate submenu limited to the rates the call's TTS backend and mode accept, with the current rate checked, Mute Input During TTS, Mute Microphone (⌘M), and End Call (⌘Q). It is rebuilt from the latest berd-call status, which a background thread refreshes every second so the main thread never waits on the control socket, and the icon switches to a crossed-out microphone while muted.
  • Each item sends the same control request as berd-call settings or berd-call stop, so the menu and the CLI never disagree about call state.
  • --no-menu-bar runs the call without it, for headless use.

Reviewer-reproducible example

berd-call start --port 5343 --stream --voice Aaron --language en-US &

A waveform icon appears in the menu bar. Choose Speech Rate → 0.5×, then Mute Microphone, then Mute Input During TTS. Afterward:

$ berd-call status --port 5343 | jq -c '{muted, rate: .session.tts.rate, policy: .session.input_during_tts.policy}'
{"muted":true,"rate":0.5,"policy":"suppress_input"}

Reopening the menu shows "Speech Rate: 0.5×" and checkmarks beside both mute items. End Call stops the call and the process exits. With berd-call start --no-menu-bar --port 5344 --voice Aaron --language en-US, the call runs and responds to berd-call status, but no menu-bar item appears.

@johnmatthewtennant johnmatthewtennant changed the title feat(voice): add berd-call menu bar controls feat(voice): control berd-call from the menu bar Sep 23, 2026
@johnmatthewtennant

Copy link
Copy Markdown
Contributor Author

🤖 Review dispositions at 5c5be31 (fixed in fb1084e):

  • Accepted — blocking status I/O on the main thread (builderbot + idiomatic). Status now refreshes on a background thread every second; the menu and icon read the cached value.
  • Accepted — rate list ignores backend limits. The Speech Rate submenu offers only rates the call accepts: Siri 0.5–2×, OpenAI/Pocket 0.75–2×, Expert-Spokesperson 0.25–1.5×.
  • Accepted — title and stack reference in the PR metadata.
  • Declined — drop the polling timer and dynamic icon. VCCLI's icon reflects state, so a mute icon is parity; polling now happens off the main thread.
  • Declined — start entering through menu_bar::run; untyped status JSON. Structural nits; low value for this change.
  • Declined — visual evidence. Testing is intentionally screenshot-free; the body has accessibility-driven text evidence.

@johnmatthewtennant
johnmatthewtennant marked this pull request as ready for review September 23, 2026 15:30
morgmart
morgmart previously approved these changes Sep 23, 2026

@morgmart morgmart left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Automated code review

APPROVE: the completed static review of the exact three-dot comparison found no publishable findings or duplicates. The supplied GitHub checks completed successfully.

Deterministic publication result: 0 blocking and 0 non-blocking inline finding(s) publishable; 0 duplicate(s) suppressed; 0 blocking screenshot-evidence requirement(s) in this review body.

Pending checks: 1 check(s) are not complete.

This approval reflects the completed code review only; merge readiness remains governed by the repository's required checks.

@johnmatthewtennant
johnmatthewtennant added this pull request to stack #349 September 23, 2026 16:23
@johnmatthewtennant
johnmatthewtennant removed this pull request from stack #349 September 23, 2026 16:37
@johnmatthewtennant
johnmatthewtennant added this pull request to stack #350 September 23, 2026 16:38
@johnmatthewtennant
johnmatthewtennant removed this pull request from stack #350 September 23, 2026 17:07
Base automatically changed from jtennant/berd-call-codex to main September 23, 2026 17:23
@johnmatthewtennant
johnmatthewtennant dismissed morgmart’s stale review September 23, 2026 17:23

The base branch was changed.

@johnmatthewtennant
johnmatthewtennant requested a review from a team September 23, 2026 17:23
Adds a macOS menu bar item to standalone berd-call calls for status, mute, rate, voice, and ending the call.

Signed-off-by: John Tennant <jtennant@block.xyz>
@johnmatthewtennant
johnmatthewtennant force-pushed the jtennant/berd-call-menu-bar branch from 61192d9 to 55cab32 Compare September 23, 2026 17:35

@morgmart morgmart left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Automated code review

COMMENT: the exact three-dot comparison has one non-blocking concurrency finding in menu action handling. Supplied GitHub evidence is structurally valid; one frontend check is still in progress, while the other reported checks have passed. Required checks independently govern merge readiness.

Deterministic publication result: 0 blocking and 1 non-blocking inline finding(s) publishable; 0 duplicate(s) suppressed; 0 blocking screenshot-evidence requirement(s) in this review body.

Comment thread src-tauri/crates/berd-call/src/menu_bar.rs

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants