Skip to content

feat(call): Web Speech fallback for LAN/Windows calls - #21

Closed
matthewhand wants to merge 320 commits into
mainfrom
feat/browser-speech-calls
Closed

feat(call): Web Speech fallback for LAN/Windows calls#21
matthewhand wants to merge 320 commits into
mainfrom
feat/browser-speech-calls

Conversation

@matthewhand

Copy link
Copy Markdown
Owner

Browser/Web Speech API fallback when the macOS dictation helper is absent. Call button no longer requires Apple STT. HTTPS or localhost still required for the mic. allowedHosts:true so nginx TLS offload can proxy Vite.

milind-soni and others added 30 commits August 25, 2026 15:21
polar: supamaus in FUNDING.yml puts the Sponsor button on the repo,
with the direct checkout link (one-time pay-what-you-want or monthly)
as the custom entry. The README section says the quiet part out loud:
nothing ever sits behind a paywall.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add Polar funding: Sponsor button + README support section
…companion-awake

feat(computer): add secure VPS parity and companion uptime
…on-computer-tools

fix(drivers): scope local-computer approvals to real desktop-control tools only
Same for-the-badge style and 40px height as the download row, heart
front and center, one click to the Polar checkout. (Re-lands the badge
commit that missed the milind-soni#460 merge.)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Big support badge under the download buttons
milind-soni and others added 3 commits August 29, 2026 20:14
The branch's hide-until-skin-handshake (waitsForSkinSync + show:!...) lost
its definition when main's windowChromeOptions refactor auto-merged over
the BrowserWindow options; the kept fallback block then referenced an
undefined identifier and createWindow threw at startup — caught by the
Linux packaged-app smoke.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ace-v3

feat(browser): a built-in browser per bot — Browser tab in the computer panel, driven over CDP
…soni#573)

* fix(browser): harden built-in browser isolation and takeover

* test(browser): make hardening checks cross-platform

* test(browser): isolate Windows LPAC runner setup

* test(browser): keep macOS fixture sandboxed

* docs(browser): clarify headless Electron fixture

* test(browser): preserve renderer sandbox on Windows

* docs(browser): describe Windows fixture scope precisely

* fix(browser): close review hardening gaps

* test(browser): preserve Windows Electron sandbox

* test(browser): mirror Chromium Windows sandbox setup

* test(browser): avoid Windows runner GPU regression

* test(browser): avoid GPU process in headless Windows fixture

* test(browser): isolate Windows runner regression

* test(browser): use Windows desktop sandbox runner

* fix(browser): close remaining isolation gaps

* test(browser): strengthen nested secret regression

* fix(browser): close final isolation gaps

* test(browser): handle Windows child termination

* test(browser): allocate isolated server ports safely

@amazon-q-developer amazon-q-developer Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This PR successfully implements Web Speech API fallback for browser-based calls, enabling call functionality on LAN/Windows environments without requiring the macOS dictation helper. The implementation is well-structured with proper abstraction, error handling, and security considerations.

Key improvements:

  • Adds browser speech recognition fallback using Web Speech API with proper secure context checks
  • Maintains the existing half-duplex call flow to prevent feedback loops
  • Includes comprehensive error handling and user-friendly error messages
  • Properly abstracts speech capture with clean separation between native and browser implementations
  • Adds Vite config support for allowedHosts: true to enable nginx TLS offload scenarios

The code follows good practices with appropriate error handling, state management, and user feedback. No blocking issues identified.


You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.


⚠️ This PR contains more than 30 files. Amazon Q is better at reviewing smaller PRs, and may miss issues in larger changesets.

milind-soni and others added 21 commits August 30, 2026 11:42
* feat(gemini): let bots coordinate with teammates

* test(gemini): complete MCP client handshake
…r your next message

In computer/browser modes every turn ends with a screen capture that runs
AFTER the bot goes idle (a real screenshot round trip). A fast follow-up
send — or the steer-queue drain — landed first, and the frame then chained
onto the new leaf, stranding the user's message ABOVE the screenshot. In
browser mode this reproduced on nearly every send.

The fold now anchors the frame to the turn's actual last message before the
capture starts, and the store gains insertMessageAfter: when the anchor is
no longer the leaf, the artifact is inserted mid-chain and the anchor's
children are re-parented onto it, so the transcript reads
turn → screenshot → follow-up and the leaf stays with the user's message.
The renderer adopts a new message as the leaf only when it actually chains
onto the current one, matching the server rule.

Room threads keep the old append (their order is array-based, not chained);
called out in the fold comment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-ordering

fix(chat): settle screenshots chain-insert at the turn instead of after your next message
…orking indicators

Mid-turn 1:1 sends wait in the server steer queue and stay off the
transcript until drain (they must never become the active leaf). Render
that queue as ghost rows at the transcript tail — dashed bubbles in send
order, each with its own cancel — instead of only a composer chip. The
chip remains for rooms, whose queue is composer-local.

Long-lived indicators stop repainting every vsync: new steps()-eased
status-pulse keyframes drive a three-dot WorkingDots cluster replacing
the header/tool/provisioning spinners and the timeline pulse, and the
working row gains a self-ticking elapsed timer that mutates its own text
node instead of committing through React. Scrollbar grabs and ArrowUp
outside inputs now break bottom-follow like wheel-up already did;
overscroll-y-contain stops trackpad chaining. Drops the dead
message.queued caption (the server no longer sets that flag).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Queued sends as ghost transcript rows + duty-cycled working indicators
…erimental-settings

Codex/promote experimental settings
Ask bot A to make a routine for bot B and it scheduled the routine on
itself: the tool had no way to name a target and the API hard-bound the
card and routine to the sender. propose_routine now takes an optional
flat for_bot_id (id from list_bots; omitted = self, unchanged). The
route resolves and authorizes the target with teaching errors (unknown
id, different section), the target rides inside the card's fingerprinted
operation so a shown card cannot be redirected, and on confirm the
routine is created with the target's botId so runs use that bot's
engine and permissions. The target is re-authorized at confirm time —
the card can sit open while the target bot is deleted or moved — and a
refusal lands on the card as held text. Card authority, quotas, and
propose_routine_action stay with the proposing bot.

Part 1 of milind-soni#583.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d-ending

A busy target returned a flat busy bounce ('try again after it
finishes') — a mid-turn dead-end that models rarely act on, so the
exchange evaporated. Both bounce points (initial check and the
post-approval re-check) now demote the synchronous ask into a durable
delegation through the existing ledger: bounded busy retries, receipts,
restart-safe, drains when the peer's blocking turn settles. The asker's
reply carries the task id with check_delegation/wait_delegation
guidance and the standard 'Delegated to @b: asked while busy' chip
lands on its thread. If the ledger refuses (cap/depth), the plain busy
bounce is returned. The busy check also moved below sender validation
so unknown senders get their 403 first.

Part 2 of milind-soni#583.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…omputer

feat(ios): support multiple paired computers
…ueue

ask_bot to a busy peer queues a delegation instead of dead-ending
Routines proposed for another bot now schedule on that bot
…er-delivery

Make queued bot replies return reliably
@matthewhand
matthewhand force-pushed the feat/browser-speech-calls branch from d6804f3 to b29900a Compare August 30, 2026 20:14
matthewhand added a commit that referenced this pull request Sep 2, 2026
Squash of matthewhand/OpenMausBot review PRs:

- #11 LAN loopback viewer

- #12 agent comm popups

- #14 OpenAI-compatible TTS

- #15 custom HTTP/SSE MCP servers

- #16 LAN Bearer auth

- #17 Windows NSSM service

- #21 Web Speech fallback for LAN/Windows calls

- #22 hide inter-bot channels and specialist bots

Plus tool-call inspector popup and the 8800/8802 review harness.

Not included: #18 review-only (do not merge), #20 upstream sync (this commit is the consolidation), #24 per-item hide (conflicts with #22 sidebar hide).
@matthewhand

Copy link
Copy Markdown
Owner Author

Superseded by squash commit 36a058e on main (combined review: LAN auth, MCP, TTS, comms popups, loopback viewer, Windows service, Web Speech, sidebar hide).

@matthewhand matthewhand closed this Sep 2, 2026
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.