

























@@ -292,12 +292,18 @@ function parseMeetBrowserStatus(result: unknown): GoogleMeetChromeHealth | undef
292292const parsed = JSON.parse(raw) as {
293293inCall?: boolean;
294294micMuted?: boolean;
295+manualActionRequired?: boolean;
296+manualActionReason?: GoogleMeetChromeHealth["manualActionReason"];
297+manualActionMessage?: string;
295298url?: string;
296299title?: string;
297300};
298301return {
299302inCall: parsed.inCall,
300303micMuted: parsed.micMuted,
304+manualActionRequired: parsed.manualActionRequired,
305+manualActionReason: parsed.manualActionReason,
306+manualActionMessage: parsed.manualActionMessage,
301307browserUrl: parsed.url,
302308browserTitle: parsed.title,
303309status: "browser-control",
@@ -317,17 +323,36 @@ function meetStatusScript(params: { guestName: string; autoJoin: boolean }) {
317323 input.dispatchEvent(new Event('change', { bubbles: true }));
318324 }
319325 const buttons = [...document.querySelectorAll('button')];
326+ const pageText = text(document.body).toLowerCase();
327+ const host = location.hostname.toLowerCase();
328+ const pageUrl = location.href;
320329 const join = ${JSON.stringify(params.autoJoin)}
321330 ? buttons.find((button) => /join now|ask to join/i.test(text(button)) && !button.disabled)
322331 : null;
323332 if (join) join.click();
324333 const mic = buttons.find((button) => /turn off microphone|turn on microphone|microphone/i.test(button.getAttribute('aria-label') || text(button)));
334+ const inCall = buttons.some((button) => /leave call/i.test(button.getAttribute('aria-label') || text(button)));
335+ let manualActionReason;
336+ let manualActionMessage;
337+ if (!inCall && (host === "accounts.google.com" || /use your google account|to continue to google meet|choose an account|sign in to (join|continue)/i.test(pageText))) {
338+ manualActionReason = "google-login-required";
339+ manualActionMessage = "Sign in to Google in the OpenClaw browser profile, then retry the Meet join.";
340+ } else if (!inCall && /asking to be let in|you.?ll join when someone lets you in|waiting to be let in|ask to join/i.test(pageText)) {
341+ manualActionReason = "meet-admission-required";
342+ manualActionMessage = "Admit the OpenClaw browser participant in Google Meet, then retry speech.";
343+ } else if (!inCall && /allow.*(microphone|camera)|blocked.*(microphone|camera)|permission.*(microphone|camera)/i.test(pageText)) {
344+ manualActionReason = "meet-permission-required";
345+ manualActionMessage = "Allow microphone/camera permissions for Meet in the OpenClaw browser profile, then retry.";
346+ }
325347 return JSON.stringify({
326348 clickedJoin: Boolean(join),
327- inCall: buttons.some((button) => /leave call/i.test(button.getAttribute('aria-label') || text(button))),
349+ inCall,
328350 micMuted: mic ? /turn on microphone/i.test(mic.getAttribute('aria-label') || text(mic)) : undefined,
351+ manualActionRequired: Boolean(manualActionReason),
352+ manualActionReason,
353+ manualActionMessage,
329354 title: document.title,
330- url: location.href
355+ url: pageUrl
331356 });
332357}`;
333358}
@@ -424,6 +449,10 @@ async function openMeetWithBrowserProxy(params: {
424449browser = {
425450 ...browser,
426451inCall: false,
452+manualActionRequired: true,
453+manualActionReason: "browser-control-unavailable",
454+manualActionMessage:
455+"Open the OpenClaw browser profile, finish Google Meet login, admission, or permission prompts, then retry.",
427456notes: [
428457`Browser control could not inspect or auto-join Meet: ${
429458 error instanceof Error ? error.message : String(error)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。