@aivibeclaw/meeting-bot
v2026.7.2
Published
AivibeClaw meeting-attendance plugin: an agent joins Zoom, Webex, Microsoft Teams, and Google Meet meetings from a meeting URL and participates with voice.
Downloads
24
Readme
@aivibeclaw/meeting-bot
An AivibeClaw plugin that lets an agent join a meeting from a meeting URL and participate with voice across Zoom, Webex, Microsoft Teams, and Google Meet.
Give it a meeting URL. It detects the platform, opens the provider's web client
in a headless Chrome tab (via the gateway CDP browser.request transport),
dismisses launch/consent prompts, joins under the agent's display name, and keeps
the microphone muted by default. In talk-back modes it bridges audio through
the same voice-call substrate the voice-call and google-meet plugins use:
agent TTS is played into the meeting mic and meeting audio is captured for STT,
producing a live transcript that can be written to a durable artifact bundle.
Honest per-platform readiness
This plugin is deliberately transparent about what is production-tested versus what needs live tuning. Do not treat "needs-live-tuning" as reliable for unattended joins until the selectors have been verified against the current web client.
| Platform | Status | Transport | Notes |
| ------------------- | ----------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Google Meet | Production | Delegated to @aivibeclaw/google-meet (Chrome/CDP) | Reuses the shipped, tested Meet join/speak/leave flow. Requires @aivibeclaw/google-meet installed. |
| Zoom | Needs live tuning | Generalized Chrome web client (/wc/join/<id>) | Drives name/join/mute selectors on the Zoom browser client. Selectors are best-effort; consent gates and waiting rooms may need host action. |
| Webex | Needs live tuning | Generalized Chrome web client | Drives name/join/mute selectors on the Webex web app. Some orgs force the desktop app or a lobby. |
| Microsoft Teams | Needs live tuning | Generalized Chrome web client (meetup-join, msLaunch=false) | Drives name/join/mute selectors on the Teams light web client. Tenant policy may require sign-in or lobby admission. |
The Google Meet path is production-ready because it delegates to the existing,
proven @aivibeclaw/google-meet plugin rather than re-implementing Meet DOM
automation. Zoom, Webex, and Teams share one generalized join engine
(src/transports/chrome.ts) whose per-platform DOM selectors live in
src/platforms/detect.ts — that file is the single tuning surface. The selectors
are written against each provider's current public web client but have not been
run through a full live-join matrix, so they are honestly marked
needs-live-tuning. When a provider changes its web client, update the selector
profile in detect.ts; no engine changes are needed.
What the generalized engine hardens (no live account required)
The Zoom/Webex/Teams join engine is built for cross-platform reliability as far as is achievable without live meeting accounts. It does not fake success:
- Ordered, multi-strategy selectors. Every action (
nameInput,joinButton,muteMicButton,unmuteMicButton,dismissPrompt,cookieConsent,inCallMarker,lobbyMarker,loginMarker) is an ordered list of regex candidates tried most-specific-first, so one label change falls through to the next candidate instead of breaking the whole flow. - Cookie / consent then app-launch dismissal. Cookie/privacy banners are cleared first (they gate interactivity), then "open the app / continue in browser / audio choice" prompts, before name entry.
- Name entry + verify. Fills
INPUTandcontenteditablename fields and verifies the value landed before proceeding. - Real mic state, not an echo. The mic policy is enforced by reading the
actual observed mic control (an "unmute" affordance means currently muted),
and the reported
micMutedreflects that observed state — it is not the requested policy echoed back. - Join gated + retried with backoff. Join is clicked only when the name is ready and the page is neither in a lobby nor already in-call, capped to a bounded attempt count. The outer poll loop retries with exponential-ish backoff and tolerates transient page-navigation errors, giving up only after the wait window elapses.
- Lobby / waiting-room aware. A detected lobby is surfaced as
admission-required(not a hard failure); the engine keeps the participant muted and does not thrash the Join button. - Honest failures. When the client never reaches in-call, when a login wall
is detected, or when browser control is genuinely unavailable, the engine
returns a clear
manualActionRequiredreason and message — never a silent success. Talk-back speech stays blocked until the browser reports in-call.
Per-platform readiness notes:
- Zoom — opens
/wc/join/<id>; drives#input-for-namestyle name entry, the pre-join Join and the "Join Audio by Computer" dialog, and Mute/Unmute. Live tuning targets: the T&C "I Agree" gate, cookie banner, and waiting-room admission, which can require host action. - Webex — drives the web-app name field, "Join meeting"/"Join from browser", and Mute/Unmute audio; clears the OneTrust cookie banner. Live tuning targets: orgs that force the desktop app or a "wait for the host to admit you" lobby.
- Microsoft Teams — forces the light web client (
msLaunch=false), keeps the join on "Continue on this browser" / "Join on the web instead", drives "Type your name" (INPUT or contenteditable), "Join now", and Mute/Unmute. Live tuning targets: tenant sign-in policy and the "someone should let you in" lobby.
Architecture
meeting URL
│
▼
platforms/detect.ts detect platform + resolve web-client URL + selector profile
│
├── google-meet ──▶ meet-delegate.ts ──▶ googlemeet.join/speak/leave (proven plugin)
│
└── zoom/webex/teams ──▶ transports/chrome.ts (generalized CDP join engine)
│
▼
realtime.ts (audio bridge, reuses plugin-sdk/realtime-*)
• agent : mic audio → STT → AivibeClaw consult → TTS → mic
• bidi : mic audio ↔ realtime voice model (duplex)
│
▼
artifacts.ts → transcript.md / transcript.json / manifest.json- Audio substrate is reused, not reinvented: the default SoX/BlackHole 2ch
command pair is the same duplex routing the
voice-callandgoogle-meetplugins use. Talk-back audio is currently macOS-only (BlackHole 2ch). - Agent consult reuses
plugin-sdk/realtime-voice'sconsultRealtimeVoiceAgentso the meeting agent can delegate deep reasoning to an AivibeClaw agent while it speaks in the call. - Calendar auto-join reuses
@aivibeclaw/google-meet's Google Calendar gateway as the calendar source instead of duplicating Google OAuth.
Tools
The plugin registers a single agent tool, meeting, gated by the manifest
contracts.tools list so per-agent tool access and install-all-plugins
discovery pick it up:
| Action | Description |
| -------------------- | ------------------------------------------------------------------- |
| meeting.join | Join a meeting from url (detects platform), mic muted by default. |
| meeting.say | Speak message into a joined meeting (sessionId). |
| meeting.leave | Leave a meeting (sessionId) and write the transcript artifact. |
| meeting.status | Report session / in-call / speech-readiness state. |
| meeting.transcript | Write the captured transcript to an artifact bundle. |
| meeting.auto_join | Join today's calendar meeting (requires calendar.autoJoin=true). |
| meeting.platforms | Return the per-platform readiness table above. |
The same actions are exposed as gateway methods meetingbot.join,
meetingbot.say, meetingbot.leave, meetingbot.status,
meetingbot.transcript, and meetingbot.autoJoin.
Modes
agent— meeting audio → STT → AivibeClaw agent consult → telephony TTS → mic.bidi— meeting audio ↔ realtime voice model, direct duplex.transcribe— observe-only; capture audio for the transcript without speaking.
Requirements
- Google Meet:
@aivibeclaw/google-meetplugin installed and signed in. - Talk-back (agent/bidi): a realtime STT/voice provider configured (e.g. OpenAI), plus BlackHole 2ch + SoX on macOS for local mic routing.
- Calendar auto-join:
@aivibeclaw/google-meetinstalled (calendar source).
Install
aivibeclaw plugins install @aivibeclaw/meeting-botdeploy/install-all-plugins.sh installs it automatically as part of the core set.
