@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.
@@ -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.text();
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-DWEeDc7N.js";
3
- import { buildGoogleMeetAuthUrl, createGoogleMeetOAuthState, createGoogleMeetPkce, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-BzOU5Ztq.js";
4
- import { hasCreateSpaceConfigInput, resolveCreateSpaceConfig } from "./create-C7GxW7BL.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-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-DWEeDc7N.js";
2
- import { resolveGoogleMeetAccessToken } from "./oauth-BzOU5Ztq.js";
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-DWEeDc7N.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-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$2(value) {
34
+ function asRecord$3(value) {
35
35
  return value && typeof value === "object" && !Array.isArray(value) ? value : {};
36
36
  }
37
- function readString$1(value) {
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$1(params.bridgeId);
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$1(params.bridgeId);
175
- const base64 = readString$1(params.base64);
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$1(params.bridgeId);
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$1(params.url);
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$1(params.mode);
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$1(params.browserProfile);
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$1(params.bridgeId);
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$1(params.url));
315
- const mode = readString$1(params.mode);
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$1(params.url));
319
+ const urlKey = normalizeMeetKey(readString$2(params.url));
320
320
  if (!urlKey) throw new Error("url required");
321
- const mode = readString$1(params.mode);
322
- const exceptBridgeId = readString$1(params.exceptBridgeId);
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$1(params.bridgeId);
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$2(raw);
364
- const action = readString$1(params.action);
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$1(value) {
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$1(asRecord$1(raw).payload ?? raw);
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-C7GxW7BL.js");
3873
+ googleMeetCreateModulePromise ??= import("./create-9bdDXOHB.js");
3729
3874
  return await googleMeetCreateModulePromise;
3730
3875
  };
3731
3876
  const loadGoogleMeetCliModule = async () => {
3732
- googleMeetCliModulePromise ??= import("./cli-BnEq0tBJ.js");
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-BzOU5Ztq.js");
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: "googlemeet.chrome",
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
- const parsed = parseOAuthCallbackInput(await params.promptInput("Paste the full redirect URL here: "), {
131
- missingState: "Missing 'state' parameter. Paste the full redirect URL.",
132
- invalidInput: "Paste the full redirect URL, not just the code."
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 };
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@openclaw/google-meet",
3
- "version": "2026.6.11-beta.2",
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.6.11-beta.2",
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.6.11-beta.2"
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.6.11-beta.2",
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.6.11-beta.2"
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.6.11-beta.2"
32
+ "pluginApi": ">=2026.7.1-beta.1"
33
33
  },
34
34
  "build": {
35
- "openclawVersion": "2026.6.11-beta.2"
35
+ "openclawVersion": "2026.7.1-beta.1"
36
36
  },
37
37
  "release": {
38
38
  "publishToClawHub": true,