@openclaw/google-meet 2026.7.2-beta.4 → 2026.7.2-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chrome-create-DkWXFsK2.js → chrome-create-DMKruRFW.js} +18 -17
- package/dist/{cli-CksOXL4n.js → cli-DCcRyaMf.js} +8 -18
- package/dist/cli-metadata.js +13 -0
- package/dist/cli-output-mode-BwH_6tH8.js +28 -0
- package/dist/{create-CNAkrEju.js → create-af1MDlus.js} +1 -1
- package/dist/index.js +68 -264
- package/package.json +4 -5
- package/npm-shrinkwrap.json +0 -157
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/LICENSE +0 -0
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/README.md +0 -0
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/lib/util.js +0 -0
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/package.json +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/LICENSE.txt +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/README.md +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/dist/immediate.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/dist/immediate.min.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/lib/browser.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/lib/index.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/package.json +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/LICENSE +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/README.md +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/inherits.js +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/inherits_browser.js +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/package.json +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/.npmignore +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/.travis.yml +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/Makefile +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/README.md +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/component.json +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/index.js +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/package.json +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/test.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/README.md +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.min.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.polyfill.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.polyfill.min.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/lib/browser.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/lib/index.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/license.md +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/lie.d.ts +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/package.json +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/polyfill.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/CHANGELOG.md +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/LICENSE +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/README.md +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako.min.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_deflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_deflate.min.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_inflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_inflate.min.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/index.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/deflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/inflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/utils/common.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/utils/strings.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/README +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/adler32.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/constants.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/crc32.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/deflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/gzheader.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inffast.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inftrees.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/messages.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/trees.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/zstream.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/package.json +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/index.js +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/license.md +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/package.json +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/readme.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/.travis.yml +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/CONTRIBUTING.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/GOVERNANCE.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/LICENSE +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/README.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/doc/wg-meetings/2015-01-30.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/duplex-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/duplex.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_duplex.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_passthrough.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_readable.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_transform.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_writable.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/BufferList.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/destroy.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/stream-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/stream.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/package.json +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/passthrough.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/readable-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/readable.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/transform.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/writable-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/writable.js +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/LICENSE +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/README.md +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/index.d.ts +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/index.js +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/package.json +0 -0
- /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/LICENSE.txt +0 -0
- /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/package.json +0 -0
- /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/setImmediate.js +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/.travis.yml +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/LICENSE +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/README.md +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/lib/string_decoder.js +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/package.json +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/History.md +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/LICENSE +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/README.md +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/browser.js +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/node.js +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/package.json +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/index.d.ts +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/index.js +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/license +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/package.json +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/readme.md +0 -0
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { a as buildGoogleMeetCalendarDayWindow, c as normalizeMeetUrl, i as resolveGoogleMeetGatewayOperationTimeoutMs, n as DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND, o as findGoogleMeetCalendarEvent, r as resolveGoogleMeetConfig, s as listGoogleMeetCalendarEvents, t as DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND } from "./config-BcaS1BDr.js";
|
|
2
|
-
import {
|
|
2
|
+
import { t as GOOGLE_MEET_CLI_DESCRIPTOR } from "./cli-output-mode-BwH_6tH8.js";
|
|
3
|
+
import { _ as endGoogleMeetActiveConference, a as isRecoverableMeetTab, c as readMeetAuthUser, d as resolveChromeNodeInfo, f as GOOGLE_MEET_NODE_COMMAND, h as fetchGoogleMeetAttendance, i as isEnglishMeetTab, l as callBrowserProxyOnNode, m as fetchGoogleMeetArtifacts, n as isGoogleMeetBrowserManualActionError, o as isSameMeetUrlForReuse, p as buildGoogleMeetPreflightReport, r as forceMeetEnglishUi, s as normalizeMeetUrlForReuse, t as createMeetWithBrowserProxyOnNode, u as resolveChromeNode, v as fetchGoogleMeetSpace, y as fetchLatestGoogleMeetConferenceRecord } from "./chrome-create-DMKruRFW.js";
|
|
3
4
|
import { optionalPositiveIntegerSchema, readPositiveIntegerParam } from "openclaw/plugin-sdk/channel-actions";
|
|
4
5
|
import { ErrorCodes, GatewayClient, callGatewayFromCli, errorShape, startGatewayClientWhenEventLoopReady } from "openclaw/plugin-sdk/gateway-runtime";
|
|
5
6
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
@@ -9,10 +10,9 @@ import { jsonResult } from "openclaw/plugin-sdk/tool-results";
|
|
|
9
10
|
import { createMeetingTranscriptSourceProvider, resolveTranscriptsConfig } from "openclaw/plugin-sdk/transcripts";
|
|
10
11
|
import { isBlockedHostnameOrIp } from "openclaw/plugin-sdk/ssrf-runtime";
|
|
11
12
|
import { spawnSync } from "node:child_process";
|
|
12
|
-
import { MeetingSessionRuntime, addMeetingSetupCheck, createLocalMeetingRealtimeAudioTransport, createMeetingBrowserNodeInvokePolicy, createMeetingNodeHost, createMeetingRealtimeEngineBindings, createMeetingSession, createMeetingSetupStatus, createMeetingVoiceCallGateway, createNodeMeetingRealtimeAudioTransport, endMeetingVoiceCallGatewayCall, getMeetingVoiceCallGatewayCall, isMeetingVoiceCallMissingError, joinMeetingViaVoiceCallGateway, leaveMeetingWithBrowser, openMeetingWithBrowser, readMeetingTranscriptWithBrowser, recoverMeetingBrowserTab, resolveLocalMeetingBrowserRequest, speakMeetingViaVoiceCallGateway, startMeetingAgentRealtimeEngine, startMeetingRealtimeEngine } from "openclaw/plugin-sdk/meeting-runtime";
|
|
13
|
+
import { MeetingPlatformAdapter, MeetingSessionRuntime, addMeetingSetupCheck, createLocalMeetingRealtimeAudioTransport, createMeetingBrowserNodeInvokePolicy, createMeetingNodeHost, createMeetingRealtimeEngineBindings, createMeetingSession, createMeetingSetupStatus, createMeetingVoiceCallGateway, createNodeMeetingRealtimeAudioTransport, endMeetingVoiceCallGatewayCall, getMeetingVoiceCallGatewayCall, isMeetingVoiceCallMissingError, joinMeetingViaVoiceCallGateway, leaveMeetingWithBrowser, openMeetingWithBrowser, readMeetingTranscriptWithBrowser, recoverMeetingBrowserTab, resolveLocalMeetingBrowserRequest, speakMeetingViaVoiceCallGateway, startMeetingAgentRealtimeEngine, startMeetingRealtimeEngine } from "openclaw/plugin-sdk/meeting-runtime";
|
|
13
14
|
import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime";
|
|
14
15
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
15
|
-
import { sleep } from "openclaw/plugin-sdk/runtime-env";
|
|
16
16
|
import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
|
|
17
17
|
import { resolveDefaultAgentId } from "openclaw/plugin-sdk/agent-runtime";
|
|
18
18
|
import fs from "node:fs";
|
|
@@ -33,6 +33,7 @@ const GOOGLE_MEET_CAPTION_SETTLE_MS = 1e3;
|
|
|
33
33
|
function meetStatusScript(params) {
|
|
34
34
|
return `async () => {
|
|
35
35
|
const text = (node) => (node?.innerText || node?.textContent || "").trim();
|
|
36
|
+
const manualActionFor = (reason, message) => ({ reason, message });
|
|
36
37
|
const allowMicrophone = ${JSON.stringify(params.allowMicrophone)};
|
|
37
38
|
const captionSessionId = ${JSON.stringify(params.captionSessionId)};
|
|
38
39
|
const captureCaptions = ${JSON.stringify(params.captureCaptions)};
|
|
@@ -331,27 +332,17 @@ function meetStatusScript(params) {
|
|
|
331
332
|
const leaveReason = !inCall && /you left the meeting|you.?ve left the meeting|removed from the meeting|you were removed|call ended|meeting ended/i.test(pageText)
|
|
332
333
|
? pageText.match(/you left the meeting|you.?ve left the meeting|removed from the meeting|you were removed|call ended|meeting ended/i)?.[0]
|
|
333
334
|
: undefined;
|
|
334
|
-
let
|
|
335
|
-
let manualActionMessage;
|
|
335
|
+
let manualAction;
|
|
336
336
|
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))) {
|
|
337
|
-
|
|
338
|
-
manualActionMessage = "Sign in to Google in the OpenClaw browser profile, then retry the Meet join.";
|
|
337
|
+
manualAction = manualActionFor("google-login-required", "Sign in to Google in the OpenClaw browser profile, then retry the Meet join.");
|
|
339
338
|
} else if (!inCall && joinElsewhere) {
|
|
340
|
-
|
|
341
|
-
manualActionMessage = "Meet is already active in another tab or device. Leave that session or reuse an English-pinned tab before retrying.";
|
|
339
|
+
manualAction = manualActionFor("meet-session-conflict", "Meet is already active in another tab or device. Leave that session or reuse an English-pinned tab before retrying.");
|
|
342
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)) {
|
|
343
|
-
|
|
344
|
-
manualActionMessage = "Admit the OpenClaw browser participant in Google Meet, then retry speech.";
|
|
341
|
+
manualAction = manualActionFor("meet-admission-required", "Admit the OpenClaw browser participant in Google Meet, then retry speech.");
|
|
345
342
|
} else if (permissionNeeded) {
|
|
346
|
-
|
|
347
|
-
manualActionMessage = allowMicrophone
|
|
348
|
-
? "Allow microphone/camera/speaker permissions for Meet in the OpenClaw browser profile, then retry."
|
|
349
|
-
: "Join without microphone/camera permissions in the OpenClaw browser profile, then retry.";
|
|
343
|
+
manualAction = manualActionFor("meet-permission-required", allowMicrophone ? "Allow microphone/camera/speaker permissions for Meet in the OpenClaw browser profile, then retry." : "Join without microphone/camera permissions in the OpenClaw browser profile, then retry.");
|
|
350
344
|
} else if (!inCall && (allowMicrophone ? !microphoneChoice : !noMicrophoneChoice) && /do you want people to hear you in the meeting/i.test(pageText)) {
|
|
351
|
-
|
|
352
|
-
manualActionMessage = allowMicrophone
|
|
353
|
-
? "Meet is showing the microphone choice. Click Use microphone in the OpenClaw browser profile, then retry."
|
|
354
|
-
: "Meet is showing the microphone choice. Choose the no-microphone option in the OpenClaw browser profile, then retry.";
|
|
345
|
+
manualAction = manualActionFor("meet-audio-choice-required", allowMicrophone ? "Meet is showing the microphone choice. Click Use microphone in the OpenClaw browser profile, then retry." : "Meet is showing the microphone choice. Choose the no-microphone option in the OpenClaw browser profile, then retry.");
|
|
355
346
|
}
|
|
356
347
|
return JSON.stringify({
|
|
357
348
|
clickedJoin: Boolean(join),
|
|
@@ -370,9 +361,7 @@ function meetStatusScript(params) {
|
|
|
370
361
|
audioOutputRouted,
|
|
371
362
|
audioOutputDeviceLabel,
|
|
372
363
|
audioOutputRouteError,
|
|
373
|
-
|
|
374
|
-
manualActionReason,
|
|
375
|
-
manualActionMessage,
|
|
364
|
+
manualAction,
|
|
376
365
|
title: document.title,
|
|
377
366
|
url: pageUrl,
|
|
378
367
|
notes
|
|
@@ -519,42 +508,6 @@ function prefixDtmfWait(sequence, delayMs) {
|
|
|
519
508
|
}
|
|
520
509
|
//#endregion
|
|
521
510
|
//#region extensions/google-meet/src/transports/google-meet-platform-adapter.ts
|
|
522
|
-
function isGoogleMeetTalkBackMode$1(mode) {
|
|
523
|
-
return mode === "agent" || mode === "bidi";
|
|
524
|
-
}
|
|
525
|
-
function parseMeetBrowserStatus(result) {
|
|
526
|
-
const raw = (result && typeof result === "object" ? result : {}).result;
|
|
527
|
-
if (typeof raw !== "string" || !raw.trim()) return;
|
|
528
|
-
let parsed;
|
|
529
|
-
try {
|
|
530
|
-
parsed = JSON.parse(raw);
|
|
531
|
-
} catch {
|
|
532
|
-
throw new Error("Google Meet browser status JSON is malformed.");
|
|
533
|
-
}
|
|
534
|
-
return {
|
|
535
|
-
inCall: parsed.inCall,
|
|
536
|
-
micMuted: parsed.micMuted,
|
|
537
|
-
lobbyWaiting: parsed.lobbyWaiting,
|
|
538
|
-
leaveReason: parsed.leaveReason,
|
|
539
|
-
captioning: parsed.captioning,
|
|
540
|
-
captionsEnabledAttempted: parsed.captionsEnabledAttempted,
|
|
541
|
-
transcriptLines: parsed.transcriptLines,
|
|
542
|
-
lastCaptionAt: parsed.lastCaptionAt,
|
|
543
|
-
lastCaptionSpeaker: parsed.lastCaptionSpeaker,
|
|
544
|
-
lastCaptionText: parsed.lastCaptionText,
|
|
545
|
-
recentTranscript: parsed.recentTranscript,
|
|
546
|
-
audioOutputRouted: parsed.audioOutputRouted,
|
|
547
|
-
audioOutputDeviceLabel: parsed.audioOutputDeviceLabel,
|
|
548
|
-
audioOutputRouteError: parsed.audioOutputRouteError,
|
|
549
|
-
manualActionRequired: parsed.manualActionRequired,
|
|
550
|
-
manualActionReason: parsed.manualActionReason,
|
|
551
|
-
manualActionMessage: parsed.manualActionMessage,
|
|
552
|
-
browserUrl: parsed.url,
|
|
553
|
-
browserTitle: parsed.title,
|
|
554
|
-
status: "browser-control",
|
|
555
|
-
notes: Array.isArray(parsed.notes) ? parsed.notes.filter((note) => typeof note === "string") : void 0
|
|
556
|
-
};
|
|
557
|
-
}
|
|
558
511
|
function parsePermissionGrantNotes(result) {
|
|
559
512
|
const record = result && typeof result === "object" ? result : {};
|
|
560
513
|
const unsupportedPermissions = Array.isArray(record.unsupportedPermissions) ? record.unsupportedPermissions.filter((value) => typeof value === "string") : [];
|
|
@@ -562,63 +515,19 @@ function parsePermissionGrantNotes(result) {
|
|
|
562
515
|
if (unsupportedPermissions.includes("speakerSelection")) notes.push("Chrome did not accept the optional Meet speaker-selection permission.");
|
|
563
516
|
return notes;
|
|
564
517
|
}
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
}
|
|
577
|
-
if (!parsed || typeof parsed !== "object") throw new Error("Google Meet transcript payload is invalid.");
|
|
578
|
-
const payload = parsed;
|
|
579
|
-
const droppedLines = typeof payload.droppedLines === "number" && Number.isSafeInteger(payload.droppedLines) ? Math.max(0, payload.droppedLines) : 0;
|
|
580
|
-
const lines = Array.isArray(payload.lines) ? payload.lines.flatMap((value) => {
|
|
581
|
-
if (!value || typeof value !== "object") return [];
|
|
582
|
-
const line = value;
|
|
583
|
-
if (typeof line.text !== "string" || !line.text.trim()) return [];
|
|
584
|
-
return [{
|
|
585
|
-
...typeof line.at === "string" ? { at: line.at } : {},
|
|
586
|
-
...typeof line.speaker === "string" ? { speaker: line.speaker } : {},
|
|
587
|
-
text: line.text
|
|
588
|
-
}];
|
|
589
|
-
}) : [];
|
|
590
|
-
return {
|
|
591
|
-
droppedLines,
|
|
592
|
-
...typeof payload.epoch === "string" ? { epoch: payload.epoch } : {},
|
|
593
|
-
lines,
|
|
594
|
-
...typeof payload.urlMatched === "boolean" ? { urlMatched: payload.urlMatched } : {},
|
|
595
|
-
...typeof payload.sessionMatched === "boolean" ? { sessionMatched: payload.sessionMatched } : {}
|
|
596
|
-
};
|
|
597
|
-
}
|
|
598
|
-
function parseMeetLeaveResult(result) {
|
|
599
|
-
const raw = (result && typeof result === "object" ? result : {}).result;
|
|
600
|
-
if (typeof raw !== "string" || !raw.trim()) return { departed: false };
|
|
601
|
-
try {
|
|
602
|
-
const parsed = JSON.parse(raw);
|
|
603
|
-
const leaveAction = parsed.leaveAction === "leave" || parsed.leaveAction === "confirm" ? parsed.leaveAction : void 0;
|
|
604
|
-
return {
|
|
605
|
-
departed: parsed.departed === true,
|
|
606
|
-
...leaveAction ? { leaveAction } : {},
|
|
607
|
-
...typeof parsed.urlMatched === "boolean" ? { urlMatched: parsed.urlMatched } : {}
|
|
608
|
-
};
|
|
609
|
-
} catch {
|
|
610
|
-
return { departed: false };
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
function classifyMeetManualAction(health) {
|
|
614
|
-
if (!health.manualActionRequired || !health.manualActionReason || !health.manualActionMessage) return;
|
|
615
|
-
return {
|
|
616
|
-
category: health.manualActionReason === "google-login-required" ? "login-required" : health.manualActionReason === "meet-admission-required" ? "admission-required" : health.manualActionReason === "meet-permission-required" ? "permission-required" : health.manualActionReason === "meet-audio-choice-required" ? "audio-choice-required" : health.manualActionReason === "meet-locale-required" ? "locale-required" : health.manualActionReason === "meet-session-conflict" ? "session-conflict" : health.manualActionReason === "browser-control-unavailable" ? "browser-control-unavailable" : "custom",
|
|
617
|
-
reason: health.manualActionReason,
|
|
618
|
-
message: health.manualActionMessage
|
|
619
|
-
};
|
|
518
|
+
const manualActionCategories = /* @__PURE__ */ new Map([
|
|
519
|
+
["browser-control-unavailable", "browser-control-unavailable"],
|
|
520
|
+
["google-login-required", "login-required"],
|
|
521
|
+
["meet-admission-required", "admission-required"],
|
|
522
|
+
["meet-audio-choice-required", "audio-choice-required"],
|
|
523
|
+
["meet-locale-required", "locale-required"],
|
|
524
|
+
["meet-permission-required", "permission-required"],
|
|
525
|
+
["meet-session-conflict", "session-conflict"]
|
|
526
|
+
]);
|
|
527
|
+
function classifyManualActionReason(reason) {
|
|
528
|
+
return manualActionCategories.get(reason) ?? "custom";
|
|
620
529
|
}
|
|
621
|
-
const GOOGLE_MEET_PLATFORM_ADAPTER = {
|
|
530
|
+
const GOOGLE_MEET_PLATFORM_ADAPTER = MeetingPlatformAdapter.create({
|
|
622
531
|
id: "google-meet",
|
|
623
532
|
displayName: "Google Meet",
|
|
624
533
|
browserLabel: "Meet",
|
|
@@ -661,28 +570,24 @@ const GOOGLE_MEET_PLATFORM_ADAPTER = {
|
|
|
661
570
|
}
|
|
662
571
|
},
|
|
663
572
|
browser: {
|
|
664
|
-
allowsMicrophone:
|
|
573
|
+
allowsMicrophone: MeetingPlatformAdapter.isTalkBackMode,
|
|
665
574
|
buildStatusJoinScript: (params) => meetStatusScript({
|
|
666
|
-
allowMicrophone:
|
|
575
|
+
allowMicrophone: MeetingPlatformAdapter.isTalkBackMode(params.mode),
|
|
667
576
|
autoJoin: params.autoJoin,
|
|
668
577
|
captionSessionId: params.meetingSessionId || void 0,
|
|
669
578
|
captureCaptions: params.captureCaptions,
|
|
670
579
|
guestName: params.guestName,
|
|
671
580
|
readOnly: params.readOnly
|
|
672
581
|
}),
|
|
673
|
-
parseStatus: parseMeetBrowserStatus,
|
|
674
|
-
classifyManualAction: classifyMeetManualAction,
|
|
675
582
|
browserControlUnavailable: () => ({
|
|
676
583
|
category: "browser-control-unavailable",
|
|
677
584
|
reason: "browser-control-unavailable",
|
|
678
585
|
message: "Open the OpenClaw browser profile, finish Google Meet login, admission, or permission prompts, then retry."
|
|
679
586
|
}),
|
|
680
587
|
buildLeaveScript: meetLeaveScript,
|
|
681
|
-
parseLeaveResult: parseMeetLeaveResult,
|
|
682
588
|
captions: {
|
|
683
589
|
enabled: (_mode) => true,
|
|
684
|
-
buildTranscriptScript: ({ finalize, meetingSessionId, meetingUrl }) => meetTranscriptScript(meetingUrl, meetingSessionId, finalize)
|
|
685
|
-
parseTranscript: parseMeetTranscriptSnapshot
|
|
590
|
+
buildTranscriptScript: ({ finalize, meetingSessionId, meetingUrl }) => meetTranscriptScript(meetingUrl, meetingSessionId, finalize)
|
|
686
591
|
},
|
|
687
592
|
permissions: ({ allowMicrophone }) => allowMicrophone ? {
|
|
688
593
|
origin: "https://meet.google.com",
|
|
@@ -708,8 +613,16 @@ const GOOGLE_MEET_PLATFORM_ADAPTER = {
|
|
|
708
613
|
pin,
|
|
709
614
|
dtmfSequence: params.dtmfSequence || params.defaultDtmfSequence ? rawDtmfSequence : prefixDtmfWait(rawDtmfSequence, params.dtmfDelayMs)
|
|
710
615
|
};
|
|
711
|
-
} }
|
|
712
|
-
|
|
616
|
+
} },
|
|
617
|
+
parsing: {
|
|
618
|
+
classifyManualActionReason,
|
|
619
|
+
displayName: "Meet",
|
|
620
|
+
invalidTranscriptMessage: "Google Meet transcript payload is invalid.",
|
|
621
|
+
malformedStatusMessage: "Google Meet browser status JSON is malformed.",
|
|
622
|
+
malformedTranscriptMessage: "Google Meet transcript JSON is malformed.",
|
|
623
|
+
statusFields: (parsed) => ({ leaveReason: typeof parsed.leaveReason === "string" ? parsed.leaveReason : void 0 })
|
|
624
|
+
}
|
|
625
|
+
});
|
|
713
626
|
//#endregion
|
|
714
627
|
//#region extensions/google-meet/src/node-host.ts
|
|
715
628
|
function assertBlackHoleAvailable(timeoutMs) {
|
|
@@ -779,131 +692,30 @@ function createGoogleMeetChromeNodeInvokePolicy(config) {
|
|
|
779
692
|
}
|
|
780
693
|
//#endregion
|
|
781
694
|
//#region extensions/google-meet/src/runtime-probes.ts
|
|
782
|
-
function resolveMode$1(request, config) {
|
|
783
|
-
return request.mode === "realtime" ? "agent" : request.mode ?? config.defaultMode;
|
|
784
|
-
}
|
|
785
695
|
function resolveProbeTimeoutMs(input, fallback) {
|
|
786
696
|
if (input === void 0) return Math.min(Math.max(fallback, 1), 12e4);
|
|
787
697
|
if (!Number.isFinite(input) || input <= 0) throw new Error("timeoutMs must be a positive number");
|
|
788
698
|
return Math.min(Math.trunc(input), 12e4);
|
|
789
699
|
}
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
...resolved,
|
|
810
|
-
message: request.message ?? "Say exactly: Google Meet speech test complete."
|
|
811
|
-
});
|
|
812
|
-
const baseline = existing?.id === result.session.id ? existingBaseline : {
|
|
813
|
-
outputBytes: 0,
|
|
814
|
-
outputGeneration: 0
|
|
815
|
-
};
|
|
816
|
-
let health = result.session.chrome?.health;
|
|
817
|
-
const verified = () => (health?.lastOutputBytes ?? 0) > baseline.outputBytes && (health?.outputGeneration ?? 0) > baseline.outputGeneration && health?.verifiedOutputGeneration === health?.outputGeneration;
|
|
818
|
-
const shouldWait = result.spoken === true && health?.manualActionRequired !== true && context.hasHealthHandle(result.session.id);
|
|
819
|
-
if (shouldWait && !verified()) {
|
|
820
|
-
const deadline = Date.now() + Math.min(context.config.chrome.joinTimeoutMs, 5e3);
|
|
821
|
-
while (Date.now() < deadline) {
|
|
822
|
-
await sleep(100);
|
|
823
|
-
context.refreshHealth(result.session.id);
|
|
824
|
-
health = result.session.chrome?.health;
|
|
825
|
-
if (verified()) break;
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
const speechOutputVerified = verified();
|
|
829
|
-
return {
|
|
830
|
-
createdSession: !before.has(result.session.id),
|
|
831
|
-
inCall: health?.inCall,
|
|
832
|
-
manualActionRequired: health?.manualActionRequired,
|
|
833
|
-
manualActionReason: health?.manualActionReason,
|
|
834
|
-
manualActionMessage: health?.manualActionMessage,
|
|
835
|
-
spoken: result.spoken ?? false,
|
|
836
|
-
speechOutputVerified,
|
|
837
|
-
speechOutputTimedOut: shouldWait && !speechOutputVerified,
|
|
838
|
-
speechReady: health?.speechReady,
|
|
839
|
-
speechBlockedReason: health?.speechBlockedReason,
|
|
840
|
-
speechBlockedMessage: health?.speechBlockedMessage,
|
|
841
|
-
audioOutputActive: health?.audioOutputActive,
|
|
842
|
-
lastOutputBytes: health?.lastOutputBytes,
|
|
843
|
-
outputLoopbackSignalBytes: health?.outputLoopbackSignalBytes,
|
|
844
|
-
lastOutputLoopbackAt: health?.lastOutputLoopbackAt,
|
|
845
|
-
lastOutputLoopbackCorrelation: health?.lastOutputLoopbackCorrelation,
|
|
846
|
-
lastOutputLoopbackRms: health?.lastOutputLoopbackRms,
|
|
847
|
-
lastOutputLoopbackPeak: health?.lastOutputLoopbackPeak,
|
|
848
|
-
outputGeneration: health?.outputGeneration,
|
|
849
|
-
verifiedOutputGeneration: health?.verifiedOutputGeneration,
|
|
850
|
-
session: result.session
|
|
851
|
-
};
|
|
852
|
-
}
|
|
853
|
-
async function testGoogleMeetListening(context, request) {
|
|
854
|
-
const requestedMode = request.mode ? resolveMode$1(request, context.config) : void 0;
|
|
855
|
-
if (requestedMode === "agent" || requestedMode === "bidi") throw new Error("test_listen requires mode: transcribe; use test_speech for talk-back sessions.");
|
|
856
|
-
const resolved = {
|
|
857
|
-
url: normalizeMeetUrl(request.url),
|
|
858
|
-
transport: request.transport ?? context.config.defaultTransport,
|
|
859
|
-
mode: "transcribe",
|
|
860
|
-
agentId: context.resolveAgentId(request)
|
|
861
|
-
};
|
|
862
|
-
if (resolved.transport === "twilio") throw new Error("test_listen supports chrome or chrome-node transports");
|
|
863
|
-
const beforeSessions = context.list();
|
|
864
|
-
const before = new Set(beforeSessions.map((session) => session.id));
|
|
865
|
-
const existing = beforeSessions.find((session) => context.isReusable(session, resolved));
|
|
866
|
-
const start = {
|
|
867
|
-
lines: existing?.chrome?.health?.transcriptLines ?? 0,
|
|
868
|
-
at: existing?.chrome?.health?.lastCaptionAt,
|
|
869
|
-
text: existing?.chrome?.health?.lastCaptionText
|
|
870
|
-
};
|
|
871
|
-
const result = await context.join({
|
|
872
|
-
...request,
|
|
873
|
-
...resolved,
|
|
874
|
-
message: void 0
|
|
875
|
-
});
|
|
876
|
-
let health = result.session.chrome?.health;
|
|
877
|
-
const advanced = () => (health?.transcriptLines ?? 0) > (existing?.id === result.session.id ? start.lines : 0) || Boolean(health?.lastCaptionAt && health.lastCaptionAt !== start.at) || Boolean(health?.lastCaptionText && health.lastCaptionText !== start.text);
|
|
878
|
-
const shouldWait = health?.manualActionRequired !== true && Boolean((result.session.transport === "chrome" || result.session.transport === "chrome-node") && result.session.chrome?.launched);
|
|
879
|
-
if (shouldWait && !advanced()) {
|
|
880
|
-
const deadline = Date.now() + resolveProbeTimeoutMs(request.timeoutMs, context.config.chrome.joinTimeoutMs);
|
|
881
|
-
while (Date.now() < deadline) {
|
|
882
|
-
await sleep(250);
|
|
883
|
-
await context.refreshCaptionHealth(result.session);
|
|
884
|
-
health = result.session.chrome?.health;
|
|
885
|
-
if (health?.manualActionRequired || advanced()) break;
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
const listenVerified = advanced();
|
|
889
|
-
return {
|
|
890
|
-
createdSession: !before.has(result.session.id),
|
|
891
|
-
inCall: health?.inCall,
|
|
892
|
-
manualActionRequired: health?.manualActionRequired,
|
|
893
|
-
manualActionReason: health?.manualActionReason,
|
|
894
|
-
manualActionMessage: health?.manualActionMessage,
|
|
895
|
-
listenVerified,
|
|
896
|
-
listenTimedOut: shouldWait && !listenVerified && health?.manualActionRequired !== true,
|
|
897
|
-
captioning: health?.captioning,
|
|
898
|
-
captionsEnabledAttempted: health?.captionsEnabledAttempted,
|
|
899
|
-
transcriptLines: health?.transcriptLines,
|
|
900
|
-
lastCaptionAt: health?.lastCaptionAt,
|
|
901
|
-
lastCaptionSpeaker: health?.lastCaptionSpeaker,
|
|
902
|
-
lastCaptionText: health?.lastCaptionText,
|
|
903
|
-
recentTranscript: health?.recentTranscript,
|
|
904
|
-
session: result.session
|
|
905
|
-
};
|
|
906
|
-
}
|
|
700
|
+
const probes = MeetingPlatformAdapter.createRuntimeProbes({
|
|
701
|
+
defaultSpeechMessage: "Say exactly: Google Meet speech test complete.",
|
|
702
|
+
invalidRequest: (message) => new Error(message),
|
|
703
|
+
resolveTimeoutMs: resolveProbeTimeoutMs,
|
|
704
|
+
shouldWaitForListening: (session) => Boolean((session.transport === "chrome" || session.transport === "chrome-node") && session.chrome?.launched),
|
|
705
|
+
talkBackMode: MeetingPlatformAdapter.isTalkBackMode,
|
|
706
|
+
normalizeUrl: normalizeMeetUrl,
|
|
707
|
+
resolveRequestMode: (mode) => mode === "realtime" ? "agent" : mode,
|
|
708
|
+
defaultTransport: (config) => config.defaultTransport,
|
|
709
|
+
validateListeningTransport: (transport) => {
|
|
710
|
+
if (transport === "twilio") throw new Error("test_listen supports chrome or chrome-node transports");
|
|
711
|
+
},
|
|
712
|
+
resolveSpeechTimeoutMs: (_request, config) => Math.min(config.chrome.joinTimeoutMs, 5e3),
|
|
713
|
+
refreshCaptionHealth: async (context, session) => await context.refreshCaptionHealth(session),
|
|
714
|
+
speechModeError: "test_speech requires mode: agent or bidi; use join mode: transcribe for observe-only sessions.",
|
|
715
|
+
listeningModeError: "test_listen requires mode: transcribe; use test_speech for talk-back sessions."
|
|
716
|
+
});
|
|
717
|
+
const testGoogleMeetListening = probes.testListening;
|
|
718
|
+
const testGoogleMeetSpeech = probes.testSpeech;
|
|
907
719
|
//#endregion
|
|
908
720
|
//#region extensions/google-meet/src/runtime-session.ts
|
|
909
721
|
function resolveTransport(input, config) {
|
|
@@ -980,7 +792,7 @@ function getGoogleMeetSetupStatus(config, options) {
|
|
|
980
792
|
const fullConfig = asRecord(options?.fullConfig);
|
|
981
793
|
const mode = options?.mode ?? config.defaultMode;
|
|
982
794
|
const transport = options?.transport ?? config.defaultTransport;
|
|
983
|
-
const needsChromeRealtimeAudio = (mode
|
|
795
|
+
const needsChromeRealtimeAudio = MeetingPlatformAdapter.isTalkBackMode(mode) && (transport === "chrome" || transport === "chrome-node");
|
|
984
796
|
const pluginEntries = asRecord(asRecord(fullConfig.plugins).entries);
|
|
985
797
|
const pluginAllow = asRecord(fullConfig.plugins).allow;
|
|
986
798
|
const voiceCallEntry = asRecord(pluginEntries["voice-call"]);
|
|
@@ -1091,7 +903,7 @@ async function assertBlackHole2chAvailable(params) {
|
|
|
1091
903
|
}
|
|
1092
904
|
async function launchChromeMeet(params) {
|
|
1093
905
|
const checkRealtimeAudioPrerequisites = async () => {
|
|
1094
|
-
if (!
|
|
906
|
+
if (!MeetingPlatformAdapter.isTalkBackMode(params.mode)) return;
|
|
1095
907
|
await assertBlackHole2chAvailable({
|
|
1096
908
|
runtime: params.runtime,
|
|
1097
909
|
timeoutMs: Math.min(params.config.chrome.joinTimeoutMs, 1e4)
|
|
@@ -1102,7 +914,7 @@ async function launchChromeMeet(params) {
|
|
|
1102
914
|
}
|
|
1103
915
|
};
|
|
1104
916
|
const startRealtimeAudioBridge = async () => {
|
|
1105
|
-
if (!
|
|
917
|
+
if (!MeetingPlatformAdapter.isTalkBackMode(params.mode)) return;
|
|
1106
918
|
if (params.config.chrome.audioBridgeCommand) {
|
|
1107
919
|
if (params.mode === "agent") throw new Error("Chrome agent mode requires chrome.audioInputCommand and chrome.audioOutputCommand so OpenClaw can run STT and regular TTS directly.");
|
|
1108
920
|
const bridge = await params.runtime.system.runCommandWithTimeout(params.config.chrome.audioBridgeCommand, { timeoutMs: params.config.chrome.joinTimeoutMs });
|
|
@@ -1174,7 +986,7 @@ async function launchChromeMeet(params) {
|
|
|
1174
986
|
url: params.url
|
|
1175
987
|
}
|
|
1176
988
|
});
|
|
1177
|
-
const audioBridge =
|
|
989
|
+
const audioBridge = MeetingPlatformAdapter.isTalkBackMode(params.mode) && result.browser?.inCall === true && result.browser.micMuted === false && result.browser.manualAction === void 0 ? await startRealtimeAudioBridge() : void 0;
|
|
1178
990
|
return {
|
|
1179
991
|
...result,
|
|
1180
992
|
audioBridge
|
|
@@ -1346,7 +1158,7 @@ async function launchChromeMeetOnNode(params) {
|
|
|
1346
1158
|
meetingSessionId: params.meetingSessionId,
|
|
1347
1159
|
url: params.url
|
|
1348
1160
|
});
|
|
1349
|
-
if (params.config.chrome.launch &&
|
|
1161
|
+
if (params.config.chrome.launch && MeetingPlatformAdapter.isTalkBackMode(params.mode) && (browserControl.browser?.inCall !== true || browserControl.browser.micMuted !== false || browserControl.browser.manualAction)) return {
|
|
1350
1162
|
nodeId,
|
|
1351
1163
|
launched: browserControl.launched,
|
|
1352
1164
|
browser: browserControl.browser,
|
|
@@ -1636,7 +1448,6 @@ var GoogleMeetRuntime = class {
|
|
|
1636
1448
|
speech: {
|
|
1637
1449
|
audioBridgeUnavailable: "Realtime speech requires an active Chrome audio bridge.",
|
|
1638
1450
|
browserUnverified: "Google Meet browser state has not been verified yet.",
|
|
1639
|
-
manualActionFallback: "Resolve the Google Meet browser prompt before asking OpenClaw to speak.",
|
|
1640
1451
|
microphoneMuted: "Turn on the OpenClaw Google Meet microphone before asking OpenClaw to speak.",
|
|
1641
1452
|
microphoneMutedReason: "meet-microphone-muted",
|
|
1642
1453
|
notInCall: "Google Meet has not reported that the browser participant is in the call.",
|
|
@@ -1659,7 +1470,7 @@ var GoogleMeetRuntime = class {
|
|
|
1659
1470
|
}),
|
|
1660
1471
|
resolveSpeechInstructions: (request) => request.message ?? params.config.realtime.introMessage,
|
|
1661
1472
|
isBrowserTransport,
|
|
1662
|
-
isTalkBackMode:
|
|
1473
|
+
isTalkBackMode: (mode) => MeetingPlatformAdapter.isTalkBackMode(mode),
|
|
1663
1474
|
isTranscribeMode: (mode) => mode === "transcribe",
|
|
1664
1475
|
sameMeetingUrl: (left, right) => adapter.urls.isSameMeeting(left, right),
|
|
1665
1476
|
normalizeMeetingUrlForReuse: (url) => adapter.urls.normalizeForReuse(url),
|
|
@@ -1809,7 +1620,7 @@ var GoogleMeetRuntime = class {
|
|
|
1809
1620
|
};
|
|
1810
1621
|
const handles = this.#attachChromeAudioBridge(session, result.audioBridge);
|
|
1811
1622
|
if (handles) context.attachRuntimeHandles(session, handles);
|
|
1812
|
-
session.notes.push(result.audioBridge ? session.transport === "chrome-node" ? "Chrome node transport joins as the signed-in Google profile on the selected node and routes realtime audio through the node bridge." : "Chrome transport joins as the signed-in Google profile and routes realtime audio through the configured bridge." :
|
|
1623
|
+
session.notes.push(result.audioBridge ? session.transport === "chrome-node" ? "Chrome node transport joins as the signed-in Google profile on the selected node and routes realtime audio through the node bridge." : "Chrome transport joins as the signed-in Google profile and routes realtime audio through the configured bridge." : MeetingPlatformAdapter.isTalkBackMode(session.mode) ? "Chrome transport joins as the signed-in Google profile and expects BlackHole 2ch audio routing." : "Chrome transport joins as the signed-in Google profile without starting the realtime audio bridge.");
|
|
1813
1624
|
this.#sessions.refreshSpeechReadiness(session);
|
|
1814
1625
|
return {};
|
|
1815
1626
|
}
|
|
@@ -1835,7 +1646,7 @@ var GoogleMeetRuntime = class {
|
|
|
1835
1646
|
...request.requesterSessionKey ? { requesterSessionKey: request.requesterSessionKey } : {},
|
|
1836
1647
|
agentId: delegatedAgentId,
|
|
1837
1648
|
sessionKey: delegatedAgentId ? `agent:${delegatedAgentId}:google-meet:${session.id}` : `voice:google-meet:${session.id}`,
|
|
1838
|
-
message:
|
|
1649
|
+
message: MeetingPlatformAdapter.isTalkBackMode(session.mode) ? request.message ?? this.params.config.voiceCall.introMessage ?? this.params.config.realtime.introMessage : void 0
|
|
1839
1650
|
}) : void 0;
|
|
1840
1651
|
session.twilio = {
|
|
1841
1652
|
dialInNumber,
|
|
@@ -1867,7 +1678,7 @@ var GoogleMeetRuntime = class {
|
|
|
1867
1678
|
} : void 0;
|
|
1868
1679
|
}
|
|
1869
1680
|
async #ensureChromeRealtimeBridge(session) {
|
|
1870
|
-
if (!
|
|
1681
|
+
if (!MeetingPlatformAdapter.isTalkBackMode(session.mode) || !isBrowserTransport(session.transport) || session.state !== "active" || !session.chrome || session.chrome.audioBridge || session.chrome.health?.inCall !== true || session.chrome.health.micMuted !== false || session.chrome.health.manualAction) return;
|
|
1871
1682
|
const config = withSessionAgentConfig(this.params.config, session.agentId);
|
|
1872
1683
|
const recoveryConfig = {
|
|
1873
1684
|
...config,
|
|
@@ -2059,8 +1870,8 @@ var GoogleMeetRuntime = class {
|
|
|
2059
1870
|
};
|
|
2060
1871
|
//#endregion
|
|
2061
1872
|
//#region extensions/google-meet/src/plugin-helpers.ts
|
|
2062
|
-
const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-
|
|
2063
|
-
const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-
|
|
1873
|
+
const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-af1MDlus.js").then((n) => n.t));
|
|
1874
|
+
const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-DCcRyaMf.js"));
|
|
2064
1875
|
function asParamRecord(params) {
|
|
2065
1876
|
return params && typeof params === "object" && !Array.isArray(params) ? params : {};
|
|
2066
1877
|
}
|
|
@@ -2071,9 +1882,6 @@ function normalizeMode(value) {
|
|
|
2071
1882
|
if (value === "realtime") return "agent";
|
|
2072
1883
|
return value === "agent" || value === "bidi" || value === "transcribe" ? value : void 0;
|
|
2073
1884
|
}
|
|
2074
|
-
function isGoogleMeetTalkBackMode(mode) {
|
|
2075
|
-
return mode === "agent" || mode === "bidi";
|
|
2076
|
-
}
|
|
2077
1885
|
function resolveMeetingInput(config, value) {
|
|
2078
1886
|
const meeting = normalizeOptionalString(value) ?? config.defaults.meeting;
|
|
2079
1887
|
if (!meeting) throw new Error("Meeting input is required");
|
|
@@ -2112,7 +1920,7 @@ function isGoogleMeetAgentToolActionUnsupportedOnHost(params) {
|
|
|
2112
1920
|
if (action !== "join" && action !== "test_speech" && !(action === "create" && shouldJoinCreatedMeet(params.raw))) return false;
|
|
2113
1921
|
const transport = normalizeTransport(params.raw.transport) ?? params.config.defaultTransport;
|
|
2114
1922
|
const mode = action === "test_speech" ? "agent" : normalizeMode(params.raw.mode) ?? params.config.defaultMode;
|
|
2115
|
-
return transport === "chrome" &&
|
|
1923
|
+
return transport === "chrome" && MeetingPlatformAdapter.isTalkBackMode(mode);
|
|
2116
1924
|
}
|
|
2117
1925
|
function assertGoogleMeetAgentToolActionSupported(params) {
|
|
2118
1926
|
if (!isGoogleMeetAgentToolActionUnsupportedOnHost(params)) return;
|
|
@@ -3016,11 +2824,7 @@ var google_meet_default = definePluginEntry({
|
|
|
3016
2824
|
});
|
|
3017
2825
|
}, {
|
|
3018
2826
|
commands: ["googlemeet"],
|
|
3019
|
-
descriptors: [
|
|
3020
|
-
name: "googlemeet",
|
|
3021
|
-
description: "Join and manage Google Meet calls",
|
|
3022
|
-
hasSubcommands: true
|
|
3023
|
-
}]
|
|
2827
|
+
descriptors: [GOOGLE_MEET_CLI_DESCRIPTOR]
|
|
3024
2828
|
});
|
|
3025
2829
|
}
|
|
3026
2830
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/google-meet",
|
|
3
|
-
"version": "2026.7.2-beta.
|
|
3
|
+
"version": "2026.7.2-beta.7",
|
|
4
4
|
"description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"typebox": "1.3.6"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"openclaw": ">=2026.7.2-beta.
|
|
16
|
+
"openclaw": ">=2026.7.2-beta.7"
|
|
17
17
|
},
|
|
18
18
|
"peerDependenciesMeta": {
|
|
19
19
|
"openclaw": {
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"minHostVersion": ">=2026.4.20"
|
|
31
31
|
},
|
|
32
32
|
"compat": {
|
|
33
|
-
"pluginApi": ">=2026.7.2-beta.
|
|
33
|
+
"pluginApi": ">=2026.7.2-beta.7"
|
|
34
34
|
},
|
|
35
35
|
"build": {
|
|
36
|
-
"openclawVersion": "2026.7.2-beta.
|
|
36
|
+
"openclawVersion": "2026.7.2-beta.7"
|
|
37
37
|
},
|
|
38
38
|
"release": {
|
|
39
39
|
"publishToClawHub": true,
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
"files": [
|
|
47
47
|
"dist/**",
|
|
48
48
|
"openclaw.plugin.json",
|
|
49
|
-
"npm-shrinkwrap.json",
|
|
50
49
|
"README.md"
|
|
51
50
|
],
|
|
52
51
|
"bundledDependencies": [
|