@openclaw/google-meet 2026.6.11-beta.2 → 2026.7.1-beta.1
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-DWEeDc7N.js → chrome-create-Cf3bQPav.js} +4 -2
- package/dist/{cli-BnEq0tBJ.js → cli-D-HGF-yt.js} +3 -3
- package/dist/{create-C7GxW7BL.js → create-9bdDXOHB.js} +2 -2
- package/dist/index.js +176 -29
- package/dist/{oauth-BzOU5Ztq.js → oauth-DK1mwF2i.js} +32 -15
- package/npm-shrinkwrap.json +3 -3
- package/package.json +4 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { t as googleApiError } from "./google-api-errors-CDUYkIcK.js";
|
|
2
2
|
import { uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
3
3
|
import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
|
|
4
|
+
import { readProviderTextResponse } from "openclaw/plugin-sdk/provider-http";
|
|
4
5
|
import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime";
|
|
5
6
|
import { sleep } from "openclaw/plugin-sdk/runtime-env";
|
|
6
7
|
//#region extensions/google-meet/src/drive.ts
|
|
@@ -40,7 +41,7 @@ async function exportGoogleDriveDocumentText(params) {
|
|
|
40
41
|
prefix: "Google Drive files.export",
|
|
41
42
|
scopes: [GOOGLE_DRIVE_MEET_SCOPE]
|
|
42
43
|
});
|
|
43
|
-
return await response.
|
|
44
|
+
return await readProviderTextResponse(response, "Google Drive files.export");
|
|
44
45
|
} finally {
|
|
45
46
|
await release();
|
|
46
47
|
}
|
|
@@ -698,7 +699,8 @@ async function callBrowserProxyOnNode(params) {
|
|
|
698
699
|
body: params.body,
|
|
699
700
|
timeoutMs: params.timeoutMs
|
|
700
701
|
},
|
|
701
|
-
timeoutMs: addTimerTimeoutGraceMs(params.timeoutMs) ?? 1
|
|
702
|
+
timeoutMs: addTimerTimeoutGraceMs(params.timeoutMs) ?? 1,
|
|
703
|
+
scopes: ["operator.admin"]
|
|
702
704
|
}));
|
|
703
705
|
}
|
|
704
706
|
function asBrowserTabs(result) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as buildGoogleMeetCalendarDayWindow, i as resolveGoogleMeetGatewayOperationTimeoutMs, o as findGoogleMeetCalendarEvent, s as listGoogleMeetCalendarEvents } from "./config-D_YKxh0m.js";
|
|
2
|
-
import { d as createGoogleMeetSpace, f as endGoogleMeetActiveConference, g as fetchLatestGoogleMeetConferenceRecord, h as fetchGoogleMeetSpace, m as fetchGoogleMeetAttendance, p as fetchGoogleMeetArtifacts, u as buildGoogleMeetPreflightReport } from "./chrome-create-
|
|
3
|
-
import { buildGoogleMeetAuthUrl, createGoogleMeetOAuthState, createGoogleMeetPkce, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-
|
|
4
|
-
import { hasCreateSpaceConfigInput, resolveCreateSpaceConfig } from "./create-
|
|
2
|
+
import { d as createGoogleMeetSpace, f as endGoogleMeetActiveConference, g as fetchLatestGoogleMeetConferenceRecord, h as fetchGoogleMeetSpace, m as fetchGoogleMeetAttendance, p as fetchGoogleMeetArtifacts, u as buildGoogleMeetPreflightReport } from "./chrome-create-Cf3bQPav.js";
|
|
3
|
+
import { buildGoogleMeetAuthUrl, createGoogleMeetOAuthState, createGoogleMeetPkce, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-DK1mwF2i.js";
|
|
4
|
+
import { hasCreateSpaceConfigInput, resolveCreateSpaceConfig } from "./create-9bdDXOHB.js";
|
|
5
5
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
6
6
|
import { callGatewayFromCli } from "openclaw/plugin-sdk/gateway-runtime";
|
|
7
7
|
import { clampTimerTimeoutMs, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { d as createGoogleMeetSpace, t as createMeetWithBrowserProxyOnNode } from "./chrome-create-
|
|
2
|
-
import { resolveGoogleMeetAccessToken } from "./oauth-
|
|
1
|
+
import { d as createGoogleMeetSpace, t as createMeetWithBrowserProxyOnNode } from "./chrome-create-Cf3bQPav.js";
|
|
2
|
+
import { resolveGoogleMeetAccessToken } from "./oauth-DK1mwF2i.js";
|
|
3
3
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
4
|
//#region extensions/google-meet/src/create.ts
|
|
5
5
|
function normalizeTransport(value) {
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as buildGoogleMeetCalendarDayWindow, 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-D_YKxh0m.js";
|
|
2
|
-
import { a as isSameMeetUrlForReuse, c as resolveChromeNode, f as endGoogleMeetActiveConference, g as fetchLatestGoogleMeetConferenceRecord, h as fetchGoogleMeetSpace, i as callBrowserProxyOnNode, l as resolveChromeNodeInfo, m as fetchGoogleMeetAttendance, n as isGoogleMeetBrowserManualActionError, o as normalizeMeetUrlForReuse, p as fetchGoogleMeetArtifacts, r as asBrowserTabs, s as readBrowserTab, t as createMeetWithBrowserProxyOnNode, u as buildGoogleMeetPreflightReport } from "./chrome-create-
|
|
2
|
+
import { a as isSameMeetUrlForReuse, c as resolveChromeNode, f as endGoogleMeetActiveConference, g as fetchLatestGoogleMeetConferenceRecord, h as fetchGoogleMeetSpace, i as callBrowserProxyOnNode, l as resolveChromeNodeInfo, m as fetchGoogleMeetAttendance, n as isGoogleMeetBrowserManualActionError, o as normalizeMeetUrlForReuse, p as fetchGoogleMeetArtifacts, r as asBrowserTabs, s as readBrowserTab, t as createMeetWithBrowserProxyOnNode, u as buildGoogleMeetPreflightReport } from "./chrome-create-Cf3bQPav.js";
|
|
3
3
|
import { optionalPositiveIntegerSchema, readPositiveIntegerParam } from "openclaw/plugin-sdk/channel-actions";
|
|
4
4
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
5
5
|
import { ErrorCodes, GatewayClient, callGatewayFromCli, errorShape, startGatewayClientWhenEventLoopReady } from "openclaw/plugin-sdk/gateway-runtime";
|
|
@@ -31,10 +31,10 @@ function readStringArray(value) {
|
|
|
31
31
|
const result = value.filter((entry) => typeof entry === "string" && entry.length > 0);
|
|
32
32
|
return result.length > 0 ? result : void 0;
|
|
33
33
|
}
|
|
34
|
-
function asRecord$
|
|
34
|
+
function asRecord$3(value) {
|
|
35
35
|
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
36
36
|
}
|
|
37
|
-
function readString$
|
|
37
|
+
function readString$2(value) {
|
|
38
38
|
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
39
39
|
}
|
|
40
40
|
function formatErrorMessage$1(error) {
|
|
@@ -155,7 +155,7 @@ function terminateChild(child) {
|
|
|
155
155
|
}, 2e3).unref?.();
|
|
156
156
|
}
|
|
157
157
|
async function pullAudio(params) {
|
|
158
|
-
const bridgeId = readString$
|
|
158
|
+
const bridgeId = readString$2(params.bridgeId);
|
|
159
159
|
if (!bridgeId) throw new Error("bridgeId required");
|
|
160
160
|
const session = sessions.get(bridgeId);
|
|
161
161
|
if (!session) throw new Error(`unknown bridgeId: ${bridgeId}`);
|
|
@@ -171,8 +171,8 @@ async function pullAudio(params) {
|
|
|
171
171
|
};
|
|
172
172
|
}
|
|
173
173
|
function pushAudio(params) {
|
|
174
|
-
const bridgeId = readString$
|
|
175
|
-
const base64 = readString$
|
|
174
|
+
const bridgeId = readString$2(params.bridgeId);
|
|
175
|
+
const base64 = readString$2(params.base64);
|
|
176
176
|
if (!bridgeId || !base64) throw new Error("bridgeId and base64 required");
|
|
177
177
|
const session = sessions.get(bridgeId);
|
|
178
178
|
if (!session || session.closed) throw new Error(`bridge is not open: ${bridgeId}`);
|
|
@@ -191,7 +191,7 @@ function pushAudio(params) {
|
|
|
191
191
|
};
|
|
192
192
|
}
|
|
193
193
|
function clearAudio(params) {
|
|
194
|
-
const bridgeId = readString$
|
|
194
|
+
const bridgeId = readString$2(params.bridgeId);
|
|
195
195
|
if (!bridgeId) throw new Error("bridgeId required");
|
|
196
196
|
const session = sessions.get(bridgeId);
|
|
197
197
|
if (!session || session.closed) throw new Error(`bridge is not open: ${bridgeId}`);
|
|
@@ -209,10 +209,10 @@ function clearAudio(params) {
|
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
211
|
function startChrome(params) {
|
|
212
|
-
const url = readString$
|
|
212
|
+
const url = readString$2(params.url);
|
|
213
213
|
if (!url) throw new Error("url required");
|
|
214
214
|
const timeoutMs = readNumber(params.joinTimeoutMs, 3e4);
|
|
215
|
-
const mode = readString$
|
|
215
|
+
const mode = readString$2(params.mode);
|
|
216
216
|
let bridgeId;
|
|
217
217
|
let audioBridge;
|
|
218
218
|
if (mode === "agent" || mode === "bidi" || mode === "realtime") {
|
|
@@ -242,11 +242,11 @@ function startChrome(params) {
|
|
|
242
242
|
const argv = [
|
|
243
243
|
"open",
|
|
244
244
|
"-a",
|
|
245
|
-
"Google Chrome"
|
|
245
|
+
"Google Chrome",
|
|
246
|
+
url
|
|
246
247
|
];
|
|
247
|
-
const browserProfile = readString$
|
|
248
|
+
const browserProfile = readString$2(params.browserProfile);
|
|
248
249
|
if (browserProfile) argv.push("--args", `--profile-directory=${browserProfile}`);
|
|
249
|
-
argv.push(url);
|
|
250
250
|
const result = runCommandWithTimeout(argv, timeoutMs);
|
|
251
251
|
if (result.code !== 0) {
|
|
252
252
|
if (bridgeId) {
|
|
@@ -268,7 +268,7 @@ function startChrome(params) {
|
|
|
268
268
|
};
|
|
269
269
|
}
|
|
270
270
|
function bridgeStatus(params) {
|
|
271
|
-
const bridgeId = readString$
|
|
271
|
+
const bridgeId = readString$2(params.bridgeId);
|
|
272
272
|
const session = bridgeId ? sessions.get(bridgeId) : void 0;
|
|
273
273
|
return { bridge: session ? {
|
|
274
274
|
bridgeId,
|
|
@@ -311,15 +311,15 @@ function summarizeSession(session) {
|
|
|
311
311
|
};
|
|
312
312
|
}
|
|
313
313
|
function listSessions(params) {
|
|
314
|
-
const urlKey = normalizeMeetKey(readString$
|
|
315
|
-
const mode = readString$
|
|
314
|
+
const urlKey = normalizeMeetKey(readString$2(params.url));
|
|
315
|
+
const mode = readString$2(params.mode);
|
|
316
316
|
return { bridges: [...sessions.values()].filter((session) => !session.closed).filter((session) => !urlKey || normalizeMeetKey(session.url) === urlKey).filter((session) => !mode || session.mode === mode).map(summarizeSession) };
|
|
317
317
|
}
|
|
318
318
|
function stopSessionsByUrl(params) {
|
|
319
|
-
const urlKey = normalizeMeetKey(readString$
|
|
319
|
+
const urlKey = normalizeMeetKey(readString$2(params.url));
|
|
320
320
|
if (!urlKey) throw new Error("url required");
|
|
321
|
-
const mode = readString$
|
|
322
|
-
const exceptBridgeId = readString$
|
|
321
|
+
const mode = readString$2(params.mode);
|
|
322
|
+
const exceptBridgeId = readString$2(params.exceptBridgeId);
|
|
323
323
|
let stopped = 0;
|
|
324
324
|
for (const [bridgeId, session] of sessions) {
|
|
325
325
|
if (exceptBridgeId && bridgeId === exceptBridgeId) continue;
|
|
@@ -336,7 +336,7 @@ function stopSessionsByUrl(params) {
|
|
|
336
336
|
};
|
|
337
337
|
}
|
|
338
338
|
function stopChrome(params) {
|
|
339
|
-
const bridgeId = readString$
|
|
339
|
+
const bridgeId = readString$2(params.bridgeId);
|
|
340
340
|
if (!bridgeId) return {
|
|
341
341
|
ok: true,
|
|
342
342
|
stopped: false
|
|
@@ -360,8 +360,8 @@ async function handleGoogleMeetNodeHostCommand(paramsJSON) {
|
|
|
360
360
|
} catch {
|
|
361
361
|
throw new Error("Google Meet node host received malformed params JSON.");
|
|
362
362
|
}
|
|
363
|
-
const params = asRecord$
|
|
364
|
-
const action = readString$
|
|
363
|
+
const params = asRecord$3(raw);
|
|
364
|
+
const action = readString$2(params.action);
|
|
365
365
|
let result;
|
|
366
366
|
switch (action) {
|
|
367
367
|
case "setup":
|
|
@@ -1575,10 +1575,10 @@ async function startCommandRealtimeAudioBridge(params) {
|
|
|
1575
1575
|
}
|
|
1576
1576
|
//#endregion
|
|
1577
1577
|
//#region extensions/google-meet/src/realtime-node.ts
|
|
1578
|
-
function asRecord$
|
|
1578
|
+
function asRecord$2(value) {
|
|
1579
1579
|
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
1580
1580
|
}
|
|
1581
|
-
function readString(value) {
|
|
1581
|
+
function readString$1(value) {
|
|
1582
1582
|
return typeof value === "string" && value.trim() ? value : void 0;
|
|
1583
1583
|
}
|
|
1584
1584
|
function normalizeGoogleMeetTtsPromptText(text) {
|
|
@@ -1609,10 +1609,10 @@ function startGoogleMeetNodeAudioInputLoop(params) {
|
|
|
1609
1609
|
},
|
|
1610
1610
|
timeoutMs: 2e3
|
|
1611
1611
|
});
|
|
1612
|
-
const result = asRecord$
|
|
1612
|
+
const result = asRecord$2(asRecord$2(raw).payload ?? raw);
|
|
1613
1613
|
consecutiveInputErrors = 0;
|
|
1614
1614
|
lastInputError = void 0;
|
|
1615
|
-
const base64 = readString(result.base64);
|
|
1615
|
+
const base64 = readString$1(result.base64);
|
|
1616
1616
|
if (base64) {
|
|
1617
1617
|
const audio = Buffer.from(base64, "base64");
|
|
1618
1618
|
if (params.isInputSuppressed()) {
|
|
@@ -3721,15 +3721,160 @@ var GoogleMeetRuntime = class {
|
|
|
3721
3721
|
}
|
|
3722
3722
|
};
|
|
3723
3723
|
//#endregion
|
|
3724
|
+
//#region extensions/google-meet/src/node-invoke-policy.ts
|
|
3725
|
+
const GOOGLE_MEET_CHROME_NODE_COMMAND = "googlemeet.chrome";
|
|
3726
|
+
const START_MODES = new Set([
|
|
3727
|
+
"agent",
|
|
3728
|
+
"bidi",
|
|
3729
|
+
"realtime",
|
|
3730
|
+
"transcribe"
|
|
3731
|
+
]);
|
|
3732
|
+
function asRecord$1(value) {
|
|
3733
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
3734
|
+
}
|
|
3735
|
+
function readString(value) {
|
|
3736
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
3737
|
+
}
|
|
3738
|
+
function readPositiveNumber(value) {
|
|
3739
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
|
|
3740
|
+
}
|
|
3741
|
+
function copyCommand(command) {
|
|
3742
|
+
return command && command.length > 0 ? [...command] : void 0;
|
|
3743
|
+
}
|
|
3744
|
+
function denied(message, code = "GOOGLE_MEET_NODE_POLICY_DENIED") {
|
|
3745
|
+
return {
|
|
3746
|
+
ok: false,
|
|
3747
|
+
code,
|
|
3748
|
+
message
|
|
3749
|
+
};
|
|
3750
|
+
}
|
|
3751
|
+
function approved(params) {
|
|
3752
|
+
return {
|
|
3753
|
+
approved: true,
|
|
3754
|
+
params
|
|
3755
|
+
};
|
|
3756
|
+
}
|
|
3757
|
+
function buildStartParams(params, config) {
|
|
3758
|
+
let url;
|
|
3759
|
+
try {
|
|
3760
|
+
url = normalizeMeetUrl(params.url);
|
|
3761
|
+
} catch (error) {
|
|
3762
|
+
return {
|
|
3763
|
+
approved: false,
|
|
3764
|
+
result: denied(error instanceof Error ? error.message : "googlemeet.chrome start requires url")
|
|
3765
|
+
};
|
|
3766
|
+
}
|
|
3767
|
+
const mode = readString(params.mode);
|
|
3768
|
+
if (mode && !START_MODES.has(mode)) return {
|
|
3769
|
+
approved: false,
|
|
3770
|
+
result: denied(`googlemeet.chrome start mode is unsupported: ${mode}`)
|
|
3771
|
+
};
|
|
3772
|
+
const startParams = {
|
|
3773
|
+
action: "start",
|
|
3774
|
+
url,
|
|
3775
|
+
launch: params.launch === false ? false : config.chrome.launch,
|
|
3776
|
+
browserProfile: config.chrome.browserProfile,
|
|
3777
|
+
joinTimeoutMs: config.chrome.joinTimeoutMs
|
|
3778
|
+
};
|
|
3779
|
+
if (mode) startParams.mode = mode;
|
|
3780
|
+
const audioInputCommand = copyCommand(config.chrome.audioInputCommand);
|
|
3781
|
+
if (audioInputCommand) startParams.audioInputCommand = audioInputCommand;
|
|
3782
|
+
const audioOutputCommand = copyCommand(config.chrome.audioOutputCommand);
|
|
3783
|
+
if (audioOutputCommand) startParams.audioOutputCommand = audioOutputCommand;
|
|
3784
|
+
const audioBridgeCommand = copyCommand(config.chrome.audioBridgeCommand);
|
|
3785
|
+
if (audioBridgeCommand) startParams.audioBridgeCommand = audioBridgeCommand;
|
|
3786
|
+
const audioBridgeHealthCommand = copyCommand(config.chrome.audioBridgeHealthCommand);
|
|
3787
|
+
if (audioBridgeHealthCommand) startParams.audioBridgeHealthCommand = audioBridgeHealthCommand;
|
|
3788
|
+
return approved(startParams);
|
|
3789
|
+
}
|
|
3790
|
+
function buildForwardParams(params) {
|
|
3791
|
+
const action = readString(params.action);
|
|
3792
|
+
switch (action) {
|
|
3793
|
+
case "setup": return { action };
|
|
3794
|
+
case "status": {
|
|
3795
|
+
const bridgeId = readString(params.bridgeId);
|
|
3796
|
+
return bridgeId ? {
|
|
3797
|
+
action,
|
|
3798
|
+
bridgeId
|
|
3799
|
+
} : { action };
|
|
3800
|
+
}
|
|
3801
|
+
case "list": {
|
|
3802
|
+
const forwarded = { action };
|
|
3803
|
+
const url = readString(params.url);
|
|
3804
|
+
const mode = readString(params.mode);
|
|
3805
|
+
if (url) forwarded.url = url;
|
|
3806
|
+
if (mode) forwarded.mode = mode;
|
|
3807
|
+
return forwarded;
|
|
3808
|
+
}
|
|
3809
|
+
case "stopByUrl": {
|
|
3810
|
+
const forwarded = { action };
|
|
3811
|
+
const url = readString(params.url);
|
|
3812
|
+
const mode = readString(params.mode);
|
|
3813
|
+
const exceptBridgeId = readString(params.exceptBridgeId);
|
|
3814
|
+
if (url) forwarded.url = url;
|
|
3815
|
+
if (mode) forwarded.mode = mode;
|
|
3816
|
+
if (exceptBridgeId) forwarded.exceptBridgeId = exceptBridgeId;
|
|
3817
|
+
return forwarded;
|
|
3818
|
+
}
|
|
3819
|
+
case "pullAudio": {
|
|
3820
|
+
const forwarded = { action };
|
|
3821
|
+
const bridgeId = readString(params.bridgeId);
|
|
3822
|
+
const timeoutMs = readPositiveNumber(params.timeoutMs);
|
|
3823
|
+
if (bridgeId) forwarded.bridgeId = bridgeId;
|
|
3824
|
+
if (timeoutMs) forwarded.timeoutMs = timeoutMs;
|
|
3825
|
+
return forwarded;
|
|
3826
|
+
}
|
|
3827
|
+
case "pushAudio": {
|
|
3828
|
+
const forwarded = { action };
|
|
3829
|
+
const bridgeId = readString(params.bridgeId);
|
|
3830
|
+
const base64 = readString(params.base64);
|
|
3831
|
+
if (bridgeId) forwarded.bridgeId = bridgeId;
|
|
3832
|
+
if (base64) forwarded.base64 = base64;
|
|
3833
|
+
return forwarded;
|
|
3834
|
+
}
|
|
3835
|
+
case "clearAudio":
|
|
3836
|
+
case "stop": {
|
|
3837
|
+
const bridgeId = readString(params.bridgeId);
|
|
3838
|
+
return bridgeId ? {
|
|
3839
|
+
action,
|
|
3840
|
+
bridgeId
|
|
3841
|
+
} : { action };
|
|
3842
|
+
}
|
|
3843
|
+
default: return null;
|
|
3844
|
+
}
|
|
3845
|
+
}
|
|
3846
|
+
function createGoogleMeetChromeNodeInvokePolicy(config) {
|
|
3847
|
+
return {
|
|
3848
|
+
commands: [GOOGLE_MEET_CHROME_NODE_COMMAND],
|
|
3849
|
+
dangerous: true,
|
|
3850
|
+
async handle(ctx) {
|
|
3851
|
+
if (ctx.command !== "googlemeet.chrome") return denied(`unsupported Google Meet node command: ${ctx.command}`);
|
|
3852
|
+
const params = asRecord$1(ctx.params);
|
|
3853
|
+
const action = readString(params.action);
|
|
3854
|
+
let decision;
|
|
3855
|
+
if (action === "start") decision = buildStartParams(params, config);
|
|
3856
|
+
else {
|
|
3857
|
+
const forwardParams = buildForwardParams(params);
|
|
3858
|
+
decision = forwardParams ? approved(forwardParams) : {
|
|
3859
|
+
approved: false,
|
|
3860
|
+
result: denied("unsupported googlemeet.chrome action")
|
|
3861
|
+
};
|
|
3862
|
+
}
|
|
3863
|
+
if (!decision.approved) return decision.result;
|
|
3864
|
+
return await ctx.invokeNode({ params: decision.params });
|
|
3865
|
+
}
|
|
3866
|
+
};
|
|
3867
|
+
}
|
|
3868
|
+
//#endregion
|
|
3724
3869
|
//#region extensions/google-meet/index.ts
|
|
3725
3870
|
let googleMeetCreateModulePromise = null;
|
|
3726
3871
|
let googleMeetCliModulePromise = null;
|
|
3727
3872
|
const loadGoogleMeetCreateModule = async () => {
|
|
3728
|
-
googleMeetCreateModulePromise ??= import("./create-
|
|
3873
|
+
googleMeetCreateModulePromise ??= import("./create-9bdDXOHB.js");
|
|
3729
3874
|
return await googleMeetCreateModulePromise;
|
|
3730
3875
|
};
|
|
3731
3876
|
const loadGoogleMeetCliModule = async () => {
|
|
3732
|
-
googleMeetCliModulePromise ??= import("./cli-
|
|
3877
|
+
googleMeetCliModulePromise ??= import("./cli-D-HGF-yt.js");
|
|
3733
3878
|
return await googleMeetCliModulePromise;
|
|
3734
3879
|
};
|
|
3735
3880
|
const googleMeetConfigSchema = {
|
|
@@ -4102,7 +4247,7 @@ async function createAndJoinMeetFromParams(params) {
|
|
|
4102
4247
|
return (await loadGoogleMeetCreateModule()).createAndJoinMeetFromParams(params);
|
|
4103
4248
|
}
|
|
4104
4249
|
async function resolveGoogleMeetTokenFromParams(config, raw) {
|
|
4105
|
-
const { resolveGoogleMeetAccessToken } = await import("./oauth-
|
|
4250
|
+
const { resolveGoogleMeetAccessToken } = await import("./oauth-DK1mwF2i.js");
|
|
4106
4251
|
return resolveGoogleMeetAccessToken({
|
|
4107
4252
|
clientId: normalizeOptionalString(raw.clientId) ?? config.oauth.clientId,
|
|
4108
4253
|
clientSecret: normalizeOptionalString(raw.clientSecret) ?? config.oauth.clientSecret,
|
|
@@ -4602,10 +4747,12 @@ var google_meet_default = definePluginEntry({
|
|
|
4602
4747
|
}
|
|
4603
4748
|
}), { name: "google_meet" });
|
|
4604
4749
|
api.registerNodeHostCommand({
|
|
4605
|
-
command:
|
|
4750
|
+
command: GOOGLE_MEET_CHROME_NODE_COMMAND,
|
|
4606
4751
|
cap: "google-meet",
|
|
4752
|
+
dangerous: true,
|
|
4607
4753
|
handle: handleGoogleMeetNodeHostCommand
|
|
4608
4754
|
});
|
|
4755
|
+
api.registerNodeInvokePolicy(createGoogleMeetChromeNodeInvokePolicy(config));
|
|
4609
4756
|
api.registerCli(async ({ program }) => {
|
|
4610
4757
|
const { registerGoogleMeetCli } = await loadGoogleMeetCliModule();
|
|
4611
4758
|
registerGoogleMeetCli({
|
|
@@ -124,25 +124,42 @@ function createGoogleMeetPkce() {
|
|
|
124
124
|
function createGoogleMeetOAuthState() {
|
|
125
125
|
return generateOAuthState();
|
|
126
126
|
}
|
|
127
|
+
function isLocalCallbackListenerError(error) {
|
|
128
|
+
if (!(error instanceof Error)) return false;
|
|
129
|
+
return error.message.includes("EADDRINUSE") || error.message.includes("port") || error.message.includes("listen");
|
|
130
|
+
}
|
|
131
|
+
async function readManualGoogleMeetAuthCode(params) {
|
|
132
|
+
const parsed = parseOAuthCallbackInput(await params.promptInput("Paste the full redirect URL here: "), {
|
|
133
|
+
missingState: "Missing 'state' parameter. Paste the full redirect URL.",
|
|
134
|
+
invalidInput: "Paste the full redirect URL, not just the code."
|
|
135
|
+
});
|
|
136
|
+
if ("error" in parsed) throw new Error(parsed.error);
|
|
137
|
+
if (parsed.state !== params.state) throw new Error("OAuth state mismatch - please try again");
|
|
138
|
+
return parsed.code;
|
|
139
|
+
}
|
|
127
140
|
async function waitForGoogleMeetAuthCode(params) {
|
|
128
141
|
params.writeLine(`Open this URL in your browser:\n\n${params.authUrl}\n`);
|
|
129
|
-
if (params.manual) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
142
|
+
if (params.manual) return await readManualGoogleMeetAuthCode({
|
|
143
|
+
state: params.state,
|
|
144
|
+
promptInput: params.promptInput
|
|
145
|
+
});
|
|
146
|
+
try {
|
|
147
|
+
return (await waitForLocalOAuthCallback({
|
|
148
|
+
expectedState: params.state,
|
|
149
|
+
timeoutMs: params.timeoutMs,
|
|
150
|
+
port: 8085,
|
|
151
|
+
callbackPath: "/oauth2callback",
|
|
152
|
+
redirectUri: GOOGLE_MEET_REDIRECT_URI,
|
|
153
|
+
successTitle: "Google Meet OAuth complete"
|
|
154
|
+
})).code;
|
|
155
|
+
} catch (error) {
|
|
156
|
+
if (!isLocalCallbackListenerError(error)) throw error;
|
|
157
|
+
params.writeLine("Local callback server failed. Switching to manual mode...");
|
|
158
|
+
return await readManualGoogleMeetAuthCode({
|
|
159
|
+
state: params.state,
|
|
160
|
+
promptInput: params.promptInput
|
|
133
161
|
});
|
|
134
|
-
if ("error" in parsed) throw new Error(parsed.error);
|
|
135
|
-
if (parsed.state !== params.state) throw new Error("OAuth state mismatch - please try again");
|
|
136
|
-
return parsed.code;
|
|
137
162
|
}
|
|
138
|
-
return (await waitForLocalOAuthCallback({
|
|
139
|
-
expectedState: params.state,
|
|
140
|
-
timeoutMs: params.timeoutMs,
|
|
141
|
-
port: 8085,
|
|
142
|
-
callbackPath: "/oauth2callback",
|
|
143
|
-
redirectUri: GOOGLE_MEET_REDIRECT_URI,
|
|
144
|
-
successTitle: "Google Meet OAuth complete"
|
|
145
|
-
})).code;
|
|
146
163
|
}
|
|
147
164
|
//#endregion
|
|
148
165
|
export { buildGoogleMeetAuthUrl, createGoogleMeetOAuthState, createGoogleMeetPkce, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode };
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/google-meet",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.7.1-beta.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@openclaw/google-meet",
|
|
9
|
-
"version": "2026.
|
|
9
|
+
"version": "2026.7.1-beta.1",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"commander": "14.0.3",
|
|
12
12
|
"typebox": "1.1.39"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"openclaw": ">=2026.
|
|
15
|
+
"openclaw": ">=2026.7.1-beta.1"
|
|
16
16
|
},
|
|
17
17
|
"peerDependenciesMeta": {
|
|
18
18
|
"openclaw": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/google-meet",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.7.1-beta.1",
|
|
4
4
|
"description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"typebox": "1.1.39"
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"openclaw": ">=2026.
|
|
15
|
+
"openclaw": ">=2026.7.1-beta.1"
|
|
16
16
|
},
|
|
17
17
|
"peerDependenciesMeta": {
|
|
18
18
|
"openclaw": {
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"minHostVersion": ">=2026.4.20"
|
|
30
30
|
},
|
|
31
31
|
"compat": {
|
|
32
|
-
"pluginApi": ">=2026.
|
|
32
|
+
"pluginApi": ">=2026.7.1-beta.1"
|
|
33
33
|
},
|
|
34
34
|
"build": {
|
|
35
|
-
"openclawVersion": "2026.
|
|
35
|
+
"openclawVersion": "2026.7.1-beta.1"
|
|
36
36
|
},
|
|
37
37
|
"release": {
|
|
38
38
|
"publishToClawHub": true,
|