@openclaw/google-meet 2026.9.6 → 2026.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/.setup/{chrome-create-BZRBHJp9.mjs → chrome-create-wuAK5Pnq.mjs} +14 -19
  3. package/dist/.setup/{cli-CbxqjjTC.mjs → cli-DVDq0TFu.mjs} +27 -695
  4. package/dist/.setup/cli-export-D4IM6KLJ.mjs +632 -0
  5. package/dist/.setup/config-BXGAMntj.mjs +240 -0
  6. package/dist/.setup/{create-CG9Pgwsb.mjs → create-UrHOmnWb.mjs} +4 -17
  7. package/dist/.setup/{google-meet-platform-adapter-DQZ74Kd5.mjs → google-meet-platform-adapter-gosgbMIM.mjs} +337 -228
  8. package/dist/.setup/{google-meet-platform-constants-Bs5iAg3E.mjs → google-meet-platform-constants-CnRfrYX7.mjs} +1 -4
  9. package/dist/.setup/{node-host-BUrsParx.mjs → node-host-Tr7Mx3da.mjs} +3 -3
  10. package/dist/.setup/{node-invoke-policy-hwXq9MfV.mjs → node-invoke-policy-Dd3krTYV.mjs} +2 -2
  11. package/dist/.setup/{oauth-22Ey-zCb.mjs → oauth-BoyruWcS.mjs} +2 -2
  12. package/dist/.setup/{plugin-helpers--7X3icub.mjs → plugin-helpers-CdQ_YNA7.mjs} +147 -236
  13. package/dist/.setup/{plugin-registration-B3LXKV4R.mjs → plugin-registration-aCEuCerg.mjs} +34 -10
  14. package/dist/.setup/{runtime-BuIZ5e3V.mjs → runtime-BdiF53A2.mjs} +85 -41
  15. package/dist/doctor-contract-api.js +3 -6
  16. package/dist/index.js +48 -12
  17. package/node_modules/typebox/build/compile/code.mjs +1 -2
  18. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  19. package/node_modules/typebox/build/format/iri.mjs +16 -9
  20. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  21. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  22. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  23. package/node_modules/typebox/build/guard/index.mjs +6 -0
  24. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  25. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  26. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  27. package/node_modules/typebox/build/schema/build.mjs +2 -3
  28. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  29. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  30. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  31. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  32. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  33. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  34. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  35. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  36. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  37. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  38. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  39. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  40. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  41. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  42. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  43. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  44. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  45. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  46. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  47. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  48. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  49. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  50. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  51. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  52. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  53. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  54. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  55. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  56. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  57. package/node_modules/typebox/package.json +1 -1
  58. package/node_modules/typebox/readme.md +3 -1
  59. package/package.json +5 -5
  60. package/dist/.setup/config-C-6enWkx.mjs +0 -328
  61. package/dist/.setup/google-api-errors-BDYXfKRa.mjs +0 -17
  62. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
@@ -0,0 +1,240 @@
1
+ import { asBoolean, asRecord, normalizeOptionalLowercaseString, normalizeOptionalString, normalizeOptionalTrimmedStringList, parseBooleanValue, readStringValue } from "openclaw/plugin-sdk/string-coerce-runtime";
2
+ import { addTimerTimeoutGraceMs, asPositiveFiniteNumber, resolvePositiveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
3
+ import { REALTIME_VOICE_AGENT_CONSULT_TOOL_NAME, resolveRealtimeVoiceAgentConsultToolPolicy } from "openclaw/plugin-sdk/realtime-voice";
4
+ //#region extensions/google-meet/src/config.ts
5
+ function resolveGoogleMeetGatewayOperationTimeoutMs(config) {
6
+ return Math.max(6e4, addTimerTimeoutGraceMs(config.chrome.joinTimeoutMs, 3e4) ?? 1, addTimerTimeoutGraceMs(config.voiceCall.requestTimeoutMs, 1e4) ?? 1);
7
+ }
8
+ const SOX_DEFAULT_BUFFER_BYTES = 8192;
9
+ const SOX_MIN_BUFFER_BYTES = 17;
10
+ const DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES = SOX_DEFAULT_BUFFER_BYTES / 2;
11
+ const PLAIN_DECIMAL_NUMBER_RE = /^\d+(?:\.\d+)?$/;
12
+ function buildGoogleMeetAudioCommands(backend, format, bufferBytes) {
13
+ const pipeWire = backend === "pipewire-pulse" || backend === "auto" && process.platform === "linux";
14
+ const sampleRate = format === "g711-ulaw-8khz" ? 8e3 : 24e3;
15
+ const bits = format === "g711-ulaw-8khz" ? 8 : 16;
16
+ if (pipeWire) {
17
+ const pulseFormat = format === "g711-ulaw-8khz" ? "ulaw" : "s16le";
18
+ const latencyMs = Math.max(1, Math.ceil(bufferBytes / (sampleRate * Math.ceil(bits / 8)) * 1e3));
19
+ const common = [
20
+ "--device=openclaw_meeting_audio",
21
+ `--format=${pulseFormat}`,
22
+ `--rate=${sampleRate}`,
23
+ "--channels=1",
24
+ `--latency-msec=${latencyMs}`
25
+ ];
26
+ return {
27
+ inputCommand: [
28
+ "parec",
29
+ "--raw",
30
+ ...common
31
+ ],
32
+ outputCommand: [
33
+ "pacat",
34
+ "--raw",
35
+ "--playback",
36
+ ...common
37
+ ]
38
+ };
39
+ }
40
+ const wire = format === "g711-ulaw-8khz" ? [
41
+ "-t",
42
+ "raw",
43
+ "-r",
44
+ "8000",
45
+ "-c",
46
+ "1",
47
+ "-e",
48
+ "mu-law",
49
+ "-b",
50
+ "8",
51
+ "-"
52
+ ] : [
53
+ "-t",
54
+ "raw",
55
+ "-r",
56
+ "24000",
57
+ "-c",
58
+ "1",
59
+ "-e",
60
+ "signed-integer",
61
+ "-b",
62
+ "16",
63
+ "-L",
64
+ "-"
65
+ ];
66
+ const withBuffer = (executable, args) => [
67
+ executable,
68
+ "-q",
69
+ "--buffer",
70
+ String(bufferBytes),
71
+ ...args
72
+ ];
73
+ return {
74
+ inputCommand: withBuffer("sox", [
75
+ "-t",
76
+ "coreaudio",
77
+ "BlackHole 2ch",
78
+ ...wire
79
+ ]),
80
+ outputCommand: withBuffer("sox", [
81
+ ...wire,
82
+ "-t",
83
+ "coreaudio",
84
+ "BlackHole 2ch"
85
+ ])
86
+ };
87
+ }
88
+ const DEFAULT_GOOGLE_MEET_AUDIO_COMMANDS = buildGoogleMeetAudioCommands("blackhole-2ch", "pcm16-24khz", DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES);
89
+ const DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND = DEFAULT_GOOGLE_MEET_AUDIO_COMMANDS.inputCommand;
90
+ const DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND = DEFAULT_GOOGLE_MEET_AUDIO_COMMANDS.outputCommand;
91
+ const DEFAULT_GOOGLE_MEET_REALTIME_INSTRUCTIONS = `You are joining a private Google Meet as an OpenClaw voice transport. Keep spoken replies brief and natural. In agent mode, wait for OpenClaw consult results and speak them exactly. In bidi mode, answer directly and call ${REALTIME_VOICE_AGENT_CONSULT_TOOL_NAME} for deeper reasoning, current information, or tools.`;
92
+ const DEFAULT_GOOGLE_MEET_REALTIME_INTRO_MESSAGE = "Say exactly: I'm here and listening.";
93
+ function resolveOptionalNumber(value) {
94
+ if (typeof value === "number" && Number.isFinite(value)) return value;
95
+ if (typeof value === "string" && value.trim()) {
96
+ const trimmed = value.trim();
97
+ const parsed = PLAIN_DECIMAL_NUMBER_RE.test(trimmed) ? Number(trimmed) : NaN;
98
+ return Number.isFinite(parsed) ? parsed : void 0;
99
+ }
100
+ }
101
+ function readGoogleMeetEnv(env, name) {
102
+ return normalizeOptionalString(env[name]) ?? normalizeOptionalString(env[name.slice(9)]);
103
+ }
104
+ function resolveProvidersConfig(value) {
105
+ const raw = asRecord(value);
106
+ const providers = {};
107
+ for (const [key, entry] of Object.entries(raw)) {
108
+ const providerId = normalizeOptionalLowercaseString(key);
109
+ if (!providerId) continue;
110
+ providers[providerId] = asRecord(entry);
111
+ }
112
+ return providers;
113
+ }
114
+ function resolveTransport(value, fallback) {
115
+ const normalized = normalizeOptionalLowercaseString(value);
116
+ return normalized === "chrome" || normalized === "chrome-node" || normalized === "twilio" ? normalized : fallback;
117
+ }
118
+ function resolveMode(value, fallback) {
119
+ const normalized = normalizeOptionalLowercaseString(value);
120
+ if (normalized === "realtime") return "agent";
121
+ return normalized === "agent" || normalized === "bidi" || normalized === "transcribe" ? normalized : fallback;
122
+ }
123
+ function resolveRealtimeStrategy(value, fallback) {
124
+ const normalized = normalizeOptionalLowercaseString(value);
125
+ return normalized === "agent" || normalized === "bidi" ? normalized : fallback;
126
+ }
127
+ function resolveChromeAudioFormat(value) {
128
+ switch (normalizeOptionalString(value)?.toLowerCase().replaceAll("_", "-")) {
129
+ case "pcm16-24khz":
130
+ case "pcm16-24k":
131
+ case "pcm24":
132
+ case "pcm": return "pcm16-24khz";
133
+ case "g711-ulaw-8khz":
134
+ case "g711-ulaw-8k":
135
+ case "g711-ulaw":
136
+ case "mulaw":
137
+ case "mu-law": return "g711-ulaw-8khz";
138
+ default: return;
139
+ }
140
+ }
141
+ function resolveAudioBufferBytes(value, fallback) {
142
+ return Math.max(SOX_MIN_BUFFER_BYTES, Math.trunc(asPositiveFiniteNumber(value) ?? fallback));
143
+ }
144
+ function resolveAudioBackend(value) {
145
+ const normalized = normalizeOptionalLowercaseString(value)?.replaceAll("_", "-");
146
+ return normalized === "blackhole-2ch" || normalized === "pipewire-pulse" ? normalized : "auto";
147
+ }
148
+ function resolveGoogleMeetConfig(input) {
149
+ const env = process.env;
150
+ const raw = asRecord(input);
151
+ const defaults = asRecord(raw.defaults);
152
+ const preview = asRecord(raw.preview);
153
+ const chrome = asRecord(raw.chrome);
154
+ const configuredAudioInputCommand = normalizeOptionalTrimmedStringList(chrome.audioInputCommand);
155
+ const configuredAudioOutputCommand = normalizeOptionalTrimmedStringList(chrome.audioOutputCommand);
156
+ const hasCustomAudioCommand = configuredAudioInputCommand !== void 0 || configuredAudioOutputCommand !== void 0;
157
+ const audioFormat = resolveChromeAudioFormat(chrome.audioFormat) ?? (hasCustomAudioCommand ? "g711-ulaw-8khz" : "pcm16-24khz");
158
+ const audioBufferBytes = resolveAudioBufferBytes(chrome.audioBufferBytes, DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES);
159
+ const audioBackend = resolveAudioBackend(chrome.audioBackend);
160
+ const audioCommands = buildGoogleMeetAudioCommands(audioBackend, audioFormat, audioBufferBytes);
161
+ const chromeNode = asRecord(raw.chromeNode);
162
+ const twilio = asRecord(raw.twilio);
163
+ const voiceCall = asRecord(raw.voiceCall);
164
+ const realtime = asRecord(raw.realtime);
165
+ const realtimeProvider = normalizeOptionalString(realtime.provider);
166
+ const resolvedRealtimeProvider = realtimeProvider ?? "openai";
167
+ const oauth = asRecord(raw.oauth);
168
+ const auth = asRecord(raw.auth);
169
+ return {
170
+ enabled: asBoolean(raw.enabled) ?? true,
171
+ defaults: { meeting: normalizeOptionalString(defaults.meeting) ?? readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING") },
172
+ preview: { enrollmentAcknowledged: asBoolean(preview.enrollmentAcknowledged) ?? parseBooleanValue(readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_PREVIEW_ACK")) ?? false },
173
+ defaultTransport: resolveTransport(raw.defaultTransport, "chrome"),
174
+ defaultMode: resolveMode(raw.defaultMode, "agent"),
175
+ chrome: {
176
+ audioBackend,
177
+ audioFormat,
178
+ audioBufferBytes,
179
+ launch: asBoolean(chrome.launch) ?? true,
180
+ browserProfile: normalizeOptionalString(chrome.browserProfile),
181
+ guestName: normalizeOptionalString(chrome.guestName) ?? "OpenClaw Agent",
182
+ reuseExistingTab: asBoolean(chrome.reuseExistingTab) ?? true,
183
+ autoJoin: asBoolean(chrome.autoJoin) ?? true,
184
+ joinTimeoutMs: resolvePositiveTimerTimeoutMs(chrome.joinTimeoutMs, 3e4),
185
+ waitForInCallMs: resolvePositiveTimerTimeoutMs(chrome.waitForInCallMs, 2e4),
186
+ audioInputCommand: configuredAudioInputCommand ?? audioCommands.inputCommand,
187
+ audioOutputCommand: configuredAudioOutputCommand ?? audioCommands.outputCommand,
188
+ audioInputCommandOverride: configuredAudioInputCommand,
189
+ audioOutputCommandOverride: configuredAudioOutputCommand,
190
+ bargeInInputCommand: normalizeOptionalTrimmedStringList(chrome.bargeInInputCommand),
191
+ bargeInRmsThreshold: asPositiveFiniteNumber(chrome.bargeInRmsThreshold) ?? 650,
192
+ bargeInPeakThreshold: asPositiveFiniteNumber(chrome.bargeInPeakThreshold) ?? 2500,
193
+ bargeInCooldownMs: resolvePositiveTimerTimeoutMs(chrome.bargeInCooldownMs, 900),
194
+ audioBridgeCommand: normalizeOptionalTrimmedStringList(chrome.audioBridgeCommand),
195
+ audioBridgeHealthCommand: normalizeOptionalTrimmedStringList(chrome.audioBridgeHealthCommand)
196
+ },
197
+ chromeNode: { node: normalizeOptionalString(chromeNode.node) },
198
+ twilio: {
199
+ defaultDialInNumber: normalizeOptionalString(twilio.defaultDialInNumber),
200
+ defaultPin: normalizeOptionalString(twilio.defaultPin),
201
+ defaultDtmfSequence: normalizeOptionalString(twilio.defaultDtmfSequence)
202
+ },
203
+ voiceCall: {
204
+ enabled: asBoolean(voiceCall.enabled) ?? true,
205
+ gatewayUrl: normalizeOptionalString(voiceCall.gatewayUrl),
206
+ token: normalizeOptionalString(voiceCall.token),
207
+ requestTimeoutMs: resolvePositiveTimerTimeoutMs(voiceCall.requestTimeoutMs, 3e4),
208
+ dtmfDelayMs: resolvePositiveTimerTimeoutMs(voiceCall.dtmfDelayMs, 12e3),
209
+ postDtmfSpeechDelayMs: resolvePositiveTimerTimeoutMs(voiceCall.postDtmfSpeechDelayMs, 5e3),
210
+ introMessage: normalizeOptionalString(voiceCall.introMessage)
211
+ },
212
+ realtime: {
213
+ strategy: resolveRealtimeStrategy(realtime.strategy, "agent"),
214
+ provider: resolvedRealtimeProvider,
215
+ transcriptionProvider: normalizeOptionalString(realtime.transcriptionProvider) ?? (realtimeProvider && realtimeProvider !== "google" ? resolvedRealtimeProvider : "openai"),
216
+ voiceProvider: normalizeOptionalString(realtime.voiceProvider),
217
+ model: normalizeOptionalString(realtime.model),
218
+ instructions: normalizeOptionalString(realtime.instructions) ?? DEFAULT_GOOGLE_MEET_REALTIME_INSTRUCTIONS,
219
+ introMessage: readStringValue(realtime.introMessage)?.trim() ?? DEFAULT_GOOGLE_MEET_REALTIME_INTRO_MESSAGE,
220
+ agentId: normalizeOptionalString(realtime.agentId),
221
+ toolPolicy: resolveRealtimeVoiceAgentConsultToolPolicy(realtime.toolPolicy, "safe-read-only"),
222
+ providers: resolveProvidersConfig(realtime.providers)
223
+ },
224
+ oauth: {
225
+ clientId: normalizeOptionalString(oauth.clientId) ?? normalizeOptionalString(auth.clientId) ?? readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_CLIENT_ID"),
226
+ clientSecret: normalizeOptionalString(oauth.clientSecret) ?? normalizeOptionalString(auth.clientSecret) ?? readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_CLIENT_SECRET"),
227
+ refreshToken: normalizeOptionalString(oauth.refreshToken) ?? readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN"),
228
+ accessToken: normalizeOptionalString(oauth.accessToken) ?? readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN"),
229
+ expiresAt: resolveOptionalNumber(oauth.expiresAt) ?? resolveOptionalNumber(readGoogleMeetEnv(env, "OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT"))
230
+ },
231
+ auth: {
232
+ provider: "google-oauth",
233
+ clientId: normalizeOptionalString(auth.clientId),
234
+ clientSecret: normalizeOptionalString(auth.clientSecret),
235
+ tokenPath: normalizeOptionalString(auth.tokenPath)
236
+ }
237
+ };
238
+ }
239
+ //#endregion
240
+ export { resolveGoogleMeetGatewayOperationTimeoutMs as i, DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND as n, resolveGoogleMeetConfig as r, DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND as t };
@@ -1,6 +1,6 @@
1
- import { h as __exportAll, l as createGoogleMeetSpace } from "./plugin-helpers--7X3icub.mjs";
2
- import { resolveGoogleMeetAccessToken } from "./oauth-22Ey-zCb.mjs";
3
- import { t as createMeetWithBrowserProxyOnNode } from "./chrome-create-BZRBHJp9.mjs";
1
+ import { _ as __exportAll, o as resolveGoogleMeetTokenFromParams, u as createGoogleMeetSpace } from "./plugin-helpers-CdQ_YNA7.mjs";
2
+ import { d as normalizeTransport, u as normalizeMode } from "./plugin-registration-aCEuCerg.mjs";
3
+ import { t as createMeetWithBrowserProxyOnNode } from "./chrome-create-wuAK5Pnq.mjs";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/google-meet/src/create.ts
6
6
  var create_exports = /* @__PURE__ */ __exportAll({
@@ -9,13 +9,6 @@ var create_exports = /* @__PURE__ */ __exportAll({
9
9
  hasCreateSpaceConfigInput: () => hasCreateSpaceConfigInput,
10
10
  resolveCreateSpaceConfig: () => resolveCreateSpaceConfig
11
11
  });
12
- function normalizeTransport(value) {
13
- return value === "chrome" || value === "chrome-node" || value === "twilio" ? value : void 0;
14
- }
15
- function normalizeMode(value) {
16
- if (value === "realtime") return "agent";
17
- return value === "agent" || value === "bidi" || value === "transcribe" ? value : void 0;
18
- }
19
12
  function normalizeGoogleMeetAccessType(value) {
20
13
  const normalized = normalizeOptionalString(value)?.toUpperCase().replaceAll("-", "_");
21
14
  return normalized === "OPEN" || normalized === "TRUSTED" || normalized === "RESTRICTED" ? normalized : void 0;
@@ -41,13 +34,7 @@ function hasCreateSpaceConfigInput(raw) {
41
34
  return normalizeOptionalString(raw.accessType) !== void 0 || normalizeOptionalString(raw.entryPointAccess) !== void 0;
42
35
  }
43
36
  async function createSpaceFromParams(config, raw) {
44
- const token = await resolveGoogleMeetAccessToken({
45
- clientId: normalizeOptionalString(raw.clientId) ?? config.oauth.clientId,
46
- clientSecret: normalizeOptionalString(raw.clientSecret) ?? config.oauth.clientSecret,
47
- refreshToken: normalizeOptionalString(raw.refreshToken) ?? config.oauth.refreshToken,
48
- accessToken: normalizeOptionalString(raw.accessToken) ?? config.oauth.accessToken,
49
- expiresAt: typeof raw.expiresAt === "number" ? raw.expiresAt : config.oauth.expiresAt
50
- });
37
+ const token = await resolveGoogleMeetTokenFromParams(config, raw);
51
38
  return {
52
39
  source: "api",
53
40
  token,