@openclaw/google-meet 2026.8.1 → 2026.8.2

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,7 +1,7 @@
1
- import { a as resolveGoogleMeetTokenFromParams, c as buildGoogleMeetPreflightReport, d as fetchGoogleMeetSpace, f as fetchLatestGoogleMeetConferenceRecord, i as resolveArtifactQueryFromParams, l as createGoogleMeetSpace, m as listGoogleMeetCalendarEvents, n as fetchResolvedGoogleMeetAttendance, o as resolveMeetingFromParams, p as buildGoogleMeetCalendarDayWindow, s as resolveSpaceFromParams, t as fetchResolvedGoogleMeetArtifacts, u as endGoogleMeetActiveConference } from "./plugin-helpers-D4pSK6JM.js";
1
+ import { a as resolveGoogleMeetTokenFromParams, c as buildGoogleMeetPreflightReport, d as fetchGoogleMeetSpace, f as fetchLatestGoogleMeetConferenceRecord, i as resolveArtifactQueryFromParams, l as createGoogleMeetSpace, m as listGoogleMeetCalendarEvents, n as fetchResolvedGoogleMeetAttendance, o as resolveMeetingFromParams, p as buildGoogleMeetCalendarDayWindow, s as resolveSpaceFromParams, t as fetchResolvedGoogleMeetArtifacts, u as endGoogleMeetActiveConference } from "./plugin-helpers-CiAxinMY.js";
2
2
  import { i as resolveGoogleMeetGatewayOperationTimeoutMs } from "./config-wBK8loBb.js";
3
- import { buildGoogleMeetAuthUrl, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-9sUJ68Mw.js";
4
- import { n as hasCreateSpaceConfigInput, r as resolveCreateSpaceConfig } from "./create-B9m2WLts.js";
3
+ import { buildGoogleMeetAuthUrl, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-DgBscjXK.js";
4
+ import { n as hasCreateSpaceConfigInput, r as resolveCreateSpaceConfig } from "./create-Da-nAEHY.js";
5
5
  import { clampTimerTimeoutMs, parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
6
6
  import { callGatewayFromCli, isGatewayClientRequestError, isGatewayTransportError } from "openclaw/plugin-sdk/gateway-runtime";
7
7
  import { generateHexPkceVerifierChallenge } from "openclaw/plugin-sdk/provider-auth";
@@ -139,7 +139,8 @@ async function callGoogleMeetGateway(params) {
139
139
  }
140
140
  function formatDuration(value) {
141
141
  if (value === void 0) return "n/a";
142
- return formatDurationCompact(Math.max(0, Math.round(value / 1e3) * 1e3), {
142
+ const roundedMs = Math.max(0, Math.round(value / 1e3) * 1e3);
143
+ return formatDurationCompact(roundedMs, {
143
144
  showYears: true,
144
145
  spaced: true
145
146
  }) ?? "0ms";
@@ -1326,17 +1327,18 @@ function registerGoogleMeetCli(params) {
1326
1327
  challenge,
1327
1328
  state
1328
1329
  });
1330
+ const code = await waitForGoogleMeetAuthCode({
1331
+ state,
1332
+ manual: Boolean(options.manual),
1333
+ timeoutMs: resolveGoogleMeetOAuthCallbackTimeoutMs(options.timeoutSec),
1334
+ authUrl,
1335
+ promptInput,
1336
+ writeLine: (message) => writeStdoutLine("%s", message)
1337
+ });
1329
1338
  const tokens = await exchangeGoogleMeetAuthCode({
1330
1339
  clientId,
1331
1340
  clientSecret,
1332
- code: await waitForGoogleMeetAuthCode({
1333
- state,
1334
- manual: Boolean(options.manual),
1335
- timeoutMs: resolveGoogleMeetOAuthCallbackTimeoutMs(options.timeoutSec),
1336
- authUrl,
1337
- promptInput,
1338
- writeLine: (message) => writeStdoutLine("%s", message)
1339
- }),
1341
+ code,
1340
1342
  verifier
1341
1343
  });
1342
1344
  if (!tokens.refreshToken) throw new Error("Google OAuth did not return a refresh token. Re-run the flow with consent and offline access.");
@@ -1,5 +1,5 @@
1
- import { h as __exportAll, l as createGoogleMeetSpace } from "./plugin-helpers-D4pSK6JM.js";
2
- import { resolveGoogleMeetAccessToken } from "./oauth-9sUJ68Mw.js";
1
+ import { h as __exportAll, l as createGoogleMeetSpace } from "./plugin-helpers-CiAxinMY.js";
2
+ import { resolveGoogleMeetAccessToken } from "./oauth-DgBscjXK.js";
3
3
  import { t as createMeetWithBrowserProxyOnNode } from "./chrome-create-PKAyxCiL.js";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/google-meet/src/create.ts
@@ -20,7 +20,9 @@ const legacyConfigRules = [{
20
20
  match: hasLegacyGoogleRealtimeProvider
21
21
  }];
22
22
  function migrateGoogleMeetLegacyRealtimeProvider(config) {
23
- const rawRealtime = asNullableRecord(asNullableRecord(asNullableRecord(config.plugins?.entries?.["google-meet"])?.config)?.realtime);
23
+ const rawEntry = asNullableRecord(config.plugins?.entries?.["google-meet"]);
24
+ const rawPluginConfig = asNullableRecord(rawEntry?.config);
25
+ const rawRealtime = asNullableRecord(rawPluginConfig?.realtime);
24
26
  if (!rawRealtime || !hasLegacyGoogleRealtimeProvider(rawRealtime)) return null;
25
27
  const nextConfig = structuredClone(config);
26
28
  const nextPlugins = asNullableRecord(nextConfig.plugins) ?? {};
@@ -1,7 +1,7 @@
1
1
  import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
2
2
  //#region extensions/google-meet/src/google-api-errors.ts
3
3
  const REAUTH_HINT = "Re-run `openclaw googlemeet auth login` and store the refreshed oauth block.";
4
- const GOOGLE_API_ERROR_BODY_LIMIT_BYTES = 8 * 1024;
4
+ const GOOGLE_API_ERROR_BODY_LIMIT_BYTES = 8192;
5
5
  function scopeText(scopes) {
6
6
  return scopes.map((scope) => `\`${scope}\``).join(", ");
7
7
  }
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as GOOGLE_MEET_CLI_DESCRIPTOR } from "./cli-output-mode-BwH_6tH8.js";
2
2
  import { n as GOOGLE_MEET_NODE_COMMAND } from "./google-meet-platform-constants-Bs5iAg3E.js";
3
3
  import { r as resolveGoogleMeetConfig } from "./config-wBK8loBb.js";
4
- import { a as createLazyGoogleMeetNodeInvokePolicy, c as loadGoogleMeetCliModule, d as normalizeMode, f as normalizeTransport, h as shouldJoinCreatedMeet, i as createGoogleMeetRuntimeAccessor, l as loadGoogleMeetNodeHostModule, m as sendGoogleMeetGatewayError, n as assertGoogleMeetAgentToolActionSupported, o as formatGoogleMeetGatewayError, p as resolveMeetingInput, r as callGoogleMeetGatewayFromTool, s as keepTrustedToolAgentId, t as asParamRecord, u as loadGoogleMeetPluginHelpers } from "./plugin-registration-C66CpV-S.js";
4
+ import { a as createLazyGoogleMeetNodeInvokePolicy, c as loadGoogleMeetCliModule, d as normalizeMode, f as normalizeTransport, h as shouldJoinCreatedMeet, i as createGoogleMeetRuntimeAccessor, l as loadGoogleMeetNodeHostModule, m as sendGoogleMeetGatewayError, n as assertGoogleMeetAgentToolActionSupported, o as formatGoogleMeetGatewayError, p as resolveMeetingInput, r as callGoogleMeetGatewayFromTool, s as keepTrustedToolAgentId, t as asParamRecord, u as loadGoogleMeetPluginHelpers } from "./plugin-registration-CeQ3RzYT.js";
5
5
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
6
6
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { jsonResult } from "openclaw/plugin-sdk/tool-results";
@@ -338,7 +338,10 @@ var google_meet_default = definePluginEntry({
338
338
  case "calendar_events":
339
339
  case "artifacts":
340
340
  case "attendance": return jsonResult(await queryActions[raw.action](raw));
341
- case "export": return jsonResult(await (await loadGoogleMeetPluginHelpers()).exportGoogleMeetBundleFromParams(config, raw));
341
+ case "export": {
342
+ const helpers = await loadGoogleMeetPluginHelpers();
343
+ return jsonResult(await helpers.exportGoogleMeetBundleFromParams(config, raw));
344
+ }
342
345
  case "leave":
343
346
  case "speak":
344
347
  if (!normalizeOptionalString(raw.sessionId)) throw new Error("sessionId required");
@@ -1,4 +1,4 @@
1
- import { n as readGoogleApiErrorDetail } from "./google-api-errors-CDUYkIcK.js";
1
+ import { n as readGoogleApiErrorDetail } from "./google-api-errors-BDYXfKRa.js";
2
2
  import { MAX_DATE_TIMESTAMP_MS, resolveDateTimestampMs, resolveExpiresAtMsFromDurationSeconds } from "openclaw/plugin-sdk/number-runtime";
3
3
  import { parseOAuthCallbackInput, waitForLocalOAuthCallback } from "openclaw/plugin-sdk/provider-auth-runtime";
4
4
  import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
@@ -9,7 +9,7 @@ const GOOGLE_MEET_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
9
9
  const GOOGLE_MEET_TOKEN_URL = "https://oauth2.googleapis.com/token";
10
10
  const GOOGLE_MEET_TOKEN_HOST = "oauth2.googleapis.com";
11
11
  const GOOGLE_MEET_DEFAULT_TOKEN_LIFETIME_SECONDS = 3600;
12
- const GOOGLE_OAUTH_TOKEN_JSON_MAX_BYTES = 256 * 1024;
12
+ const GOOGLE_OAUTH_TOKEN_JSON_MAX_BYTES = 262144;
13
13
  const GOOGLE_OAUTH_REQUEST_TIMEOUT_MS = 3e4;
14
14
  const GOOGLE_MEET_SCOPES = [
15
15
  "https://www.googleapis.com/auth/meetings.space.created",
@@ -123,7 +123,8 @@ function isLocalCallbackListenerError(error) {
123
123
  return error.message.includes("EADDRINUSE") || error.message.includes("port") || error.message.includes("listen");
124
124
  }
125
125
  async function readManualGoogleMeetAuthCode(params) {
126
- const parsed = parseOAuthCallbackInput(await params.promptInput("Paste the full redirect URL here: "), {
126
+ const input = await params.promptInput("Paste the full redirect URL here: ");
127
+ const parsed = parseOAuthCallbackInput(input, {
127
128
  missingState: "Missing 'state' parameter. Paste the full redirect URL.",
128
129
  invalidInput: "Paste the full redirect URL, not just the code."
129
130
  });
@@ -1,5 +1,5 @@
1
- import { c as loadGoogleMeetCliModule, p as resolveMeetingInput } from "./plugin-registration-C66CpV-S.js";
2
- import { t as googleApiError } from "./google-api-errors-CDUYkIcK.js";
1
+ import { c as loadGoogleMeetCliModule, p as resolveMeetingInput } from "./plugin-registration-CeQ3RzYT.js";
2
+ import { t as googleApiError } from "./google-api-errors-BDYXfKRa.js";
3
3
  import { t as normalizeMeetUrl } from "./meet-url-BP2Jlvjs.js";
4
4
  import { normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
@@ -87,7 +87,7 @@ function rankCalendarEvent(event, nowMs) {
87
87
  const endMs = parseCalendarEventTime(event.end) ?? startMs;
88
88
  if (startMs <= nowMs && endMs >= nowMs) return 0;
89
89
  if (startMs > nowMs) return startMs - nowMs;
90
- return nowMs - startMs + 720 * 60 * 60 * 1e3;
90
+ return nowMs - startMs + 2592e6;
91
91
  }
92
92
  function chooseBestMeetCalendarEvent(events, now) {
93
93
  const nowMs = now.getTime();
@@ -773,7 +773,7 @@ var plugin_helpers_exports = /* @__PURE__ */ __exportAll({
773
773
  resolveMeetingFromParams: () => resolveMeetingFromParams,
774
774
  resolveSpaceFromParams: () => resolveSpaceFromParams
775
775
  });
776
- const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-B9m2WLts.js").then((n) => n.t));
776
+ const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-Da-nAEHY.js").then((n) => n.t));
777
777
  async function createMeetFromParams(params) {
778
778
  return (await loadGoogleMeetCreateModule()).createMeetFromParams(params);
779
779
  }
@@ -781,7 +781,7 @@ async function createAndJoinMeetFromParams(params) {
781
781
  return (await loadGoogleMeetCreateModule()).createAndJoinMeetFromParams(params);
782
782
  }
783
783
  async function resolveGoogleMeetTokenFromParams(config, raw) {
784
- const { resolveGoogleMeetAccessToken } = await import("./oauth-9sUJ68Mw.js");
784
+ const { resolveGoogleMeetAccessToken } = await import("./oauth-DgBscjXK.js");
785
785
  return resolveGoogleMeetAccessToken({
786
786
  clientId: normalizeOptionalString(raw.clientId) ?? config.oauth.clientId,
787
787
  clientSecret: normalizeOptionalString(raw.clientSecret) ?? config.oauth.clientSecret,
@@ -4,10 +4,10 @@ import { asNonArrayRecord as asParamRecord, normalizeOptionalString } from "open
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-D4pSK6JM.js").then((n) => n.r));
8
- const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-DXn0mn71.js"));
7
+ const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-CiAxinMY.js").then((n) => n.r));
8
+ const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-D8EyxtkZ.js"));
9
9
  const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-BXtXbsMa.js"));
10
- const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-B8d1beHo.js"));
10
+ const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-BP1uG83z.js"));
11
11
  const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-B0gOlLJR.js"));
12
12
  const loadGoogleMeetGatewayRuntimeModule = createLazyRuntimeModule(() => import("openclaw/plugin-sdk/gateway-runtime"));
13
13
  const loadGoogleMeetNodeInvokePolicy = async (config) => (await loadGoogleMeetNodeInvokePolicyModule()).createGoogleMeetChromeNodeInvokePolicy(config);
@@ -71,7 +71,8 @@ function resolveUserPath(input) {
71
71
  }
72
72
  function isProviderUnreachableWebhookUrl(webhookUrl) {
73
73
  try {
74
- return isBlockedHostnameOrIp(new URL(webhookUrl).hostname);
74
+ const parsed = new URL(webhookUrl);
75
+ return isBlockedHostnameOrIp(parsed.hostname);
75
76
  } catch {
76
77
  return false;
77
78
  }
@@ -665,11 +666,12 @@ async function launchChromeMeetOnNode(params) {
665
666
  //#endregion
666
667
  //#region extensions/google-meet/src/runtime-setup.ts
667
668
  function collectChromeAudioCommands(config) {
668
- return uniqueStrings((config.chrome.audioBridgeCommand ? [config.chrome.audioBridgeCommand[0]] : [
669
+ const commands = config.chrome.audioBridgeCommand ? [config.chrome.audioBridgeCommand[0]] : [
669
670
  config.chrome.audioInputCommand?.[0],
670
671
  config.chrome.audioOutputCommand?.[0],
671
672
  config.chrome.bargeInInputCommand?.[0]
672
- ]).filter((value) => Boolean(value?.trim())));
673
+ ];
674
+ return uniqueStrings(commands.filter((value) => Boolean(value?.trim())));
673
675
  }
674
676
  async function commandExists(runtime, command) {
675
677
  return (await runtime.system.runCommandWithTimeout([
@@ -1,4 +1,4 @@
1
- const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\.)*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
1
+ const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\[\x20-\x7e])*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
2
2
  /**
3
3
  * Returns true if the value is an Email
4
4
  * @specification https://datatracker.ietf.org/doc/html/rfc5322
@@ -1,6 +1,9 @@
1
1
  import * as FormatBidi from './format/bidi.mjs';
2
2
  import * as LabelUnicode from './label/unicode.mjs';
3
3
  import * as LabelPuny from './label/puny.mjs';
4
+ // ------------------------------------------------------------------
5
+ // IsLabel
6
+ // ------------------------------------------------------------------
4
7
  function IsValidLabelLength(value) {
5
8
  return value.length > 0 && value.length <= 63;
6
9
  }
@@ -8,9 +11,24 @@ function IsLabel(value) {
8
11
  return IsValidLabelLength(value) && (LabelPuny.IsPunyLabel(value) ||
9
12
  LabelUnicode.IsUnicodeLabel(value));
10
13
  }
14
+ // ------------------------------------------------------------------
15
+ // NormalizeHostname
16
+ //
17
+ // Normalizes a hostname for label validation. Normalizes for NFC
18
+ // such that equivalent codepoint sequences can be uniformly
19
+ // compared. It also removes codepoints that IDNA mapping ignores,
20
+ // and converts full stop variants to ASCII '.' so the hostname can
21
+ // be split into labels.
22
+ // ------------------------------------------------------------------
11
23
  function NormalizeHostname(value) {
12
- return value.normalize('NFC').replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.');
24
+ return value
25
+ .normalize('NFC')
26
+ .replace(/[\u00ad\u034f\u180b-\u180d\u200b\ufe00-\ufe0f\u{e0100}-\u{e01ef}]/gu, '') // RE_IGNORED_MAPPING
27
+ .replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.'); // RE_FULL_STOP_MAPPING
13
28
  }
29
+ // ------------------------------------------------------------------
30
+ // IsIdnHostname
31
+ // ------------------------------------------------------------------
14
32
  export function IsIdnHostname(value) {
15
33
  if (value.length === 0 || value.includes(' '))
16
34
  return false;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.3.16",
4
+ "version": "1.3.17",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/google-meet",
3
- "version": "2026.8.1",
3
+ "version": "2026.8.2",
4
4
  "description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,10 +9,10 @@
9
9
  "type": "module",
10
10
  "dependencies": {
11
11
  "jszip": "3.10.1",
12
- "typebox": "1.3.16"
12
+ "typebox": "1.3.17"
13
13
  },
14
14
  "peerDependencies": {
15
- "openclaw": ">=2026.8.1"
15
+ "openclaw": ">=2026.8.2"
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.8.1"
32
+ "pluginApi": ">=2026.8.2"
33
33
  },
34
34
  "build": {
35
- "openclawVersion": "2026.8.1"
35
+ "openclawVersion": "2026.8.2"
36
36
  },
37
37
  "release": {
38
38
  "publishToClawHub": true,