{"_id":"@aivibeclaw/meeting-bot","name":"@aivibeclaw/meeting-bot","dist-tags":{"latest":"2026.7.2"},"versions":{"2026.7.2":{"name":"@aivibeclaw/meeting-bot","version":"2026.7.2","description":"AivibeClaw meeting-attendance plugin: an agent joins Zoom, Webex, Microsoft Teams, and Google Meet meetings from a meeting URL and participates with voice.","repository":{"type":"git","url":"git+https://github.com/aivibe-org/aivibeclaw.git"},"type":"module","dependencies":{"typebox":"1.1.39"},"devDependencies":{"@aivibeclaw/plugin-sdk":"workspace:*","aivibeclaw":"workspace:*"},"peerDependencies":{"aivibeclaw":">=2026.6.10"},"peerDependenciesMeta":{"aivibeclaw":{"optional":true}},"aivibeclaw":{"extensions":["./index.ts"],"install":{"npmSpec":"@aivibeclaw/meeting-bot","defaultChoice":"npm","minHostVersion":">=2026.6.10"},"compat":{"pluginApi":">=2026.6.10"},"build":{"aivibeclawVersion":"2026.6.10"},"release":{"publishToClawHub":true,"publishToNpm":true}},"gitHead":"f43268f0541205e95ceecd2e96d6db61415be5c0","_id":"@aivibeclaw/meeting-bot@2026.7.2","bugs":{"url":"https://github.com/aivibe-org/aivibeclaw/issues"},"homepage":"https://github.com/aivibe-org/aivibeclaw#readme","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-p9TYuUVlvGlxZrxXH1R93JWIR13F5Kw3Oy+PsGv6f9HLL9XT7cv8gB1tFjEGmCu/zLaabGqkZAC79DVV90fX0g==","shasum":"ff6942af023a316e06d0cc3af323f998fc544fc6","tarball":"https://registry.npmjs.org/@aivibeclaw/meeting-bot/-/meeting-bot-2026.7.2.tgz","fileCount":17,"unpackedSize":237482,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID9IxeYvhQt8lVddRoNqfKD7+fhKorHjJnRq3DX5NxntAiBhEtFrAr4h6jLRnT9dVI4Xob0s9AF5u0CsGvVoDSg+UA=="}]},"_npmUser":{"name":"ajair","email":"aravind@aivibe.in"},"directories":{},"maintainers":[{"name":"ajair","email":"aravind@aivibe.in"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/meeting-bot_2026.7.2_1782934621367_0.3545901145068475"},"_hasShrinkwrap":true}},"time":{"created":"2026-07-01T19:37:01.218Z","2026.7.2":"2026-07-01T19:37:01.549Z","modified":"2026-07-01T19:37:01.828Z"},"maintainers":[{"name":"ajair","email":"aravind@aivibe.in"}],"description":"AivibeClaw meeting-attendance plugin: an agent joins Zoom, Webex, Microsoft Teams, and Google Meet meetings from a meeting URL and participates with voice.","homepage":"https://github.com/aivibe-org/aivibeclaw#readme","repository":{"type":"git","url":"git+https://github.com/aivibe-org/aivibeclaw.git"},"bugs":{"url":"https://github.com/aivibe-org/aivibeclaw/issues"},"readme":"# @aivibeclaw/meeting-bot\n\nAn AivibeClaw plugin that lets an agent **join a meeting from a meeting URL** and\nparticipate with voice across **Zoom, Webex, Microsoft Teams, and Google Meet**.\n\nGive it a meeting URL. It detects the platform, opens the provider's web client\nin a headless Chrome tab (via the gateway CDP `browser.request` transport),\ndismisses launch/consent prompts, joins under the agent's display name, and keeps\nthe microphone **muted by default**. In talk-back modes it bridges audio through\nthe same voice-call substrate the `voice-call` and `google-meet` plugins use:\nagent TTS is played into the meeting mic and meeting audio is captured for STT,\nproducing a live transcript that can be written to a durable artifact bundle.\n\n## Honest per-platform readiness\n\nThis plugin is deliberately transparent about what is production-tested versus\nwhat needs live tuning. **Do not treat \"needs-live-tuning\" as reliable for\nunattended joins until the selectors have been verified against the current web\nclient.**\n\n| Platform            | Status            | Transport                                                       | Notes                                                                                                                                        |\n| ------------------- | ----------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |\n| **Google Meet**     | **Production**    | Delegated to `@aivibeclaw/google-meet` (Chrome/CDP)             | Reuses the shipped, tested Meet join/speak/leave flow. Requires `@aivibeclaw/google-meet` installed.                                         |\n| **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. |\n| **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.                                            |\n| **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.                         |\n\nThe Google Meet path is production-ready because it **delegates to the existing,\nproven `@aivibeclaw/google-meet` plugin** rather than re-implementing Meet DOM\nautomation. Zoom, Webex, and Teams share **one generalized join engine**\n(`src/transports/chrome.ts`) whose per-platform DOM selectors live in\n`src/platforms/detect.ts` — that file is the single tuning surface. The selectors\nare written against each provider's current public web client but have **not** been\nrun through a full live-join matrix, so they are honestly marked\n`needs-live-tuning`. When a provider changes its web client, update the selector\nprofile in `detect.ts`; no engine changes are needed.\n\n### What the generalized engine hardens (no live account required)\n\nThe Zoom/Webex/Teams join engine is built for cross-platform reliability as far as\nis achievable without live meeting accounts. It does **not** fake success:\n\n- **Ordered, multi-strategy selectors.** Every action (`nameInput`, `joinButton`,\n  `muteMicButton`, `unmuteMicButton`, `dismissPrompt`, `cookieConsent`,\n  `inCallMarker`, `lobbyMarker`, `loginMarker`) is an ordered list of regex\n  candidates tried most-specific-first, so one label change falls through to the\n  next candidate instead of breaking the whole flow.\n- **Cookie / consent then app-launch dismissal.** Cookie/privacy banners are\n  cleared first (they gate interactivity), then \"open the app / continue in\n  browser / audio choice\" prompts, before name entry.\n- **Name entry + verify.** Fills `INPUT` and `contenteditable` name fields and\n  verifies the value landed before proceeding.\n- **Real mic state, not an echo.** The mic policy is enforced by reading the\n  _actual_ observed mic control (an \"unmute\" affordance means currently muted),\n  and the reported `micMuted` reflects that observed state — it is not the\n  requested policy echoed back.\n- **Join gated + retried with backoff.** Join is clicked only when the name is\n  ready and the page is neither in a lobby nor already in-call, capped to a\n  bounded attempt count. The outer poll loop retries with exponential-ish backoff\n  and tolerates transient page-navigation errors, giving up only after the wait\n  window elapses.\n- **Lobby / waiting-room aware.** A detected lobby is surfaced as\n  `admission-required` (not a hard failure); the engine keeps the participant\n  muted and does not thrash the Join button.\n- **Honest failures.** When the client never reaches in-call, when a login wall\n  is detected, or when browser control is genuinely unavailable, the engine\n  returns a clear `manualActionRequired` reason and message — never a silent\n  success. Talk-back speech stays blocked until the browser reports in-call.\n\n**Per-platform readiness notes:**\n\n- **Zoom** — opens `/wc/join/<id>`; drives `#input-for-name` style name entry,\n  the pre-join Join and the \"Join Audio by Computer\" dialog, and Mute/Unmute.\n  Live tuning targets: the T&C \"I Agree\" gate, cookie banner, and waiting-room\n  admission, which can require host action.\n- **Webex** — drives the web-app name field, \"Join meeting\"/\"Join from browser\",\n  and Mute/Unmute audio; clears the OneTrust cookie banner. Live tuning targets:\n  orgs that force the desktop app or a \"wait for the host to admit you\" lobby.\n- **Microsoft Teams** — forces the light web client (`msLaunch=false`), keeps the\n  join on \"Continue on this browser\" / \"Join on the web instead\", drives\n  \"Type your name\" (INPUT or contenteditable), \"Join now\", and Mute/Unmute. Live\n  tuning targets: tenant sign-in policy and the \"someone should let you in\" lobby.\n\n## Architecture\n\n```\nmeeting URL\n   │\n   ▼\nplatforms/detect.ts   detect platform + resolve web-client URL + selector profile\n   │\n   ├── google-meet ──▶ meet-delegate.ts ──▶ googlemeet.join/speak/leave (proven plugin)\n   │\n   └── zoom/webex/teams ──▶ transports/chrome.ts (generalized CDP join engine)\n                                   │\n                                   ▼\n                         realtime.ts (audio bridge, reuses plugin-sdk/realtime-*)\n                            • agent : mic audio → STT → AivibeClaw consult → TTS → mic\n                            • bidi  : mic audio ↔ realtime voice model (duplex)\n                                   │\n                                   ▼\n                         artifacts.ts → transcript.md / transcript.json / manifest.json\n```\n\n- **Audio substrate** is reused, not reinvented: the default SoX/BlackHole 2ch\n  command pair is the same duplex routing the `voice-call` and `google-meet`\n  plugins use. Talk-back audio is currently macOS-only (BlackHole 2ch).\n- **Agent consult** reuses `plugin-sdk/realtime-voice`'s `consultRealtimeVoiceAgent`\n  so the meeting agent can delegate deep reasoning to an AivibeClaw agent while it\n  speaks in the call.\n- **Calendar auto-join** reuses `@aivibeclaw/google-meet`'s Google Calendar\n  gateway as the calendar source instead of duplicating Google OAuth.\n\n## Tools\n\nThe plugin registers a single agent tool, `meeting`, gated by the manifest\n`contracts.tools` list so per-agent tool access and `install-all-plugins`\ndiscovery pick it up:\n\n| Action               | Description                                                         |\n| -------------------- | ------------------------------------------------------------------- |\n| `meeting.join`       | Join a meeting from `url` (detects platform), mic muted by default. |\n| `meeting.say`        | Speak `message` into a joined meeting (`sessionId`).                |\n| `meeting.leave`      | Leave a meeting (`sessionId`) and write the transcript artifact.    |\n| `meeting.status`     | Report session / in-call / speech-readiness state.                  |\n| `meeting.transcript` | Write the captured transcript to an artifact bundle.                |\n| `meeting.auto_join`  | Join today's calendar meeting (requires `calendar.autoJoin=true`).  |\n| `meeting.platforms`  | Return the per-platform readiness table above.                      |\n\nThe same actions are exposed as gateway methods `meetingbot.join`,\n`meetingbot.say`, `meetingbot.leave`, `meetingbot.status`,\n`meetingbot.transcript`, and `meetingbot.autoJoin`.\n\n## Modes\n\n- `agent` — meeting audio → STT → AivibeClaw agent consult → telephony TTS → mic.\n- `bidi` — meeting audio ↔ realtime voice model, direct duplex.\n- `transcribe` — observe-only; capture audio for the transcript without speaking.\n\n## Requirements\n\n- **Google Meet**: `@aivibeclaw/google-meet` plugin installed and signed in.\n- **Talk-back (agent/bidi)**: a realtime STT/voice provider configured (e.g.\n  OpenAI), plus BlackHole 2ch + SoX on macOS for local mic routing.\n- **Calendar auto-join**: `@aivibeclaw/google-meet` installed (calendar source).\n\n## Install\n\n```bash\naivibeclaw plugins install @aivibeclaw/meeting-bot\n```\n\n`deploy/install-all-plugins.sh` installs it automatically as part of the core set.\n","readmeFilename":"README.md","_rev":"1-70544541db64067548a268831cda3574"}