{"record":{"id":"b618d660fb1a326c","repo":"tinyhumansai/openhuman","slug":"core-rejected-the-agent-meetings-join-request","errorCode":null,"errorMessage":"Core rejected the agent_meetings_join request.","messagePattern":"Core rejected the agent_meetings_join request\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/services/meetCallService.ts","lineNumber":272,"sourceCode":"    method: 'openhuman.agent_meetings_join',\n    params: {\n      meet_url: meetUrl,\n      display_name: input.displayName?.trim() || undefined,\n      platform: input.platform || undefined,\n      agent_name: input.agentName?.trim() || undefined,\n      system_prompt: input.systemPrompt?.trim() || undefined,\n      mascot_id: input.mascotId?.trim() || undefined,\n      respond_to_participant: input.respondToParticipant?.trim() || undefined,\n      wake_phrase: input.wakePhrase?.trim() || undefined,\n      correlation_id: input.correlationId?.trim() || undefined,\n      listen_only: input.listenOnly ?? undefined,\n      rive_colors: mapRiveColors(input.riveColors),\n      mascots,\n    },\n  });\n\n  if (!result?.ok) {\n    throw new Error('Core rejected the agent_meetings_join request.');\n  }\n\n  return { meetUrl: result.meet_url, platform: result.platform };\n}\n\n/**\n * Ask the backend bot to leave the current meeting.\n */\nexport async function leaveBackendMeetBot(reason?: string): Promise<void> {\n  await callCoreRpc<{ ok: boolean }>({\n    method: 'openhuman.agent_meetings_leave',\n    params: { reason: reason || 'requested' },\n  });\n}\n\n/**\n * Send a tool execution result back to the backend's meeting LLM.\n */","sourceCodeStart":254,"sourceCodeEnd":290,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/services/meetCallService.ts#L254-L290","documentation":"The openhuman.agent_meetings_join RPC round-tripped but the core/backend answered ok:false — the join request was rejected downstream. The frontend sends the trimmed URL plus optional mascot slots (snake_case mapped), system prompt, listen_only and correlation_id to the backend's Recall.ai bot over the core's Socket.IO bridge; ok:false means the backend refused or the core could not emit bot:join.","triggerScenarios":"Unsupported or malformed meeting platform/URL (not Google Meet/Zoom/Teams/Webex); backend rejects the bot join (capacity, auth, room unavailable); the core's persistent Socket.IO connection to the backend is down so join dispatch fails; invalid mascot_id or voice_id rejected server-side.","commonSituations":"Backend outage or expired backend session; pasting a personal-meeting-room link of an unsupported provider; concurrent join attempts exceeding the account's bot quota; mascot configuration referencing deleted mascots.","solutions":["Inspect the core's backend-bot logs — the ok:false is produced after the backend replies (bot:reply error event) and the reason is logged Rust-side","Verify the URL matches a supported platform pattern before calling join","Confirm backend connectivity: the core must hold a live Socket.IO session (check connections/health panel)","Retry after resolving capacity/auth; surface the backend's reason string to the user instead of the generic message"],"exampleFix":"// before\nconst r = await joinMeetViaBackendBot({ meetUrl });\n\n// after\nconst MEET_URL_RE = /^https:\\/\\/(meet\\.google\\.com|zoom\\.us|teams\\.microsoft\\.com|webex\\.com)\\//;\nif (!MEET_URL_RE.test(meetUrl)) throw new Error('Unsupported meeting link — use Google Meet, Zoom, Teams or Webex.');\nconst r = await joinMeetViaBackendBot({ meetUrl });","handlingStrategy":"try-catch","validationCode":"function looksLikeMeetingUrl(u: string): boolean {\n  return /^https:\\/\\/(meet\\.google\\.com|.*\\.zoom\\.us|teams\\.microsoft\\.com|.*\\.webex\\.com)\\//i.test(u.trim());\n}","typeGuard":"function isJoinRejected(err: unknown): boolean {\n  return err instanceof Error && err.message.includes('agent_meetings_join');\n}","tryCatchPattern":"try {\n  return await joinMeetViaBackendBot(input);\n} catch (err) {\n  if (isJoinRejected(err)) {\n    // ok:false came from backend bot join — check core logs for the bot:reply reason\n    showJoinFailed('The meeting bot could not join. Check the link and try again.');\n    return null;\n  }\n  throw err;\n}","preventionTips":["Client-side-validate the platform before calling join — most ok:false joins are unsupported URLs","Surface the backend's reason (core log / bot:reply event) instead of the generic message","Confirm backend connectivity (Socket.IO session) before offering Join"],"tags":["meet","rpc","ok-flag","recall-bot","backend-bot","join"],"backgroundTag":"rpc-ok-false-rejection","analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}