feat(mascot): restore 'send mascot to meeting' flow via backend bot#2441
Draft
oxoxDev wants to merge 5 commits into
Draft
feat(mascot): restore 'send mascot to meeting' flow via backend bot#2441oxoxDev wants to merge 5 commits into
oxoxDev wants to merge 5 commits into
Conversation
Other surfaces (e.g. the /human mascot page) want the same modal-driven backend-bot join flow without the banner chrome. Promote the inner MeetingBotsModal to a named export and cover the standalone usage with a unit test so future surfaces have a stable contract.
PR tinyhumansai#2152 commented out the banner alongside the broader "Calls tab → Coming Soon" rollback. The backend mascot bot is the right architecture for "mascot joins a meeting" because Camoufox runs as a separate participant (its own IP, its own audio identity) so there is no echo against the user's system mic — the symptom that motivated tinyhumansai#2152's rollback of the local-CEF join flow. Bring the banner back.
Surface the meeting-bot join flow directly on the mascot home (/human) so it is discoverable without digging into Skills. A small primary button next to the speak-replies toggle opens the same MeetingBotsModal component the Skills banner uses, keeping the submit, capacity-gating, and i18n behaviour identical across both surfaces.
Previously the submit / coming-soon labels rendered as literal
"Send to {label} Google Meet" because the i18n strings carry a
{label} placeholder but t() has no interpolation step. Replace the
placeholder after the lookup so the active platform name appears in
the button text instead of double-concatenating it.
The backend rewrote its free-tier paid-gate message (SERVER_OVERLOADED_MESSAGE in backend src/utils/paidPlan.ts) to "Mascot streaming capacity is exhausted. Please try again later." The frontend still pinned the old "OpenHuman is under heavy load right now…" string, so the isCapacityGated detection in joinMeetingViaMascotBot silently fell through to the generic red error path instead of the amber capacity-gated toast and inline note. Realign the constant.
Contributor
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/human(the mascot home), so the feature is reachable both from the integrations list and from the place users spend most of their day.{label}placeholder, and the 429 capacity-gate copy fell through to the generic red toast instead of the amber capacity-gated treatment because the frontend constant lagged behind the backend rewrite.Problem
PR #2152 deliberately disabled both the legacy CEF webview join flow (
IntelligenceCallsTab) and the new backend bot banner (MeetingBotsCard) as part of the "Coming Soon" rollback. The legacy flow had a real dup-mic bug (it joined as the user, using the user's system mic). The backend bot does not — but it got commented out as collateral damage because both surfaces shared the "meeting bots" umbrella. Net result: no working way to send a mascot to a meeting from the shipped app.Solution
MeetingBotsModalto a named export so multiple surfaces can mount the same backend-bot flow without the banner chrome.MeetingBotsCardimport + render inSkills.tsx.HumanPage, next to the existing speak-replies toggle. Clicking opensMeetingBotsModal; success closes the modal silently, errors render inline. NoonToastwiring needed.${t('skills.meetingBots.sendTo')} ${selected.label}concatenation with.replace('{label}', selected.label)so the i18n placeholder gets interpolated instead of double-printed.SERVER_OVERLOADED_MESSAGEinmeetCallService.tswith the backend's currentMascot streaming capacity is exhausted. Please try again later.text soisCapacityGateddetection fires on the 429 path.The destructive cleanup of the dead local-CEF flow (the
meet_call/meet_audio/meet_scanner/meet_videoTauri modules + the coremeet/meet_agentdomains + theIntelligenceCallsTabplaceholder) is intentionally deferred to a follow-up PR to keep this diff focused and low-risk.Submission Checklist
diff-cover) meet the gate enforced by.github/workflows/coverage.yml. Runpnpm test:coverageandpnpm test:rustlocally; PRs below 80% on changed lines will not merge.Impact
camoufox-js/language-tagsresolution) reaching staging before the modal can actually launch a bot — without that fix the route 500s onimport 'language-tags'ESM error even for paid users.Related
joinMeetCall/closeMeetCallservice,meet_call/meet_audio/meet_scanner/meet_videoTauri modules,openhuman::meet/openhuman::meet_agentcore domains,MascotFrameProducer, relatedjson_rpc_e2etests). Out of scope for PR-A so the re-enable can ship in isolation.AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
feat/mascot-rejoin-meetingValidation Run
pnpm --filter openhuman-app format:checkpnpm typecheckMeetingBotsCard.test.tsx(9 passed),HumanPage.test.tsx(7 passed),joinMeetingViaMascotBot.test.ts(6 passed), full Vitest suite (3060 passed / 3 skipped)Validation Blocked
command:N/Aerror:N/Aimpact:N/ABehavior Changes
/humanmascot page. The submit-button label correctly substitutes the active platform name. The 429 free-user capacity gate renders inline + amber toast instead of a generic red error./human. Clicking opens the same modal that the Skills banner opens. Paid users see the bot join as a separate Meet participant; free users see "Mascot streaming capacity is exhausted. Please try again later." surfaced as an amber capacity-gated treatment.Parity Contract
MeetingBotsCardbanner shape, copy, modal layout, and capacity-gate handling are unchanged.IntelligenceCallsTabcontinues to render the "Coming Soon" placeholder from feat(ai-panel): add chat workload and cloud model picker with slug-based lookup fix #2152.SERVER_OVERLOADED_MESSAGEinstead of silently falling through (regression introduced when backend copy was rewritten). i18n placeholder interpolation matches the surrounding${selected.label}concatenation pattern used elsewhere in the modal.