@openclaw/google-meet 2026.7.2-beta.5 → 2026.7.33
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-DMKruRFW.js → .setup/chrome-create-CFNlY-qH.mjs} +153 -132
- package/dist/{cli-GeuAaEIy.js → .setup/cli-DfOl5mwt.mjs} +716 -735
- package/dist/{config-BcaS1BDr.js → .setup/config-DeJhjNWQ.mjs} +95 -76
- package/dist/{create-af1MDlus.js → .setup/create-BVsTTJt1.mjs} +3 -21
- package/dist/{google-api-errors-CDUYkIcK.js → .setup/google-api-errors-BDYXfKRa.mjs} +1 -1
- package/dist/{oauth-DOfMKlGp.js → .setup/oauth-CtVbvmvR.mjs} +4 -3
- package/dist/doctor-contract-api.js +3 -1
- package/dist/index.js +3868 -1818
- package/node_modules/{setimmediate/LICENSE.txt → commander/LICENSE} +10 -8
- package/node_modules/commander/Readme.md +1172 -0
- package/node_modules/commander/index.js +21 -0
- package/node_modules/commander/lib/argument.js +147 -0
- package/node_modules/commander/lib/command.js +2790 -0
- package/node_modules/commander/lib/error.js +36 -0
- package/node_modules/commander/lib/help.js +731 -0
- package/node_modules/commander/lib/option.js +377 -0
- package/node_modules/commander/lib/suggestSimilar.js +99 -0
- package/node_modules/commander/package-support.json +19 -0
- package/node_modules/commander/package.json +64 -0
- package/node_modules/commander/typings/index.d.ts +1113 -0
- package/node_modules/typebox/build/compile/validator.d.mts +4 -1
- package/node_modules/typebox/build/guard/guard.d.mts +1 -1
- package/node_modules/typebox/build/guard/guard.mjs +2 -5
- package/node_modules/typebox/build/guard/string.mjs +4 -16
- package/node_modules/typebox/build/schema/engine/_functions.mjs +15 -34
- package/node_modules/typebox/build/type/action/readonly_object.d.mts +0 -5
- package/node_modules/typebox/build/type/action/readonly_object.mjs +0 -8
- package/node_modules/typebox/build/typebox.d.mts +1 -1
- package/node_modules/typebox/build/typebox.mjs +1 -1
- package/node_modules/typebox/package.json +1 -1
- package/node_modules/typebox/readme.md +32 -29
- package/openclaw.plugin.json +3 -4
- package/package.json +7 -9
- package/dist/cli-metadata.js +0 -13
- package/dist/cli-output-mode-BwH_6tH8.js +0 -28
- package/node_modules/core-util-is/LICENSE +0 -19
- package/node_modules/core-util-is/README.md +0 -3
- package/node_modules/core-util-is/lib/util.js +0 -107
- package/node_modules/core-util-is/package.json +0 -38
- package/node_modules/immediate/LICENSE.txt +0 -20
- package/node_modules/immediate/README.md +0 -93
- package/node_modules/immediate/dist/immediate.js +0 -75
- package/node_modules/immediate/dist/immediate.min.js +0 -1
- package/node_modules/immediate/lib/browser.js +0 -69
- package/node_modules/immediate/lib/index.js +0 -73
- package/node_modules/immediate/package.json +0 -42
- package/node_modules/inherits/LICENSE +0 -16
- package/node_modules/inherits/README.md +0 -42
- package/node_modules/inherits/inherits.js +0 -9
- package/node_modules/inherits/inherits_browser.js +0 -27
- package/node_modules/inherits/package.json +0 -29
- package/node_modules/isarray/.npmignore +0 -1
- package/node_modules/isarray/.travis.yml +0 -4
- package/node_modules/isarray/Makefile +0 -6
- package/node_modules/isarray/README.md +0 -60
- package/node_modules/isarray/component.json +0 -19
- package/node_modules/isarray/index.js +0 -5
- package/node_modules/isarray/package.json +0 -45
- package/node_modules/isarray/test.js +0 -20
- package/node_modules/jszip/.codeclimate.yml +0 -16
- package/node_modules/jszip/.editorconfig +0 -8
- package/node_modules/jszip/.eslintrc.js +0 -43
- package/node_modules/jszip/.github/workflows/pr.yaml +0 -58
- package/node_modules/jszip/.jekyll-metadata +0 -0
- package/node_modules/jszip/.travis.yml +0 -17
- package/node_modules/jszip/CHANGES.md +0 -204
- package/node_modules/jszip/LICENSE.markdown +0 -651
- package/node_modules/jszip/README.markdown +0 -33
- package/node_modules/jszip/deps.js +0 -37
- package/node_modules/jszip/dist/jszip.js +0 -11577
- package/node_modules/jszip/dist/jszip.min.js +0 -13
- package/node_modules/jszip/graph.svg +0 -601
- package/node_modules/jszip/index.d.ts +0 -330
- package/node_modules/jszip/lib/base64.js +0 -106
- package/node_modules/jszip/lib/compressedObject.js +0 -74
- package/node_modules/jszip/lib/compressions.js +0 -14
- package/node_modules/jszip/lib/crc32.js +0 -77
- package/node_modules/jszip/lib/defaults.js +0 -11
- package/node_modules/jszip/lib/external.js +0 -18
- package/node_modules/jszip/lib/flate.js +0 -85
- package/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
- package/node_modules/jszip/lib/generate/index.js +0 -57
- package/node_modules/jszip/lib/index.js +0 -55
- package/node_modules/jszip/lib/license_header.js +0 -11
- package/node_modules/jszip/lib/load.js +0 -88
- package/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
- package/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
- package/node_modules/jszip/lib/nodejsUtils.js +0 -57
- package/node_modules/jszip/lib/object.js +0 -384
- package/node_modules/jszip/lib/readable-stream-browser.js +0 -10
- package/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
- package/node_modules/jszip/lib/reader/DataReader.js +0 -116
- package/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
- package/node_modules/jszip/lib/reader/StringReader.js +0 -38
- package/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
- package/node_modules/jszip/lib/reader/readerFor.js +0 -28
- package/node_modules/jszip/lib/signature.js +0 -7
- package/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
- package/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
- package/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
- package/node_modules/jszip/lib/stream/DataWorker.js +0 -116
- package/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
- package/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
- package/node_modules/jszip/lib/support.js +0 -38
- package/node_modules/jszip/lib/utf8.js +0 -275
- package/node_modules/jszip/lib/utils.js +0 -501
- package/node_modules/jszip/lib/zipEntries.js +0 -261
- package/node_modules/jszip/lib/zipEntry.js +0 -293
- package/node_modules/jszip/lib/zipObject.js +0 -133
- package/node_modules/jszip/package.json +0 -67
- package/node_modules/jszip/sponsors.md +0 -21
- package/node_modules/jszip/tsconfig.json +0 -101
- package/node_modules/jszip/vendor/FileSaver.js +0 -247
- package/node_modules/lie/README.md +0 -62
- package/node_modules/lie/dist/lie.js +0 -350
- package/node_modules/lie/dist/lie.min.js +0 -1
- package/node_modules/lie/dist/lie.polyfill.js +0 -358
- package/node_modules/lie/dist/lie.polyfill.min.js +0 -1
- package/node_modules/lie/lib/browser.js +0 -273
- package/node_modules/lie/lib/index.js +0 -298
- package/node_modules/lie/license.md +0 -7
- package/node_modules/lie/lie.d.ts +0 -244
- package/node_modules/lie/package.json +0 -69
- package/node_modules/lie/polyfill.js +0 -4
- package/node_modules/pako/CHANGELOG.md +0 -164
- package/node_modules/pako/LICENSE +0 -21
- package/node_modules/pako/README.md +0 -191
- package/node_modules/pako/dist/pako.js +0 -6818
- package/node_modules/pako/dist/pako.min.js +0 -1
- package/node_modules/pako/dist/pako_deflate.js +0 -3997
- package/node_modules/pako/dist/pako_deflate.min.js +0 -1
- package/node_modules/pako/dist/pako_inflate.js +0 -3300
- package/node_modules/pako/dist/pako_inflate.min.js +0 -1
- package/node_modules/pako/index.js +0 -14
- package/node_modules/pako/lib/deflate.js +0 -400
- package/node_modules/pako/lib/inflate.js +0 -423
- package/node_modules/pako/lib/utils/common.js +0 -105
- package/node_modules/pako/lib/utils/strings.js +0 -187
- package/node_modules/pako/lib/zlib/README +0 -59
- package/node_modules/pako/lib/zlib/adler32.js +0 -51
- package/node_modules/pako/lib/zlib/constants.js +0 -68
- package/node_modules/pako/lib/zlib/crc32.js +0 -59
- package/node_modules/pako/lib/zlib/deflate.js +0 -1874
- package/node_modules/pako/lib/zlib/gzheader.js +0 -58
- package/node_modules/pako/lib/zlib/inffast.js +0 -345
- package/node_modules/pako/lib/zlib/inflate.js +0 -1556
- package/node_modules/pako/lib/zlib/inftrees.js +0 -343
- package/node_modules/pako/lib/zlib/messages.js +0 -32
- package/node_modules/pako/lib/zlib/trees.js +0 -1222
- package/node_modules/pako/lib/zlib/zstream.js +0 -47
- package/node_modules/pako/package.json +0 -44
- package/node_modules/parse-ms/index.d.ts +0 -30
- package/node_modules/parse-ms/index.js +0 -45
- package/node_modules/parse-ms/license +0 -9
- package/node_modules/parse-ms/package.json +0 -47
- package/node_modules/parse-ms/readme.md +0 -46
- package/node_modules/pretty-ms/index.d.ts +0 -157
- package/node_modules/pretty-ms/index.js +0 -149
- package/node_modules/pretty-ms/license +0 -9
- package/node_modules/pretty-ms/package.json +0 -55
- package/node_modules/pretty-ms/readme.md +0 -179
- package/node_modules/process-nextick-args/index.js +0 -45
- package/node_modules/process-nextick-args/license.md +0 -19
- package/node_modules/process-nextick-args/package.json +0 -25
- package/node_modules/process-nextick-args/readme.md +0 -18
- package/node_modules/readable-stream/.travis.yml +0 -34
- package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
- package/node_modules/readable-stream/GOVERNANCE.md +0 -136
- package/node_modules/readable-stream/LICENSE +0 -47
- package/node_modules/readable-stream/README.md +0 -58
- package/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
- package/node_modules/readable-stream/duplex-browser.js +0 -1
- package/node_modules/readable-stream/duplex.js +0 -1
- package/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
- package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
- package/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
- package/node_modules/readable-stream/lib/_stream_transform.js +0 -214
- package/node_modules/readable-stream/lib/_stream_writable.js +0 -685
- package/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
- package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
- package/node_modules/readable-stream/package.json +0 -52
- package/node_modules/readable-stream/passthrough.js +0 -1
- package/node_modules/readable-stream/readable-browser.js +0 -7
- package/node_modules/readable-stream/readable.js +0 -19
- package/node_modules/readable-stream/transform.js +0 -1
- package/node_modules/readable-stream/writable-browser.js +0 -1
- package/node_modules/readable-stream/writable.js +0 -8
- package/node_modules/safe-buffer/LICENSE +0 -21
- package/node_modules/safe-buffer/README.md +0 -584
- package/node_modules/safe-buffer/index.d.ts +0 -187
- package/node_modules/safe-buffer/index.js +0 -62
- package/node_modules/safe-buffer/package.json +0 -37
- package/node_modules/setimmediate/package.json +0 -30
- package/node_modules/setimmediate/setImmediate.js +0 -186
- package/node_modules/string_decoder/.travis.yml +0 -50
- package/node_modules/string_decoder/LICENSE +0 -48
- package/node_modules/string_decoder/README.md +0 -47
- package/node_modules/string_decoder/lib/string_decoder.js +0 -296
- package/node_modules/string_decoder/package.json +0 -31
- package/node_modules/util-deprecate/History.md +0 -16
- package/node_modules/util-deprecate/LICENSE +0 -24
- package/node_modules/util-deprecate/README.md +0 -53
- package/node_modules/util-deprecate/browser.js +0 -67
- package/node_modules/util-deprecate/node.js +0 -6
- package/node_modules/util-deprecate/package.json +0 -27
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as googleApiError } from "./google-api-errors-
|
|
1
|
+
import { t as googleApiError } from "./google-api-errors-BDYXfKRa.mjs";
|
|
2
2
|
import { uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
3
3
|
import { readProviderJsonResponse, readProviderTextResponse } from "openclaw/plugin-sdk/provider-http";
|
|
4
4
|
import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
|
|
5
|
-
import {
|
|
5
|
+
import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime";
|
|
6
6
|
import { sleep } from "openclaw/plugin-sdk/runtime-env";
|
|
7
7
|
//#region extensions/google-meet/src/drive.ts
|
|
8
8
|
const GOOGLE_DRIVE_API_BASE_URL = "https://www.googleapis.com/drive/v3";
|
|
@@ -49,7 +49,7 @@ async function exportGoogleDriveDocumentText(params) {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
//#endregion
|
|
52
|
-
//#region extensions/google-meet/src/meet
|
|
52
|
+
//#region extensions/google-meet/src/meet.ts
|
|
53
53
|
const GOOGLE_MEET_API_BASE_URL = `https://meet.googleapis.com/v2`;
|
|
54
54
|
const GOOGLE_MEET_URL_HOST = "meet.google.com";
|
|
55
55
|
const GOOGLE_MEET_API_HOST = "meet.googleapis.com";
|
|
@@ -341,36 +341,6 @@ async function listGoogleMeetSmartNotes(params) {
|
|
|
341
341
|
errorPrefix: "Google Meet conferenceRecords.smartNotes.list"
|
|
342
342
|
});
|
|
343
343
|
}
|
|
344
|
-
async function resolveConferenceRecordQuery(params) {
|
|
345
|
-
if (params.conferenceRecord?.trim()) {
|
|
346
|
-
const conferenceRecord = await fetchGoogleMeetConferenceRecord({
|
|
347
|
-
accessToken: params.accessToken,
|
|
348
|
-
conferenceRecord: params.conferenceRecord
|
|
349
|
-
});
|
|
350
|
-
return {
|
|
351
|
-
input: params.conferenceRecord.trim(),
|
|
352
|
-
conferenceRecords: [conferenceRecord]
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
if (!params.meeting?.trim()) throw new Error("Meeting input or conference record is required");
|
|
356
|
-
const space = await fetchGoogleMeetSpace({
|
|
357
|
-
accessToken: params.accessToken,
|
|
358
|
-
meeting: params.meeting
|
|
359
|
-
});
|
|
360
|
-
const conferenceRecords = await listGoogleMeetConferenceRecords({
|
|
361
|
-
accessToken: params.accessToken,
|
|
362
|
-
meeting: space.name,
|
|
363
|
-
pageSize: params.allConferenceRecords ? params.pageSize : 1,
|
|
364
|
-
maxItems: params.allConferenceRecords ? void 0 : 1
|
|
365
|
-
});
|
|
366
|
-
return {
|
|
367
|
-
input: params.meeting,
|
|
368
|
-
space,
|
|
369
|
-
conferenceRecords
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
//#endregion
|
|
373
|
-
//#region extensions/google-meet/src/meet.ts
|
|
374
344
|
function getParticipantDisplayName(participant) {
|
|
375
345
|
return participant.signedinUser?.displayName ?? participant.anonymousUser?.displayName ?? participant.phoneUser?.displayName;
|
|
376
346
|
}
|
|
@@ -486,6 +456,34 @@ function mergeAttendanceRows(rows, conferenceRecord, params) {
|
|
|
486
456
|
}
|
|
487
457
|
return [...grouped.values()].map((row) => decorateAttendanceRow(row, conferenceRecord, params));
|
|
488
458
|
}
|
|
459
|
+
async function resolveConferenceRecordQuery(params) {
|
|
460
|
+
if (params.conferenceRecord?.trim()) {
|
|
461
|
+
const conferenceRecord = await fetchGoogleMeetConferenceRecord({
|
|
462
|
+
accessToken: params.accessToken,
|
|
463
|
+
conferenceRecord: params.conferenceRecord
|
|
464
|
+
});
|
|
465
|
+
return {
|
|
466
|
+
input: params.conferenceRecord.trim(),
|
|
467
|
+
conferenceRecords: [conferenceRecord]
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
if (!params.meeting?.trim()) throw new Error("Meeting input or conference record is required");
|
|
471
|
+
const space = await fetchGoogleMeetSpace({
|
|
472
|
+
accessToken: params.accessToken,
|
|
473
|
+
meeting: params.meeting
|
|
474
|
+
});
|
|
475
|
+
const conferenceRecords = await listGoogleMeetConferenceRecords({
|
|
476
|
+
accessToken: params.accessToken,
|
|
477
|
+
meeting: space.name,
|
|
478
|
+
pageSize: params.allConferenceRecords ? params.pageSize : 1,
|
|
479
|
+
maxItems: params.allConferenceRecords ? void 0 : 1
|
|
480
|
+
});
|
|
481
|
+
return {
|
|
482
|
+
input: params.meeting,
|
|
483
|
+
space,
|
|
484
|
+
conferenceRecords
|
|
485
|
+
};
|
|
486
|
+
}
|
|
489
487
|
async function fetchGoogleMeetArtifacts(params) {
|
|
490
488
|
const resolved = await resolveConferenceRecordQuery(params);
|
|
491
489
|
const artifacts = await Promise.all(resolved.conferenceRecords.map(async (conferenceRecord) => {
|
|
@@ -599,37 +597,7 @@ function buildGoogleMeetPreflightReport(params) {
|
|
|
599
597
|
};
|
|
600
598
|
}
|
|
601
599
|
//#endregion
|
|
602
|
-
//#region extensions/google-meet/src/transports/google-meet-platform-constants.ts
|
|
603
|
-
const GOOGLE_MEET_NODE_COMMAND = "googlemeet.chrome";
|
|
604
|
-
const GOOGLE_MEET_BROWSER_NODE_ADAPTER = {
|
|
605
|
-
displayName: "Google Meet",
|
|
606
|
-
nodeCommandName: GOOGLE_MEET_NODE_COMMAND,
|
|
607
|
-
nodeConfigPath: "plugins.entries.google-meet.config.chromeNode.node"
|
|
608
|
-
};
|
|
609
|
-
//#endregion
|
|
610
600
|
//#region extensions/google-meet/src/transports/chrome-browser-proxy.ts
|
|
611
|
-
async function resolveChromeNodeInfo(params) {
|
|
612
|
-
return await resolveMeetingBrowserNodeInfo({
|
|
613
|
-
...params,
|
|
614
|
-
adapter: GOOGLE_MEET_BROWSER_NODE_ADAPTER
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
async function resolveChromeNode(params) {
|
|
618
|
-
return await resolveMeetingBrowserNode({
|
|
619
|
-
...params,
|
|
620
|
-
adapter: GOOGLE_MEET_BROWSER_NODE_ADAPTER
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
async function callBrowserProxyOnNode(params) {
|
|
624
|
-
return await callMeetingBrowserProxyOnNode({
|
|
625
|
-
...params,
|
|
626
|
-
adapter: GOOGLE_MEET_BROWSER_NODE_ADAPTER
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
const asBrowserTabs = asMeetingBrowserTabs;
|
|
630
|
-
const readBrowserTab = readMeetingBrowserTab;
|
|
631
|
-
//#endregion
|
|
632
|
-
//#region extensions/google-meet/src/transports/google-meet-urls.ts
|
|
633
601
|
function forceMeetEnglishUi(url) {
|
|
634
602
|
try {
|
|
635
603
|
const parsed = new URL(url);
|
|
@@ -644,7 +612,7 @@ function normalizeMeetUrlForReuse(url) {
|
|
|
644
612
|
try {
|
|
645
613
|
const parsed = new URL(url);
|
|
646
614
|
if (parsed.protocol !== "https:" || parsed.hostname.toLowerCase() !== "meet.google.com") return;
|
|
647
|
-
const match = parsed.pathname.match(/^\/([a-z]{3}-[a-z]{4}-[a-z]{3})(?:\/)?$/i);
|
|
615
|
+
const match = parsed.pathname.match(/^\/(new|[a-z]{3}-[a-z]{4}-[a-z]{3})(?:\/)?$/i);
|
|
648
616
|
if (!match?.[1]) return;
|
|
649
617
|
return `https://meet.google.com/${match[1].toLowerCase()}`;
|
|
650
618
|
} catch {
|
|
@@ -656,27 +624,100 @@ function isSameMeetUrlForReuse(a, b) {
|
|
|
656
624
|
const normalizedB = normalizeMeetUrlForReuse(b);
|
|
657
625
|
return Boolean(normalizedA && normalizedB && normalizedA === normalizedB);
|
|
658
626
|
}
|
|
659
|
-
function
|
|
660
|
-
|
|
627
|
+
function isGoogleMeetNode(node) {
|
|
628
|
+
const commands = Array.isArray(node.commands) ? node.commands : [];
|
|
629
|
+
const caps = Array.isArray(node.caps) ? node.caps : [];
|
|
630
|
+
return node.connected === true && commands.includes("googlemeet.chrome") && (commands.includes("browser.proxy") || caps.includes("browser"));
|
|
631
|
+
}
|
|
632
|
+
function matchesRequestedNode(node, requested) {
|
|
633
|
+
return [
|
|
634
|
+
node.nodeId,
|
|
635
|
+
node.displayName,
|
|
636
|
+
node.remoteIp
|
|
637
|
+
].some((value) => value === requested);
|
|
638
|
+
}
|
|
639
|
+
function formatNodeLabel(node) {
|
|
640
|
+
const parts = [
|
|
641
|
+
node.displayName,
|
|
642
|
+
node.nodeId,
|
|
643
|
+
node.remoteIp
|
|
644
|
+
].filter(Boolean);
|
|
645
|
+
return parts.length > 0 ? parts.join(" / ") : "unknown node";
|
|
646
|
+
}
|
|
647
|
+
function describeNodeUsabilityIssues(node) {
|
|
648
|
+
const commands = Array.isArray(node.commands) ? node.commands : [];
|
|
649
|
+
const caps = Array.isArray(node.caps) ? node.caps : [];
|
|
650
|
+
const issues = [];
|
|
651
|
+
if (node.connected !== true) issues.push("offline");
|
|
652
|
+
if (!commands.includes("googlemeet.chrome")) issues.push("missing googlemeet.chrome");
|
|
653
|
+
if (!commands.includes("browser.proxy") && !caps.includes("browser")) issues.push("missing browser.proxy/browser capability");
|
|
654
|
+
return issues;
|
|
655
|
+
}
|
|
656
|
+
async function listGoogleMeetNodes(runtime, params) {
|
|
661
657
|
try {
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
return false;
|
|
658
|
+
return params ? await runtime.nodes.list(params) : await runtime.nodes.list();
|
|
659
|
+
} catch (error) {
|
|
660
|
+
throw new Error("Google Meet node inventory unavailable", { cause: error });
|
|
666
661
|
}
|
|
667
662
|
}
|
|
668
|
-
function
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
663
|
+
async function resolveChromeNodeInfo(params) {
|
|
664
|
+
const requested = params.requestedNode?.trim();
|
|
665
|
+
if (requested) {
|
|
666
|
+
const matches = (await listGoogleMeetNodes(params.runtime)).nodes.filter((node) => matchesRequestedNode(node, requested));
|
|
667
|
+
if (matches.length === 1) {
|
|
668
|
+
const [node] = matches;
|
|
669
|
+
if (isGoogleMeetNode(node)) return node;
|
|
670
|
+
throw new Error(`Configured Google Meet node ${requested} is not usable (${formatNodeLabel(node)}): ${describeNodeUsabilityIssues(node).join("; ")}. Start or reinstall \`openclaw node run\` on that Chrome host, approve pairing, and allow googlemeet.chrome plus browser.proxy.`);
|
|
671
|
+
}
|
|
672
|
+
if (matches.length > 1) throw new Error(`Configured Google Meet node ${requested} is ambiguous (${matches.length} matches). Pin chromeNode.node to a unique node id, display name, or remote IP.`);
|
|
673
|
+
throw new Error(`Configured Google Meet node ${requested} was not found. Run \`openclaw nodes status\` and start or approve the Chrome node.`);
|
|
674
674
|
}
|
|
675
|
+
const nodes = (await listGoogleMeetNodes(params.runtime, { connected: true })).nodes.filter(isGoogleMeetNode);
|
|
676
|
+
if (nodes.length === 0) throw new Error("No connected Google Meet-capable node with browser proxy. Run `openclaw node run` on the Chrome host with browser proxy enabled, approve pairing, and allow googlemeet.chrome plus browser.proxy.");
|
|
677
|
+
if (nodes.length === 1) return nodes[0];
|
|
678
|
+
throw new Error("Multiple Google Meet-capable nodes connected. Set plugins.entries.google-meet.config.chromeNode.node.");
|
|
679
|
+
}
|
|
680
|
+
async function resolveChromeNode(params) {
|
|
681
|
+
const node = await resolveChromeNodeInfo(params);
|
|
682
|
+
if (!node.nodeId) throw new Error("Google Meet node did not include a node id.");
|
|
683
|
+
return node.nodeId;
|
|
684
|
+
}
|
|
685
|
+
function unwrapNodeInvokePayload(raw) {
|
|
686
|
+
const record = raw && typeof raw === "object" ? raw : {};
|
|
687
|
+
if (typeof record.payloadJSON === "string" && record.payloadJSON.trim()) try {
|
|
688
|
+
return JSON.parse(record.payloadJSON);
|
|
689
|
+
} catch (error) {
|
|
690
|
+
throw new Error("Google Meet browser proxy returned malformed payloadJSON.", { cause: error });
|
|
691
|
+
}
|
|
692
|
+
if ("payload" in record) return record.payload;
|
|
693
|
+
return raw;
|
|
694
|
+
}
|
|
695
|
+
function parseBrowserProxyResult(raw) {
|
|
696
|
+
const payload = unwrapNodeInvokePayload(raw);
|
|
697
|
+
const proxy = payload && typeof payload === "object" ? payload : void 0;
|
|
698
|
+
if (!proxy || !("result" in proxy)) throw new Error("Google Meet browser proxy returned an invalid result.");
|
|
699
|
+
return proxy.result;
|
|
700
|
+
}
|
|
701
|
+
async function callBrowserProxyOnNode(params) {
|
|
702
|
+
return parseBrowserProxyResult(await params.runtime.nodes.invoke({
|
|
703
|
+
nodeId: params.nodeId,
|
|
704
|
+
command: "browser.proxy",
|
|
705
|
+
params: {
|
|
706
|
+
method: params.method,
|
|
707
|
+
path: params.path,
|
|
708
|
+
body: params.body,
|
|
709
|
+
timeoutMs: params.timeoutMs
|
|
710
|
+
},
|
|
711
|
+
timeoutMs: addTimerTimeoutGraceMs(params.timeoutMs) ?? 1,
|
|
712
|
+
scopes: ["operator.admin"]
|
|
713
|
+
}));
|
|
714
|
+
}
|
|
715
|
+
function asBrowserTabs(result) {
|
|
716
|
+
const record = result && typeof result === "object" ? result : {};
|
|
717
|
+
return Array.isArray(record.tabs) ? record.tabs : [];
|
|
675
718
|
}
|
|
676
|
-
function
|
|
677
|
-
|
|
678
|
-
if (normalizeMeetUrlForReuse(tab.url)) return true;
|
|
679
|
-
return (tab.url ?? "").startsWith("https://accounts.google.com/") && /sign in|google accounts|meet/i.test(tab.title ?? "");
|
|
719
|
+
function readBrowserTab(result) {
|
|
720
|
+
return result && typeof result === "object" ? result : void 0;
|
|
680
721
|
}
|
|
681
722
|
//#endregion
|
|
682
723
|
//#region extensions/google-meet/src/transports/chrome-create.ts
|
|
@@ -687,7 +728,8 @@ const GOOGLE_MEET_BROWSER_NAVIGATION_RETRY_MS = 1e3;
|
|
|
687
728
|
const GOOGLE_MEET_BROWSER_POLL_MS = 500;
|
|
688
729
|
var GoogleMeetBrowserManualActionError = class extends Error {
|
|
689
730
|
constructor(payload) {
|
|
690
|
-
|
|
731
|
+
const prefix = payload.manualActionReason ? `${payload.manualActionReason}: ` : "";
|
|
732
|
+
super(`${prefix}${payload.manualActionMessage}`);
|
|
691
733
|
this.name = "GoogleMeetBrowserManualActionError";
|
|
692
734
|
this.payload = {
|
|
693
735
|
source: "browser",
|
|
@@ -737,14 +779,6 @@ async function focusBrowserTab(params) {
|
|
|
737
779
|
function readStringArray(value) {
|
|
738
780
|
return Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : void 0;
|
|
739
781
|
}
|
|
740
|
-
function readBrowserManualAction(value) {
|
|
741
|
-
if (!value || typeof value !== "object") return;
|
|
742
|
-
const action = value;
|
|
743
|
-
return typeof action.reason === "string" && typeof action.message === "string" ? {
|
|
744
|
-
reason: action.reason,
|
|
745
|
-
message: action.message
|
|
746
|
-
} : void 0;
|
|
747
|
-
}
|
|
748
782
|
function readBrowserCreateResult(result) {
|
|
749
783
|
const record = result && typeof result === "object" ? result : {};
|
|
750
784
|
const nested = record.result && typeof record.result === "object" ? record.result : record;
|
|
@@ -752,7 +786,8 @@ function readBrowserCreateResult(result) {
|
|
|
752
786
|
meetingUri: typeof nested.meetingUri === "string" ? nested.meetingUri : void 0,
|
|
753
787
|
browserUrl: typeof nested.browserUrl === "string" ? nested.browserUrl : void 0,
|
|
754
788
|
browserTitle: typeof nested.browserTitle === "string" ? nested.browserTitle : void 0,
|
|
755
|
-
manualAction:
|
|
789
|
+
manualAction: typeof nested.manualAction === "string" ? nested.manualAction : void 0,
|
|
790
|
+
manualActionReason: typeof nested.manualActionReason === "string" ? nested.manualActionReason : void 0,
|
|
756
791
|
notes: readStringArray(nested.notes),
|
|
757
792
|
retryAfterMs: typeof nested.retryAfterMs === "number" && Number.isFinite(nested.retryAfterMs) ? nested.retryAfterMs : void 0
|
|
758
793
|
};
|
|
@@ -761,7 +796,6 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
|
|
|
761
796
|
const meetUrlPattern = /^https:\\/\\/meet\\.google\\.com\\/[a-z]{3}-[a-z]{4}-[a-z]{3}(?:$|[/?#])/i;
|
|
762
797
|
const text = (node) => (node?.innerText || node?.textContent || "").trim();
|
|
763
798
|
const current = () => location.href;
|
|
764
|
-
const manualActionFor = (reason, message) => ({ reason, message });
|
|
765
799
|
const notes = [];
|
|
766
800
|
const findButton = (pattern) =>
|
|
767
801
|
[...document.querySelectorAll("button")].find((button) => {
|
|
@@ -785,7 +819,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
|
|
|
785
819
|
};
|
|
786
820
|
if (!current().startsWith("https://meet.google.com/")) {
|
|
787
821
|
return {
|
|
788
|
-
|
|
822
|
+
manualActionReason: "google-login-required",
|
|
823
|
+
manualAction: "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
|
|
789
824
|
browserUrl: current(),
|
|
790
825
|
browserTitle: document.title,
|
|
791
826
|
notes,
|
|
@@ -811,7 +846,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
|
|
|
811
846
|
}
|
|
812
847
|
if (/do you want people to hear you in the meeting/i.test(pageText)) {
|
|
813
848
|
return {
|
|
814
|
-
|
|
849
|
+
manualActionReason: "meet-audio-choice-required",
|
|
850
|
+
manualAction: "Meet is showing the microphone choice. Click Use microphone in the OpenClaw browser profile, then retry meeting creation.",
|
|
815
851
|
browserUrl: href,
|
|
816
852
|
browserTitle: document.title,
|
|
817
853
|
notes,
|
|
@@ -819,7 +855,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
|
|
|
819
855
|
}
|
|
820
856
|
if (/allow.*(microphone|camera)|blocked.*(microphone|camera)|permission.*(microphone|camera)/i.test(pageText)) {
|
|
821
857
|
return {
|
|
822
|
-
|
|
858
|
+
manualActionReason: "meet-permission-required",
|
|
859
|
+
manualAction: "Allow microphone/camera permissions for Meet in the OpenClaw browser profile, then retry meeting creation.",
|
|
823
860
|
browserUrl: href,
|
|
824
861
|
browserTitle: document.title,
|
|
825
862
|
notes,
|
|
@@ -827,7 +864,7 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
|
|
|
827
864
|
}
|
|
828
865
|
if (/couldn't create|unable to create/i.test(pageText)) {
|
|
829
866
|
return {
|
|
830
|
-
manualAction:
|
|
867
|
+
manualAction: "Resolve the Google Meet page prompt in the OpenClaw browser profile, then retry meeting creation.",
|
|
831
868
|
browserUrl: href,
|
|
832
869
|
browserTitle: document.title,
|
|
833
870
|
notes,
|
|
@@ -835,7 +872,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
|
|
|
835
872
|
}
|
|
836
873
|
if (location.hostname.toLowerCase() === "accounts.google.com" || /use your google account|to continue to google meet|choose an account|sign in to (join|continue)/i.test(pageText)) {
|
|
837
874
|
return {
|
|
838
|
-
|
|
875
|
+
manualActionReason: "google-login-required",
|
|
876
|
+
manualAction: "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
|
|
839
877
|
browserUrl: href,
|
|
840
878
|
browserTitle: document.title,
|
|
841
879
|
notes,
|
|
@@ -855,43 +893,25 @@ async function createMeetWithBrowserProxyOnNode(params) {
|
|
|
855
893
|
});
|
|
856
894
|
const timeoutMs = Math.max(GOOGLE_MEET_BROWSER_CREATE_TIMEOUT_MS, params.config.chrome.joinTimeoutMs);
|
|
857
895
|
const stepTimeoutMs = Math.min(timeoutMs, GOOGLE_MEET_BROWSER_STEP_TIMEOUT_MS);
|
|
858
|
-
let openedByPlugin = false;
|
|
859
896
|
let tab = await findGoogleMeetCreateTab({
|
|
860
897
|
runtime: params.runtime,
|
|
861
898
|
nodeId,
|
|
862
899
|
timeoutMs: stepTimeoutMs
|
|
863
900
|
});
|
|
864
|
-
if (tab?.targetId) {
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
body: {
|
|
879
|
-
targetId: tab.targetId,
|
|
880
|
-
url: englishUrl
|
|
881
|
-
},
|
|
882
|
-
timeoutMs: stepTimeoutMs
|
|
883
|
-
})) ?? tab;
|
|
884
|
-
} else {
|
|
885
|
-
tab = readBrowserTab(await callBrowserProxyOnNode({
|
|
886
|
-
runtime: params.runtime,
|
|
887
|
-
nodeId,
|
|
888
|
-
method: "POST",
|
|
889
|
-
path: "/tabs/open",
|
|
890
|
-
body: { url: forceMeetEnglishUi(GOOGLE_MEET_NEW_URL) },
|
|
891
|
-
timeoutMs: stepTimeoutMs
|
|
892
|
-
}));
|
|
893
|
-
openedByPlugin = Boolean(tab?.targetId);
|
|
894
|
-
}
|
|
901
|
+
if (tab?.targetId) await focusBrowserTab({
|
|
902
|
+
runtime: params.runtime,
|
|
903
|
+
nodeId,
|
|
904
|
+
targetId: tab.targetId,
|
|
905
|
+
timeoutMs: stepTimeoutMs
|
|
906
|
+
});
|
|
907
|
+
else tab = readBrowserTab(await callBrowserProxyOnNode({
|
|
908
|
+
runtime: params.runtime,
|
|
909
|
+
nodeId,
|
|
910
|
+
method: "POST",
|
|
911
|
+
path: "/tabs/open",
|
|
912
|
+
body: { url: forceMeetEnglishUi(GOOGLE_MEET_NEW_URL) },
|
|
913
|
+
timeoutMs: stepTimeoutMs
|
|
914
|
+
}));
|
|
895
915
|
const targetId = tab?.targetId;
|
|
896
916
|
if (!targetId) throw new Error("Browser fallback opened Google Meet but did not return a targetId.");
|
|
897
917
|
const notes = /* @__PURE__ */ new Set();
|
|
@@ -917,14 +937,15 @@ async function createMeetWithBrowserProxyOnNode(params) {
|
|
|
917
937
|
source: "browser",
|
|
918
938
|
nodeId,
|
|
919
939
|
targetId,
|
|
920
|
-
openedByPlugin,
|
|
921
940
|
meetingUri: result.meetingUri,
|
|
922
941
|
browserUrl: result.browserUrl,
|
|
923
942
|
browserTitle: result.browserTitle,
|
|
924
943
|
notes: [...notes]
|
|
925
944
|
};
|
|
926
945
|
if (result.manualAction) throw new GoogleMeetBrowserManualActionError({
|
|
927
|
-
|
|
946
|
+
manualActionRequired: true,
|
|
947
|
+
manualActionReason: result.manualActionReason,
|
|
948
|
+
manualActionMessage: result.manualAction,
|
|
928
949
|
browser: {
|
|
929
950
|
nodeId,
|
|
930
951
|
targetId,
|
|
@@ -939,7 +960,7 @@ async function createMeetWithBrowserProxyOnNode(params) {
|
|
|
939
960
|
if (!isBrowserNavigationInterruption(error)) throw error;
|
|
940
961
|
await sleep(GOOGLE_MEET_BROWSER_NAVIGATION_RETRY_MS);
|
|
941
962
|
}
|
|
942
|
-
throw new Error(lastResult?.manualAction
|
|
963
|
+
throw new Error(lastResult?.manualAction ?? `Google Meet did not return a meeting URL from the browser create flow before timeout.${lastError ? ` Last browser automation error: ${formatBrowserAutomationError(lastError)}` : ""}`);
|
|
943
964
|
}
|
|
944
965
|
//#endregion
|
|
945
|
-
export {
|
|
966
|
+
export { fetchLatestGoogleMeetConferenceRecord as _, forceMeetEnglishUi as a, readBrowserTab as c, buildGoogleMeetPreflightReport as d, createGoogleMeetSpace as f, fetchGoogleMeetSpace as g, fetchGoogleMeetAttendance as h, callBrowserProxyOnNode as i, resolveChromeNode as l, fetchGoogleMeetArtifacts as m, isGoogleMeetBrowserManualActionError as n, isSameMeetUrlForReuse as o, endGoogleMeetActiveConference as p, asBrowserTabs as r, normalizeMeetUrlForReuse as s, createMeetWithBrowserProxyOnNode as t, resolveChromeNodeInfo as u };
|