@openclaw/google-meet 2026.10.1 → 2026.10.5-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/.setup/{chrome-create-Bh1L33pr.mjs → chrome-create-CW_QQzuj.mjs} +27 -54
- package/dist/.setup/{cli-export-BOebaVFW.mjs → cli-export-DDUSzhh0.mjs} +31 -25
- package/dist/.setup/{cli-Bfm5LpNM.mjs → cli-vTuiXh8U.mjs} +75 -101
- package/dist/.setup/{create-DyYbmN11.mjs → create-0pfsnISA.mjs} +6 -4
- package/dist/.setup/{google-api-DEZ9mWx7.mjs → google-api-KAOF1Wn5.mjs} +5 -13
- package/dist/.setup/{google-meet-platform-adapter-CKXMbP3X.mjs → google-meet-platform-adapter-Bz77Bdt-.mjs} +2 -3
- package/dist/.setup/{meet-url-BP2Jlvjs.mjs → meet-url-i_QvIxnP.mjs} +2 -6
- package/dist/.setup/{node-host-CyFclhO_.mjs → node-host-BP4g4zw3.mjs} +4 -8
- package/dist/.setup/{node-invoke-policy-BnX3PaH7.mjs → node-invoke-policy-67WaZNPN.mjs} +1 -1
- package/dist/.setup/{oauth-XgdPFWEJ.mjs → oauth-pXa-YQ9H.mjs} +5 -6
- package/dist/.setup/{plugin-helpers-D1OyyzEZ.mjs → plugin-helpers-BhofFtQ0.mjs} +8 -12
- package/dist/.setup/{plugin-registration-BP83dqMw.mjs → plugin-registration-B_Ohay99.mjs} +19 -13
- package/dist/.setup/{runtime-DQgxZ2Na.mjs → runtime-B9xiaF9M.mjs} +25 -61
- package/dist/index.js +64 -91
- package/package.json +4 -4
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import { n as GOOGLE_MEET_NODE_COMMAND } from "./google-meet-platform-constants-CnRfrYX7.mjs";
|
|
2
2
|
import { n as DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND, t as DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND } from "./config-BXGAMntj.mjs";
|
|
3
|
-
import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-
|
|
3
|
+
import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-Bz77Bdt-.mjs";
|
|
4
4
|
import { MeetingPlatformAdapter } from "openclaw/plugin-sdk/meeting-runtime";
|
|
5
5
|
//#region extensions/google-meet/src/node-host.ts
|
|
6
6
|
function normalizeMeetKey(value) {
|
|
7
7
|
if (!value) return;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return /^\/([a-z]{3}-[a-z]{4}-[a-z]{3})(?:$|[/?#])/i.exec(url.pathname)?.[1]?.toLowerCase() ?? value;
|
|
12
|
-
} catch {
|
|
13
|
-
return value;
|
|
14
|
-
}
|
|
8
|
+
const url = URL.parse(value);
|
|
9
|
+
if (url?.hostname.toLowerCase() !== "meet.google.com") return value;
|
|
10
|
+
return /^\/([a-z]{3}-[a-z]{4}-[a-z]{3})(?:$|[/?#])/i.exec(url.pathname)?.[1]?.toLowerCase() ?? value;
|
|
15
11
|
}
|
|
16
12
|
const handleGoogleMeetNodeHostCommand = MeetingPlatformAdapter.createNodeHostHandler({
|
|
17
13
|
commandName: GOOGLE_MEET_NODE_COMMAND,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as GOOGLE_MEET_NODE_COMMAND } from "./google-meet-platform-constants-CnRfrYX7.mjs";
|
|
2
|
-
import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-
|
|
2
|
+
import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-Bz77Bdt-.mjs";
|
|
3
3
|
import { createMeetingBrowserNodeInvokePolicy } from "openclaw/plugin-sdk/meeting-runtime";
|
|
4
4
|
//#region extensions/google-meet/src/node-invoke-policy.ts
|
|
5
5
|
const START_MODES = /* @__PURE__ */ new Set([
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as readGoogleApiErrorDetail } from "./google-api-
|
|
1
|
+
import { t as readGoogleApiErrorDetail } from "./google-api-KAOF1Wn5.mjs";
|
|
2
2
|
import { MAX_DATE_TIMESTAMP_MS, resolveDateTimestampMs, resolveExpiresAtMsFromDurationSeconds } from "openclaw/plugin-sdk/number-runtime";
|
|
3
3
|
import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
|
|
4
4
|
import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
|
|
@@ -19,8 +19,8 @@ const GOOGLE_MEET_SCOPES = [
|
|
|
19
19
|
"https://www.googleapis.com/auth/calendar.events.readonly",
|
|
20
20
|
"https://www.googleapis.com/auth/drive.meet.readonly"
|
|
21
21
|
];
|
|
22
|
-
function resolveGoogleMeetTokenExpiresAt(value
|
|
23
|
-
const now = resolveDateTimestampMs(
|
|
22
|
+
function resolveGoogleMeetTokenExpiresAt(value) {
|
|
23
|
+
const now = resolveDateTimestampMs(Date.now());
|
|
24
24
|
if (typeof value === "number" && Number.isFinite(value) && value <= 0) return now;
|
|
25
25
|
return resolveExpiresAtMsFromDurationSeconds(value, { nowMs: now }) ?? resolveExpiresAtMsFromDurationSeconds(GOOGLE_MEET_DEFAULT_TOKEN_LIFETIME_SECONDS, { nowMs: now }) ?? now;
|
|
26
26
|
}
|
|
@@ -96,9 +96,8 @@ async function refreshGoogleMeetAccessToken(params) {
|
|
|
96
96
|
}));
|
|
97
97
|
}
|
|
98
98
|
function shouldUseCachedGoogleMeetAccessToken(params) {
|
|
99
|
-
const now =
|
|
100
|
-
|
|
101
|
-
return Boolean(params.accessToken?.trim() && typeof params.expiresAt === "number" && Number.isFinite(params.expiresAt) && params.expiresAt <= MAX_DATE_TIMESTAMP_MS && params.expiresAt > now + safetyWindowMs);
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
return Boolean(params.accessToken?.trim() && typeof params.expiresAt === "number" && Number.isFinite(params.expiresAt) && params.expiresAt <= MAX_DATE_TIMESTAMP_MS && params.expiresAt > now + 6e4);
|
|
102
101
|
}
|
|
103
102
|
async function resolveGoogleMeetAccessToken(params) {
|
|
104
103
|
if (shouldUseCachedGoogleMeetAccessToken(params)) return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { m as resolveMeetingInput } from "./plugin-registration-
|
|
2
|
-
import { n as requestGoogleApi } from "./google-api-
|
|
3
|
-
import { t as normalizeMeetUrl } from "./meet-url-
|
|
1
|
+
import { m as resolveMeetingInput } from "./plugin-registration-B_Ohay99.mjs";
|
|
2
|
+
import { n as requestGoogleApi } from "./google-api-KAOF1Wn5.mjs";
|
|
3
|
+
import { t as normalizeMeetUrl } from "./meet-url-i_QvIxnP.mjs";
|
|
4
4
|
import { normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
6
6
|
import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
|
|
@@ -74,13 +74,13 @@ function rankCalendarEvent(event, nowMs) {
|
|
|
74
74
|
}
|
|
75
75
|
async function fetchGoogleCalendarEvents(params) {
|
|
76
76
|
const calendarId = params.calendarId?.trim() || "primary";
|
|
77
|
-
const now =
|
|
77
|
+
const now = /* @__PURE__ */ new Date();
|
|
78
78
|
const defaultTimeMax = new Date(now);
|
|
79
79
|
defaultTimeMax.setDate(defaultTimeMax.getDate() + 7);
|
|
80
80
|
return requestGoogleApi({
|
|
81
81
|
url: `${GOOGLE_CALENDAR_API_BASE_URL}/calendars/${encodeURIComponent(calendarId)}/events`,
|
|
82
82
|
query: {
|
|
83
|
-
maxResults:
|
|
83
|
+
maxResults: 50,
|
|
84
84
|
orderBy: "startTime",
|
|
85
85
|
q: params.eventQuery?.trim() || void 0,
|
|
86
86
|
showDeleted: false,
|
|
@@ -371,11 +371,7 @@ function extractGoogleDriveDocumentId(value) {
|
|
|
371
371
|
if (typeof value !== "string") return;
|
|
372
372
|
const trimmed = value.trim();
|
|
373
373
|
if (!trimmed) return;
|
|
374
|
-
if (/^https?:\/\//i.test(trimmed))
|
|
375
|
-
return new URL(trimmed).pathname.match(/\/document\/d\/([^/]+)/)?.[1];
|
|
376
|
-
} catch {
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
374
|
+
if (/^https?:\/\//i.test(trimmed)) return URL.parse(trimmed)?.pathname.match(/\/document\/d\/([^/]+)/)?.[1];
|
|
379
375
|
return trimmed.split("/").filter(Boolean).at(-1);
|
|
380
376
|
}
|
|
381
377
|
async function exportGoogleDriveDocumentText(params) {
|
|
@@ -602,9 +598,9 @@ var plugin_helpers_exports = /* @__PURE__ */ __exportAll({
|
|
|
602
598
|
resolveMeetingFromParams: () => resolveMeetingFromParams,
|
|
603
599
|
resolveSpaceFromParams: () => resolveSpaceFromParams
|
|
604
600
|
});
|
|
605
|
-
const loadGoogleMeetExportModule = createLazyRuntimeModule(() => import("./cli-export-
|
|
601
|
+
const loadGoogleMeetExportModule = createLazyRuntimeModule(() => import("./cli-export-DDUSzhh0.mjs").then((n) => n.t));
|
|
606
602
|
async function resolveGoogleMeetTokenFromParams(config, raw) {
|
|
607
|
-
const { resolveGoogleMeetAccessToken } = await import("./oauth-
|
|
603
|
+
const { resolveGoogleMeetAccessToken } = await import("./oauth-pXa-YQ9H.mjs");
|
|
608
604
|
return resolveGoogleMeetAccessToken({
|
|
609
605
|
clientId: normalizeOptionalString(raw.clientId) ?? config.oauth.clientId,
|
|
610
606
|
clientSecret: normalizeOptionalString(raw.clientSecret) ?? config.oauth.clientSecret,
|
|
@@ -4,14 +4,13 @@ import { asNonArrayRecord, normalizeOptionalString } from "openclaw/plugin-sdk/s
|
|
|
4
4
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
5
5
|
import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
|
|
6
6
|
//#region extensions/google-meet/src/plugin-registration.ts
|
|
7
|
-
const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-
|
|
8
|
-
const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-
|
|
9
|
-
const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-
|
|
10
|
-
const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-
|
|
11
|
-
const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-
|
|
12
|
-
const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-
|
|
7
|
+
const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-BhofFtQ0.mjs").then((n) => n.i));
|
|
8
|
+
const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-vTuiXh8U.mjs"));
|
|
9
|
+
const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-0pfsnISA.mjs").then((n) => n.n));
|
|
10
|
+
const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-BP4g4zw3.mjs"));
|
|
11
|
+
const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-B9xiaF9M.mjs"));
|
|
12
|
+
const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-67WaZNPN.mjs"));
|
|
13
13
|
const loadGoogleMeetGatewayRuntimeModule = createLazyRuntimeModule(() => import("openclaw/plugin-sdk/gateway-runtime"));
|
|
14
|
-
const loadGoogleMeetNodeInvokePolicy = async (config) => (await loadGoogleMeetNodeInvokePolicyModule()).createGoogleMeetChromeNodeInvokePolicy(config);
|
|
15
14
|
function normalizeTransport(value) {
|
|
16
15
|
return value === "chrome" || value === "chrome-node" || value === "twilio" ? value : void 0;
|
|
17
16
|
}
|
|
@@ -27,8 +26,14 @@ function resolveMeetingInput(config, value) {
|
|
|
27
26
|
function shouldJoinCreatedMeet(raw) {
|
|
28
27
|
return raw.join !== false && raw.join !== "false";
|
|
29
28
|
}
|
|
30
|
-
const googleMeetToolDeps = { platform: () => process.platform };
|
|
31
29
|
const googleMeetGatewayMethods = {
|
|
30
|
+
join: "googlemeet.join",
|
|
31
|
+
create: "googlemeet.create",
|
|
32
|
+
status: "googlemeet.status",
|
|
33
|
+
transcript: "googlemeet.transcript",
|
|
34
|
+
participate: "googlemeet.participate",
|
|
35
|
+
leave: "googlemeet.leave",
|
|
36
|
+
speak: "googlemeet.speak",
|
|
32
37
|
participation_context: "googlemeet.participationContext",
|
|
33
38
|
recover_current_tab: "googlemeet.recoverCurrentTab",
|
|
34
39
|
setup_status: "googlemeet.setup",
|
|
@@ -60,7 +65,7 @@ function readGoogleMeetParticipationParams(raw) {
|
|
|
60
65
|
};
|
|
61
66
|
}
|
|
62
67
|
function assertGoogleMeetAgentToolActionSupported(params) {
|
|
63
|
-
const platform =
|
|
68
|
+
const platform = process.platform;
|
|
64
69
|
if (platform === "darwin" || platform === "linux") return;
|
|
65
70
|
const action = params.raw.action;
|
|
66
71
|
if (action !== "join" && action !== "test_speech" && !(action === "create" && shouldJoinCreatedMeet(params.raw))) return;
|
|
@@ -70,13 +75,14 @@ function assertGoogleMeetAgentToolActionSupported(params) {
|
|
|
70
75
|
throw new Error("Google Meet local Chrome talk-back audio requires macOS with BlackHole 2ch or Linux with PipeWire-Pulse. On this host, use mode: transcribe, transport: twilio, or a supported chrome-node.");
|
|
71
76
|
}
|
|
72
77
|
async function callGoogleMeetGatewayFromTool(params) {
|
|
73
|
-
const method = googleMeetGatewayMethods[params.action]
|
|
78
|
+
const method = googleMeetGatewayMethods[params.action];
|
|
74
79
|
try {
|
|
75
80
|
if (params.runtime) return await params.runtime.gateway.request(method, params.raw, {
|
|
76
81
|
timeoutMs: resolveGoogleMeetGatewayOperationTimeoutMs(params.config),
|
|
77
82
|
scopes: ["operator.admin"]
|
|
78
83
|
});
|
|
79
|
-
|
|
84
|
+
const { callGatewayFromCli } = await loadGoogleMeetGatewayRuntimeModule();
|
|
85
|
+
return await callGatewayFromCli(method, {
|
|
80
86
|
json: true,
|
|
81
87
|
timeout: String(resolveGoogleMeetGatewayOperationTimeoutMs(params.config))
|
|
82
88
|
}, params.raw, {
|
|
@@ -129,7 +135,7 @@ function createGoogleMeetRuntimeAccessor(params) {
|
|
|
129
135
|
return await runtimePromise;
|
|
130
136
|
};
|
|
131
137
|
}
|
|
132
|
-
function createLazyGoogleMeetNodeInvokePolicy(config
|
|
138
|
+
function createLazyGoogleMeetNodeInvokePolicy(config) {
|
|
133
139
|
let policyPromise;
|
|
134
140
|
return {
|
|
135
141
|
commands: [GOOGLE_MEET_NODE_COMMAND],
|
|
@@ -137,7 +143,7 @@ function createLazyGoogleMeetNodeInvokePolicy(config, loadPolicy = loadGoogleMee
|
|
|
137
143
|
async handle(ctx) {
|
|
138
144
|
let policy;
|
|
139
145
|
try {
|
|
140
|
-
policyPromise ??=
|
|
146
|
+
policyPromise ??= loadGoogleMeetNodeInvokePolicyModule().then((module) => module.createGoogleMeetChromeNodeInvokePolicy(config));
|
|
141
147
|
policy = await policyPromise;
|
|
142
148
|
} catch (error) {
|
|
143
149
|
return {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as GOOGLE_MEET_NODE_COMMAND, t as GOOGLE_MEET_BROWSER_NODE_ADAPTER } from "./google-meet-platform-constants-CnRfrYX7.mjs";
|
|
2
|
-
import { t as normalizeMeetUrl } from "./meet-url-
|
|
3
|
-
import { c as callBrowserProxyOnNode, l as resolveChromeNode, u as resolveChromeNodeInfo } from "./chrome-create-
|
|
4
|
-
import { n as normalizeDialInNumber, t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-
|
|
2
|
+
import { t as normalizeMeetUrl } from "./meet-url-i_QvIxnP.mjs";
|
|
3
|
+
import { c as callBrowserProxyOnNode, l as resolveChromeNode, u as resolveChromeNodeInfo } from "./chrome-create-CW_QQzuj.mjs";
|
|
4
|
+
import { n as normalizeDialInNumber, t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-Bz77Bdt-.mjs";
|
|
5
5
|
import { asOptionalRecord, asRecord, normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
6
6
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
7
7
|
import path from "node:path";
|
|
@@ -65,12 +65,8 @@ function resolveUserPath(input) {
|
|
|
65
65
|
return input;
|
|
66
66
|
}
|
|
67
67
|
function isProviderUnreachableWebhookUrl(webhookUrl) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return isBlockedHostnameOrIp(parsed.hostname);
|
|
71
|
-
} catch {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
68
|
+
const parsed = URL.parse(webhookUrl);
|
|
69
|
+
return parsed ? isBlockedHostnameOrIp(parsed.hostname) : false;
|
|
74
70
|
}
|
|
75
71
|
function resolveVoiceCallSetupValue(configured, fallback) {
|
|
76
72
|
return normalizeOptionalString(configured) ?? normalizeOptionalString(fallback);
|
|
@@ -216,13 +212,10 @@ function shouldCaptureCaptions(mode, fullConfig) {
|
|
|
216
212
|
return mode === "transcribe" || !fullConfig || resolveTranscriptsConfig(fullConfig.transcripts).enabled;
|
|
217
213
|
}
|
|
218
214
|
function chromeNodeBrowserRequest(runtime, nodeId) {
|
|
219
|
-
return
|
|
215
|
+
return (request) => callBrowserProxyOnNode({
|
|
216
|
+
...request,
|
|
220
217
|
runtime,
|
|
221
|
-
nodeId
|
|
222
|
-
method: request.method,
|
|
223
|
-
path: request.path,
|
|
224
|
-
body: request.body,
|
|
225
|
-
timeoutMs: request.timeoutMs
|
|
218
|
+
nodeId
|
|
226
219
|
});
|
|
227
220
|
}
|
|
228
221
|
async function leaveChromeMeet(params) {
|
|
@@ -444,26 +437,19 @@ async function joinMeetViaVoiceCallGateway(params) {
|
|
|
444
437
|
//#endregion
|
|
445
438
|
//#region extensions/google-meet/src/runtime.ts
|
|
446
439
|
const nowIso = () => (/* @__PURE__ */ new Date()).toISOString();
|
|
447
|
-
var GoogleMeetRuntime = class {
|
|
448
|
-
#createdBrowserTabs;
|
|
440
|
+
var GoogleMeetRuntime = class extends MeetingSessionRuntime {
|
|
441
|
+
#createdBrowserTabs = /* @__PURE__ */ new Map();
|
|
449
442
|
#voiceCallGateway;
|
|
450
|
-
#sessions;
|
|
451
|
-
reconcileTranscriptPolicy(enabled) {
|
|
452
|
-
return this.#sessions.reconcileTranscriptPolicy(enabled);
|
|
453
|
-
}
|
|
454
443
|
constructor(params) {
|
|
455
|
-
this.params = params;
|
|
456
|
-
this.#createdBrowserTabs = /* @__PURE__ */ new Map();
|
|
457
|
-
this.transcriptSourceRuntime = () => this.#sessions;
|
|
458
444
|
const adapter = GOOGLE_MEET_PLATFORM_ADAPTER;
|
|
459
|
-
|
|
445
|
+
const voiceCallGateway = createVoiceCallGateway(params);
|
|
460
446
|
let participationStore;
|
|
461
447
|
const getParticipationStore = () => participationStore ??= params.runtime.state.openKeyedStore({
|
|
462
448
|
namespace: "meeting-participation",
|
|
463
449
|
maxEntries: 1e4,
|
|
464
450
|
overflowPolicy: "reject-new"
|
|
465
451
|
});
|
|
466
|
-
|
|
452
|
+
super({
|
|
467
453
|
participation: {
|
|
468
454
|
store: {
|
|
469
455
|
entries: async () => await getParticipationStore().entries(),
|
|
@@ -556,21 +542,8 @@ var GoogleMeetRuntime = class {
|
|
|
556
542
|
providerName: "Google Meet"
|
|
557
543
|
}
|
|
558
544
|
});
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
return this.#sessions.list();
|
|
562
|
-
}
|
|
563
|
-
async status(sessionId) {
|
|
564
|
-
return await this.#sessions.status(sessionId);
|
|
565
|
-
}
|
|
566
|
-
participationContext(sessionId) {
|
|
567
|
-
return this.#sessions.participationContext(sessionId);
|
|
568
|
-
}
|
|
569
|
-
participate(sessionId, request) {
|
|
570
|
-
return this.#sessions.participate(sessionId, request);
|
|
571
|
-
}
|
|
572
|
-
async transcript(sessionId, options = {}) {
|
|
573
|
-
return await this.#sessions.transcript(sessionId, options);
|
|
545
|
+
this.params = params;
|
|
546
|
+
this.#voiceCallGateway = voiceCallGateway;
|
|
574
547
|
}
|
|
575
548
|
async setupStatus(options = {}) {
|
|
576
549
|
return await getGoogleMeetRuntimeSetupStatus({
|
|
@@ -600,15 +573,6 @@ var GoogleMeetRuntime = class {
|
|
|
600
573
|
url
|
|
601
574
|
});
|
|
602
575
|
}
|
|
603
|
-
async join(request) {
|
|
604
|
-
return await this.#sessions.join(request);
|
|
605
|
-
}
|
|
606
|
-
async leave(sessionId, options) {
|
|
607
|
-
return await this.#sessions.leave(sessionId, options);
|
|
608
|
-
}
|
|
609
|
-
async speak(sessionId, instructions) {
|
|
610
|
-
return await this.#sessions.speak(sessionId, instructions);
|
|
611
|
-
}
|
|
612
576
|
async testSpeech(request) {
|
|
613
577
|
return await testGoogleMeetSpeech(this.#probeContext(), request);
|
|
614
578
|
}
|
|
@@ -621,10 +585,10 @@ var GoogleMeetRuntime = class {
|
|
|
621
585
|
resolveAgentId: (request) => this.#resolveAgentId(request.agentId),
|
|
622
586
|
list: () => this.list(),
|
|
623
587
|
join: async (request) => await this.join(request),
|
|
624
|
-
isReusable: (session, resolved) => this
|
|
625
|
-
hasHealthHandle: (sessionId) => this
|
|
626
|
-
refreshHealth: (sessionId) => this
|
|
627
|
-
refreshCaptionHealth: async (session) => await this
|
|
588
|
+
isReusable: (session, resolved) => this.isReusableSession(session, resolved),
|
|
589
|
+
hasHealthHandle: (sessionId) => this.hasHealthHandle(sessionId),
|
|
590
|
+
refreshHealth: (sessionId) => this.refreshHealth(sessionId),
|
|
591
|
+
refreshCaptionHealth: async (session) => await this.refreshCaptionHealth(session)
|
|
628
592
|
};
|
|
629
593
|
}
|
|
630
594
|
#resolveAgentId(requestedAgentId) {
|
|
@@ -670,7 +634,7 @@ var GoogleMeetRuntime = class {
|
|
|
670
634
|
const handles = this.#attachChromeAudioBridge(session, result.audioBridge);
|
|
671
635
|
if (handles) context.attachRuntimeHandles(session, handles);
|
|
672
636
|
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 is waiting for verified virtual input/output audio routing." : "Chrome transport joins as the signed-in Google profile without starting the realtime audio bridge.");
|
|
673
|
-
this
|
|
637
|
+
this.refreshSpeechReadiness(session);
|
|
674
638
|
return {};
|
|
675
639
|
}
|
|
676
640
|
const dialPlan = GOOGLE_MEET_PLATFORM_ADAPTER.dialIn.buildPlan({
|
|
@@ -784,17 +748,17 @@ var GoogleMeetRuntime = class {
|
|
|
784
748
|
}
|
|
785
749
|
}
|
|
786
750
|
async #refreshStatus(session) {
|
|
787
|
-
if (isBrowserTransport(session.transport)) await this
|
|
751
|
+
if (isBrowserTransport(session.transport)) await this.refreshBrowserHealth(session, {
|
|
788
752
|
force: true,
|
|
789
753
|
readOnly: true
|
|
790
754
|
});
|
|
791
755
|
else if (session.transport === "twilio") await this.#refreshTwilioVoiceCallStatus(session);
|
|
792
|
-
else this
|
|
756
|
+
else this.refreshSpeechReadiness(session);
|
|
793
757
|
}
|
|
794
758
|
async #refreshTwilioVoiceCallStatus(session) {
|
|
795
759
|
const callId = session.twilio?.voiceCallId;
|
|
796
760
|
if (!callId || session.state !== "active") {
|
|
797
|
-
this
|
|
761
|
+
this.refreshSpeechReadiness(session);
|
|
798
762
|
return;
|
|
799
763
|
}
|
|
800
764
|
try {
|
|
@@ -803,11 +767,11 @@ var GoogleMeetRuntime = class {
|
|
|
803
767
|
callId
|
|
804
768
|
});
|
|
805
769
|
const call = asOptionalRecord(status.call);
|
|
806
|
-
if (status.found === false || call?.endedAt !== void 0 || call?.endReason !== void 0) this
|
|
770
|
+
if (status.found === false || call?.endedAt !== void 0 || call?.endReason !== void 0) this.markSessionEnded(session, "Voice Call is no longer active.");
|
|
807
771
|
} catch (error) {
|
|
808
772
|
this.params.logger.debug?.(`[google-meet] voice-call status refresh ignored: ${formatErrorMessage(error)}`);
|
|
809
773
|
}
|
|
810
|
-
this
|
|
774
|
+
this.refreshSpeechReadiness(session);
|
|
811
775
|
}
|
|
812
776
|
async #speakViaTransport(session, instructions) {
|
|
813
777
|
if (session.transport !== "twilio" || !session.twilio?.voiceCallId) return;
|
|
@@ -819,7 +783,7 @@ var GoogleMeetRuntime = class {
|
|
|
819
783
|
});
|
|
820
784
|
} catch (error) {
|
|
821
785
|
if (!isMeetingVoiceCallMissingError(error)) throw error;
|
|
822
|
-
this
|
|
786
|
+
this.markSessionEnded(session, "Voice Call is no longer active.");
|
|
823
787
|
return {
|
|
824
788
|
handled: true,
|
|
825
789
|
spoken: false
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as GOOGLE_MEET_CLI_DESCRIPTOR } from "./.setup/cli-output-mode-BwH_6tH8.mjs";
|
|
2
2
|
import { n as GOOGLE_MEET_NODE_COMMAND } from "./.setup/google-meet-platform-constants-CnRfrYX7.mjs";
|
|
3
3
|
import { r as resolveGoogleMeetConfig } from "./.setup/config-BXGAMntj.mjs";
|
|
4
|
-
import { a as formatGoogleMeetGatewayError, c as loadGoogleMeetCreateModule, d as normalizeMode, f as normalizeTransport, g as shouldJoinCreatedMeet, h as sendGoogleMeetGatewayError, i as createLazyGoogleMeetNodeInvokePolicy, l as loadGoogleMeetNodeHostModule, m as resolveMeetingInput, n as callGoogleMeetGatewayFromTool, o as keepTrustedToolAgentId, p as readGoogleMeetParticipationParams, r as createGoogleMeetRuntimeAccessor, s as loadGoogleMeetCliModule, t as assertGoogleMeetAgentToolActionSupported, u as loadGoogleMeetPluginHelpers } from "./.setup/plugin-registration-
|
|
4
|
+
import { a as formatGoogleMeetGatewayError, c as loadGoogleMeetCreateModule, d as normalizeMode, f as normalizeTransport, g as shouldJoinCreatedMeet, h as sendGoogleMeetGatewayError, i as createLazyGoogleMeetNodeInvokePolicy, l as loadGoogleMeetNodeHostModule, m as resolveMeetingInput, n as callGoogleMeetGatewayFromTool, o as keepTrustedToolAgentId, p as readGoogleMeetParticipationParams, r as createGoogleMeetRuntimeAccessor, s as loadGoogleMeetCliModule, t as assertGoogleMeetAgentToolActionSupported, u as loadGoogleMeetPluginHelpers } from "./.setup/plugin-registration-B_Ohay99.mjs";
|
|
5
5
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
6
6
|
import { asNonArrayRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
7
7
|
import { jsonResult } from "openclaw/plugin-sdk/tool-results";
|
|
@@ -84,7 +84,7 @@ const GoogleMeetToolSchema = Type.Object({
|
|
|
84
84
|
minimum: 0
|
|
85
85
|
})),
|
|
86
86
|
message: Type.Optional(Type.String({ description: "Realtime instructions to speak now" })),
|
|
87
|
-
timeoutMs: optionalPositiveIntegerSchema({ description: "
|
|
87
|
+
timeoutMs: optionalPositiveIntegerSchema({ description: "Check timeout in milliseconds" }),
|
|
88
88
|
meeting: Type.Optional(Type.String({ description: "Meet URL, meeting code, or spaces/{id}" })),
|
|
89
89
|
today: Type.Optional(Type.Boolean({ description: "For latest, artifacts, or attendance, find a Meet link on today's calendar." })),
|
|
90
90
|
event: Type.Optional(Type.String({ description: "For latest, artifacts, or attendance, find a matching Calendar event." })),
|
|
@@ -108,6 +108,12 @@ const GoogleMeetToolSchema = Type.Object({
|
|
|
108
108
|
});
|
|
109
109
|
//#endregion
|
|
110
110
|
//#region extensions/google-meet/index.ts
|
|
111
|
+
var InvalidGoogleMeetRequest = class extends Error {};
|
|
112
|
+
function requireSessionId(params) {
|
|
113
|
+
const sessionId = normalizeOptionalString(params?.sessionId);
|
|
114
|
+
if (!sessionId) throw new InvalidGoogleMeetRequest("sessionId required");
|
|
115
|
+
return sessionId;
|
|
116
|
+
}
|
|
111
117
|
var google_meet_default = definePluginEntry({
|
|
112
118
|
id: "google-meet",
|
|
113
119
|
name: "Google Meet",
|
|
@@ -122,9 +128,9 @@ var google_meet_default = definePluginEntry({
|
|
|
122
128
|
const registerGatewayMethod = (method, handler) => {
|
|
123
129
|
api.registerGatewayMethod(method, async (options) => {
|
|
124
130
|
try {
|
|
125
|
-
await handler(options);
|
|
131
|
+
options.respond(true, await handler(options));
|
|
126
132
|
} catch (err) {
|
|
127
|
-
sendGoogleMeetGatewayError(options.respond, err);
|
|
133
|
+
sendGoogleMeetGatewayError(options.respond, err, err instanceof InvalidGoogleMeetRequest ? "INVALID_REQUEST" : "UNAVAILABLE");
|
|
128
134
|
}
|
|
129
135
|
});
|
|
130
136
|
};
|
|
@@ -179,131 +185,106 @@ var google_meet_default = definePluginEntry({
|
|
|
179
185
|
return helpers.fetchResolvedGoogleMeetAttendance(await helpers.resolveArtifactQueryFromParams(config, raw));
|
|
180
186
|
}
|
|
181
187
|
};
|
|
182
|
-
const transcriptSourceRuntime = async () => (await ensureRuntime()).transcriptSourceRuntime();
|
|
183
188
|
api.registerTranscriptSourceProvider({
|
|
184
189
|
id: "google-meet",
|
|
185
190
|
aliases: ["googlemeet", "meet"],
|
|
186
191
|
name: "Google Meet",
|
|
187
192
|
sourceKinds: ["live-caption"],
|
|
188
|
-
start: async (request) => await (await
|
|
189
|
-
stop: async (request) => await (await
|
|
193
|
+
start: async (request) => await (await ensureRuntime()).startTranscriptSource(request),
|
|
194
|
+
stop: async (request) => await (await ensureRuntime()).stopTranscriptSource(request)
|
|
190
195
|
});
|
|
191
196
|
registerGatewayMethod("googlemeet.join", async (options) => {
|
|
192
|
-
|
|
193
|
-
options.respond(true, await runtime.join(resolveTrustedJoinParams(options)));
|
|
197
|
+
return (await ensureRuntime()).join(resolveTrustedJoinParams(options));
|
|
194
198
|
});
|
|
195
|
-
registerGatewayMethod("googlemeet.create", async ({ params, client
|
|
199
|
+
registerGatewayMethod("googlemeet.create", async ({ params, client }) => {
|
|
196
200
|
const raw = keepTrustedToolAgentId(asNonArrayRecord(params), client);
|
|
197
201
|
const create = await loadGoogleMeetCreateModule();
|
|
198
|
-
|
|
202
|
+
return shouldJoinCreatedMeet(raw) ? create.createAndJoinMeetFromParams({
|
|
199
203
|
config,
|
|
200
204
|
runtime: api.runtime,
|
|
201
205
|
raw,
|
|
202
206
|
ensureRuntime
|
|
203
|
-
}) :
|
|
207
|
+
}) : create.createMeetFromParams({
|
|
204
208
|
config,
|
|
205
209
|
runtime: api.runtime,
|
|
206
210
|
raw
|
|
207
|
-
})
|
|
211
|
+
});
|
|
208
212
|
});
|
|
209
|
-
registerGatewayMethod("googlemeet.status", async ({ params
|
|
210
|
-
|
|
213
|
+
registerGatewayMethod("googlemeet.status", async ({ params }) => {
|
|
214
|
+
return (await ensureRuntime()).status(normalizeOptionalString(params?.sessionId));
|
|
211
215
|
});
|
|
212
|
-
registerGatewayMethod("googlemeet.transcript", async ({ params
|
|
213
|
-
const sessionId =
|
|
214
|
-
if (!sessionId) {
|
|
215
|
-
sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
216
|
+
registerGatewayMethod("googlemeet.transcript", async ({ params }) => {
|
|
217
|
+
const sessionId = requireSessionId(params);
|
|
218
218
|
const sinceIndex = params?.sinceIndex;
|
|
219
|
-
if (sinceIndex !== void 0 && (typeof sinceIndex !== "number" || !Number.isSafeInteger(sinceIndex) || sinceIndex < 0))
|
|
220
|
-
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
respond(true, await (await ensureRuntime()).transcript(sessionId, sinceIndex === void 0 ? {} : { sinceIndex }));
|
|
219
|
+
if (sinceIndex !== void 0 && (typeof sinceIndex !== "number" || !Number.isSafeInteger(sinceIndex) || sinceIndex < 0)) throw new InvalidGoogleMeetRequest("sinceIndex must be a non-negative safe integer");
|
|
220
|
+
return (await ensureRuntime()).transcript(sessionId, sinceIndex === void 0 ? {} : { sinceIndex });
|
|
224
221
|
});
|
|
225
|
-
registerGatewayMethod("googlemeet.participationContext", async ({ params
|
|
226
|
-
const sessionId =
|
|
227
|
-
|
|
228
|
-
sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
respond(true, (await ensureRuntime()).participationContext(sessionId));
|
|
222
|
+
registerGatewayMethod("googlemeet.participationContext", async ({ params }) => {
|
|
223
|
+
const sessionId = requireSessionId(params);
|
|
224
|
+
return (await ensureRuntime()).participationContext(sessionId);
|
|
232
225
|
});
|
|
233
|
-
registerGatewayMethod("googlemeet.participate", async ({ params
|
|
226
|
+
registerGatewayMethod("googlemeet.participate", async ({ params }) => {
|
|
234
227
|
let parsed;
|
|
235
228
|
try {
|
|
236
229
|
parsed = readGoogleMeetParticipationParams(asNonArrayRecord(params));
|
|
237
230
|
} catch (err) {
|
|
238
|
-
|
|
239
|
-
return;
|
|
231
|
+
throw new InvalidGoogleMeetRequest(formatGoogleMeetGatewayError(err).error);
|
|
240
232
|
}
|
|
241
|
-
|
|
233
|
+
return (await ensureRuntime()).participate(parsed.sessionId, parsed.request);
|
|
242
234
|
});
|
|
243
|
-
registerGatewayMethod("googlemeet.recoverCurrentTab", async ({ params
|
|
244
|
-
|
|
235
|
+
registerGatewayMethod("googlemeet.recoverCurrentTab", async ({ params }) => {
|
|
236
|
+
return (await ensureRuntime()).recoverCurrentTab({
|
|
245
237
|
url: normalizeOptionalString(params?.url),
|
|
246
238
|
transport: normalizeTransport(params?.transport)
|
|
247
|
-
})
|
|
239
|
+
});
|
|
248
240
|
});
|
|
249
|
-
registerGatewayMethod("googlemeet.setup", async ({ params
|
|
250
|
-
|
|
241
|
+
registerGatewayMethod("googlemeet.setup", async ({ params }) => {
|
|
242
|
+
return (await ensureRuntime()).setupStatus({
|
|
251
243
|
transport: normalizeTransport(params?.transport),
|
|
252
244
|
mode: normalizeMode(params?.mode),
|
|
253
245
|
dialInNumber: normalizeOptionalString(params?.dialInNumber)
|
|
254
|
-
})
|
|
246
|
+
});
|
|
255
247
|
});
|
|
256
248
|
for (const [method, action] of [
|
|
257
249
|
["googlemeet.latest", "latest"],
|
|
258
250
|
["googlemeet.calendarEvents", "calendar_events"],
|
|
259
251
|
["googlemeet.artifacts", "artifacts"],
|
|
260
252
|
["googlemeet.attendance", "attendance"]
|
|
261
|
-
]) registerGatewayMethod(method,
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
registerGatewayMethod("googlemeet.export", async ({ params, respond }) => {
|
|
265
|
-
respond(true, await (await loadGoogleMeetPluginHelpers()).exportGoogleMeetBundleFromParams(config, asNonArrayRecord(params)));
|
|
253
|
+
]) registerGatewayMethod(method, ({ params }) => queryActions[action](asNonArrayRecord(params)));
|
|
254
|
+
registerGatewayMethod("googlemeet.export", async ({ params }) => {
|
|
255
|
+
return (await loadGoogleMeetPluginHelpers()).exportGoogleMeetBundleFromParams(config, asNonArrayRecord(params));
|
|
266
256
|
});
|
|
267
|
-
registerGatewayMethod("googlemeet.leave", async ({ params
|
|
268
|
-
const sessionId =
|
|
269
|
-
|
|
270
|
-
sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
respond(true, await (await ensureRuntime()).leave(sessionId));
|
|
257
|
+
registerGatewayMethod("googlemeet.leave", async ({ params }) => {
|
|
258
|
+
const sessionId = requireSessionId(params);
|
|
259
|
+
return (await ensureRuntime()).leave(sessionId);
|
|
274
260
|
});
|
|
275
|
-
registerGatewayMethod("googlemeet.endActiveConference", async ({ params
|
|
261
|
+
registerGatewayMethod("googlemeet.endActiveConference", async ({ params }) => {
|
|
276
262
|
const raw = asNonArrayRecord(params);
|
|
277
263
|
const helpers = await loadGoogleMeetPluginHelpers();
|
|
278
264
|
const token = await helpers.resolveGoogleMeetTokenFromParams(config, raw);
|
|
279
|
-
|
|
265
|
+
return helpers.endGoogleMeetActiveConference({
|
|
280
266
|
accessToken: token.accessToken,
|
|
281
267
|
meeting: resolveMeetingInput(config, raw.meeting)
|
|
282
|
-
})
|
|
268
|
+
});
|
|
283
269
|
});
|
|
284
|
-
registerGatewayMethod("googlemeet.speak", async ({ params
|
|
285
|
-
const sessionId =
|
|
286
|
-
|
|
287
|
-
sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
respond(true, await (await ensureRuntime()).speak(sessionId, normalizeOptionalString(params?.message)));
|
|
270
|
+
registerGatewayMethod("googlemeet.speak", async ({ params }) => {
|
|
271
|
+
const sessionId = requireSessionId(params);
|
|
272
|
+
return (await ensureRuntime()).speak(sessionId, normalizeOptionalString(params?.message));
|
|
291
273
|
});
|
|
292
274
|
registerGatewayMethod("googlemeet.testSpeech", async (options) => {
|
|
293
|
-
|
|
294
|
-
options.respond(true, await runtime.testSpeech(resolveTrustedJoinParams(options)));
|
|
275
|
+
return (await ensureRuntime()).testSpeech(resolveTrustedJoinParams(options));
|
|
295
276
|
});
|
|
296
|
-
registerGatewayMethod("googlemeet.testListen", async ({ params, client
|
|
277
|
+
registerGatewayMethod("googlemeet.testListen", async ({ params, client }) => {
|
|
297
278
|
const trustedParams = keepTrustedToolAgentId(asNonArrayRecord(params), client);
|
|
298
279
|
const runtime = await ensureRuntime();
|
|
299
280
|
const { readPositiveIntegerParam } = await import("openclaw/plugin-sdk/param-readers");
|
|
300
|
-
|
|
281
|
+
return runtime.testListen({
|
|
301
282
|
url: resolveMeetingInput(config, trustedParams.url),
|
|
302
283
|
transport: normalizeTransport(trustedParams.transport),
|
|
303
284
|
mode: normalizeMode(trustedParams.mode),
|
|
304
285
|
agentId: normalizeOptionalString(trustedParams.agentId),
|
|
305
286
|
timeoutMs: readPositiveIntegerParam(trustedParams, "timeoutMs")
|
|
306
|
-
})
|
|
287
|
+
});
|
|
307
288
|
});
|
|
308
289
|
api.registerTool((toolContext) => ({
|
|
309
290
|
name: "google_meet",
|
|
@@ -329,25 +310,19 @@ var google_meet_default = definePluginEntry({
|
|
|
329
310
|
config,
|
|
330
311
|
raw
|
|
331
312
|
});
|
|
313
|
+
let routeRequester = false;
|
|
332
314
|
switch (raw.action) {
|
|
333
315
|
case "join":
|
|
334
316
|
case "create":
|
|
335
317
|
case "test_speech":
|
|
336
|
-
case "test_listen":
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
raw: rawWithRequester,
|
|
340
|
-
runtime: useTrustedRuntime ? api.runtime : void 0
|
|
341
|
-
}));
|
|
318
|
+
case "test_listen":
|
|
319
|
+
routeRequester = true;
|
|
320
|
+
break;
|
|
342
321
|
case "status":
|
|
343
322
|
case "transcript":
|
|
344
323
|
case "recover_current_tab":
|
|
345
324
|
case "setup_status":
|
|
346
|
-
case "end_active_conference":
|
|
347
|
-
config,
|
|
348
|
-
action: raw.action,
|
|
349
|
-
raw
|
|
350
|
-
}));
|
|
325
|
+
case "end_active_conference": break;
|
|
351
326
|
case "resolve_space": {
|
|
352
327
|
const { token: _token, ...result } = await (await loadGoogleMeetPluginHelpers()).resolveSpaceFromParams(config, raw);
|
|
353
328
|
return jsonResult(result);
|
|
@@ -372,22 +347,20 @@ var google_meet_default = definePluginEntry({
|
|
|
372
347
|
}
|
|
373
348
|
case "participate":
|
|
374
349
|
readGoogleMeetParticipationParams(raw);
|
|
375
|
-
|
|
376
|
-
config,
|
|
377
|
-
action: raw.action,
|
|
378
|
-
raw
|
|
379
|
-
}));
|
|
350
|
+
break;
|
|
380
351
|
case "participation_context":
|
|
381
352
|
case "leave":
|
|
382
353
|
case "speak":
|
|
383
354
|
if (!normalizeOptionalString(raw.sessionId)) throw new Error("sessionId required");
|
|
384
|
-
|
|
385
|
-
config,
|
|
386
|
-
action: raw.action,
|
|
387
|
-
raw
|
|
388
|
-
}));
|
|
355
|
+
break;
|
|
389
356
|
default: throw new Error("unknown google_meet action");
|
|
390
357
|
}
|
|
358
|
+
return jsonResult(await callGoogleMeetGatewayFromTool({
|
|
359
|
+
config,
|
|
360
|
+
action: raw.action,
|
|
361
|
+
raw: routeRequester ? rawWithRequester : raw,
|
|
362
|
+
runtime: routeRequester && useTrustedRuntime ? api.runtime : void 0
|
|
363
|
+
}));
|
|
391
364
|
} catch (err) {
|
|
392
365
|
return jsonResult(formatGoogleMeetGatewayError(err));
|
|
393
366
|
}
|