@openclaw/google-meet 2026.8.1-beta.3 → 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.
Files changed (134) hide show
  1. package/dist/{cli-Bd63VJ5q.js → cli-D8EyxtkZ.js} +25 -20
  2. package/dist/{create-BEDHM6uL.js → create-Da-nAEHY.js} +2 -2
  3. package/dist/doctor-contract-api.js +3 -1
  4. package/dist/{google-api-errors-CDUYkIcK.js → google-api-errors-BDYXfKRa.js} +1 -1
  5. package/dist/index.js +5 -2
  6. package/dist/{oauth-9sUJ68Mw.js → oauth-DgBscjXK.js} +4 -3
  7. package/dist/{plugin-helpers-C9-Y0Ago.js → plugin-helpers-CiAxinMY.js} +5 -5
  8. package/dist/{plugin-registration-Csi-NdQU.js → plugin-registration-CeQ3RzYT.js} +3 -3
  9. package/dist/{runtime-B8d1beHo.js → runtime-BP1uG83z.js} +5 -3
  10. package/node_modules/typebox/build/format/date.d.mts +1 -1
  11. package/node_modules/typebox/build/format/date.mjs +1 -1
  12. package/node_modules/typebox/build/format/date_time.d.mts +2 -2
  13. package/node_modules/typebox/build/format/date_time.mjs +3 -3
  14. package/node_modules/typebox/build/format/email.d.mts +1 -1
  15. package/node_modules/typebox/build/format/email.mjs +2 -2
  16. package/node_modules/typebox/build/format/hostname.mjs +2 -10
  17. package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
  18. package/node_modules/typebox/build/format/idn_email.mjs +3 -3
  19. package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
  20. package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
  21. package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
  22. package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
  23. package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
  24. package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
  25. package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
  26. package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
  27. package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
  28. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +41 -0
  29. package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
  30. package/node_modules/typebox/build/format/idna/index.mjs +2 -0
  31. package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
  32. package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
  33. package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
  34. package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
  35. package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
  36. package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
  37. package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
  38. package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
  39. package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
  40. package/node_modules/typebox/build/format/ipv4.mjs +2 -32
  41. package/node_modules/typebox/build/format/ipv6.mjs +2 -61
  42. package/node_modules/typebox/build/format/iri.d.mts +2 -2
  43. package/node_modules/typebox/build/format/iri.mjs +26 -8
  44. package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
  45. package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
  46. package/node_modules/typebox/build/format/regex.d.mts +1 -2
  47. package/node_modules/typebox/build/format/regex.mjs +2 -6
  48. package/node_modules/typebox/build/format/time.d.mts +2 -2
  49. package/node_modules/typebox/build/format/time.mjs +19 -14
  50. package/node_modules/typebox/build/format/uri.d.mts +1 -1
  51. package/node_modules/typebox/build/format/uri.mjs +3 -130
  52. package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
  53. package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
  54. package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
  55. package/node_modules/typebox/build/format/uri_template.mjs +4 -5
  56. package/node_modules/typebox/build/format/url.d.mts +3 -3
  57. package/node_modules/typebox/build/format/url.mjs +4 -5
  58. package/node_modules/typebox/build/guard/emit.d.mts +3 -1
  59. package/node_modules/typebox/build/guard/emit.mjs +12 -5
  60. package/node_modules/typebox/build/guard/guard.d.mts +8 -2
  61. package/node_modules/typebox/build/guard/guard.mjs +25 -4
  62. package/node_modules/typebox/build/guard/string.d.mts +2 -2
  63. package/node_modules/typebox/build/guard/string.mjs +7 -7
  64. package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
  65. package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
  66. package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
  67. package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
  68. package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
  69. package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
  70. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
  71. package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
  72. package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
  73. package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
  74. package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
  75. package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
  76. package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
  77. package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
  78. package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
  79. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
  80. package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
  81. package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
  82. package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
  83. package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
  84. package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
  85. package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
  86. package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
  87. package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
  88. package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
  89. package/node_modules/typebox/build/schema/types/index.mjs +0 -2
  90. package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
  91. package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
  92. package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
  93. package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
  94. package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
  95. package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
  96. package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
  97. package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
  98. package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
  99. package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
  100. package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
  101. package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
  102. package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
  103. package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
  104. package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
  105. package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
  106. package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
  107. package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
  108. package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
  109. package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
  110. package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
  111. package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
  112. package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
  113. package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
  114. package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
  115. package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
  116. package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
  117. package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
  118. package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
  119. package/node_modules/typebox/build/type/script/parser.mjs +27 -23
  120. package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
  121. package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
  122. package/node_modules/typebox/package.json +27 -27
  123. package/node_modules/typebox/readme.md +79 -82
  124. package/package.json +5 -5
  125. package/node_modules/typebox/build/format/_idna.d.mts +0 -2
  126. package/node_modules/typebox/build/format/_idna.mjs +0 -246
  127. package/node_modules/typebox/build/format/_puny.d.mts +0 -1
  128. package/node_modules/typebox/build/format/_puny.mjs +0 -77
  129. package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
  130. package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
  131. package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
  132. package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
  133. package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
  134. package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
@@ -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-C9-Y0Ago.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-BEDHM6uL.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";
@@ -656,6 +657,9 @@ async function resolveCliArtifactQuery(context, options) {
656
657
  earlyBeforeMinutes
657
658
  };
658
659
  }
660
+ function resolveTokenSource(refreshed) {
661
+ return refreshed ? "refresh-token" : "cached-access-token";
662
+ }
659
663
  function registerGoogleMeetArtifactCommands(context) {
660
664
  const params = context;
661
665
  const { root } = context;
@@ -665,7 +669,7 @@ function registerGoogleMeetArtifactCommands(context) {
665
669
  if (options.json) {
666
670
  await writeCliOutput(options, JSON.stringify({
667
671
  ...result,
668
- tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
672
+ tokenSource: resolveTokenSource(resolved.token.refreshed)
669
673
  }, null, 2));
670
674
  return;
671
675
  }
@@ -675,7 +679,7 @@ function registerGoogleMeetArtifactCommands(context) {
675
679
  }
676
680
  if (options.format && options.format !== "summary") throw new Error("Unsupported format. Expected summary or markdown.");
677
681
  writeArtifactsSummary(result);
678
- writeStdoutLine("token source: %s", resolved.token.refreshed ? "refresh-token" : "cached-access-token");
682
+ writeStdoutLine("token source: %s", resolveTokenSource(resolved.token.refreshed));
679
683
  });
680
684
  addGoogleMeetArtifactOptions(root.command("attendance").description("List Meet participants and participant sessions")).option("--no-merge-duplicates", "Keep duplicate participant resources as separate rows").option("--late-after-minutes <n>", "Mark participants late after this many minutes", "5").option("--early-before-minutes <n>", "Mark early leavers before this many minutes", "5").option("--format <format>", "Output format: summary, markdown, or csv", "summary").option("--output <path>", "Write output to a file instead of stdout").option("--json", "Print JSON output", false).action(async (options) => {
681
685
  const resolved = await resolveCliArtifactQuery(params, options);
@@ -683,7 +687,7 @@ function registerGoogleMeetArtifactCommands(context) {
683
687
  if (options.json) {
684
688
  await writeCliOutput(options, JSON.stringify({
685
689
  ...result,
686
- tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
690
+ tokenSource: resolveTokenSource(resolved.token.refreshed)
687
691
  }, null, 2));
688
692
  return;
689
693
  }
@@ -697,7 +701,7 @@ function registerGoogleMeetArtifactCommands(context) {
697
701
  }
698
702
  if (options.format && options.format !== "summary") throw new Error("Unsupported format. Expected summary, markdown, or csv.");
699
703
  writeAttendanceSummary(result);
700
- writeStdoutLine("token source: %s", resolved.token.refreshed ? "refresh-token" : "cached-access-token");
704
+ writeStdoutLine("token source: %s", resolveTokenSource(resolved.token.refreshed));
701
705
  });
702
706
  addGoogleMeetArtifactOptions(root.command("export").description("Write Meet artifacts, attendance, transcript, and raw JSON into a folder")).option("--no-transcript-entries", "Skip structured transcript entry lookup").option("--include-doc-bodies", "Export linked transcript and smart-note Google Docs text").option("--no-merge-duplicates", "Keep duplicate participant resources as separate rows").option("--late-after-minutes <n>", "Mark participants late after this many minutes", "5").option("--early-before-minutes <n>", "Mark early leavers before this many minutes", "5").option("--output <dir>", "Output directory").option("--zip", "Also write a portable .zip archive").option("--dry-run", "Fetch export data and print the manifest without writing files", false).option("--json", "Print JSON output", false).action(async (options) => {
703
707
  const resolved = await resolveCliArtifactQuery(params, options);
@@ -725,11 +729,11 @@ function registerGoogleMeetArtifactCommands(context) {
725
729
  attendance,
726
730
  files: googleMeetExportFileNames(),
727
731
  request,
728
- tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token",
732
+ tokenSource: resolveTokenSource(resolved.token.refreshed),
729
733
  ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
730
734
  }),
731
735
  ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {},
732
- tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
736
+ tokenSource: resolveTokenSource(resolved.token.refreshed)
733
737
  });
734
738
  return;
735
739
  }
@@ -739,13 +743,13 @@ function registerGoogleMeetArtifactCommands(context) {
739
743
  attendance,
740
744
  zip: Boolean(options.zip),
741
745
  request,
742
- tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token",
746
+ tokenSource: resolveTokenSource(resolved.token.refreshed),
743
747
  ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
744
748
  });
745
749
  const payload = {
746
750
  ...bundle,
747
751
  ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {},
748
- tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
752
+ tokenSource: resolveTokenSource(resolved.token.refreshed)
749
753
  };
750
754
  if (options.json) {
751
755
  writeStdoutJson(payload);
@@ -1323,17 +1327,18 @@ function registerGoogleMeetCli(params) {
1323
1327
  challenge,
1324
1328
  state
1325
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
+ });
1326
1338
  const tokens = await exchangeGoogleMeetAuthCode({
1327
1339
  clientId,
1328
1340
  clientSecret,
1329
- code: await waitForGoogleMeetAuthCode({
1330
- state,
1331
- manual: Boolean(options.manual),
1332
- timeoutMs: resolveGoogleMeetOAuthCallbackTimeoutMs(options.timeoutSec),
1333
- authUrl,
1334
- promptInput,
1335
- writeLine: (message) => writeStdoutLine("%s", message)
1336
- }),
1341
+ code,
1337
1342
  verifier
1338
1343
  });
1339
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-C9-Y0Ago.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-Csi-NdQU.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-Csi-NdQU.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-BEDHM6uL.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-C9-Y0Ago.js").then((n) => n.r));
8
- const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-Bd63VJ5q.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,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a ISO8601 Date component string
3
- * @source ajv-formats
3
+ * @description https://datatracker.ietf.org/doc/html/rfc3339
4
4
  * @example `2020-12-12`
5
5
  */
6
6
  export declare function IsDate(value: string): boolean;
@@ -5,7 +5,7 @@ function IsLeapYear(year) {
5
5
  }
6
6
  /**
7
7
  * Returns true if the value is a ISO8601 Date component string
8
- * @source ajv-formats
8
+ * @description https://datatracker.ietf.org/doc/html/rfc3339
9
9
  * @example `2020-12-12`
10
10
  */
11
11
  export function IsDate(value) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a ISO8601 DateTime string
3
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc3339
4
4
  * @example `2020-12-12T20:20:40+00:00`
5
5
  */
6
- export declare function IsDateTime(value: string, strictTimeZone?: boolean): boolean;
6
+ export declare function IsDateTime(value: string): boolean;
@@ -2,10 +2,10 @@ import { IsDate } from './date.mjs';
2
2
  import { IsTime } from './time.mjs';
3
3
  /**
4
4
  * Returns true if the value is a ISO8601 DateTime string
5
- * @source ajv-formats
5
+ * @specification https://datatracker.ietf.org/doc/html/rfc3339
6
6
  * @example `2020-12-12T20:20:40+00:00`
7
7
  */
8
- export function IsDateTime(value, strictTimeZone = true) {
8
+ export function IsDateTime(value) {
9
9
  const dateTime = value.split(/T/i);
10
- return dateTime.length === 2 && IsDate(dateTime[0]) && IsTime(dateTime[1], strictTimeZone);
10
+ return dateTime.length === 2 && IsDate(dateTime[0]) && IsTime(dateTime[1]);
11
11
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Returns true if the value is an Email
3
- * @specification ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc5322
4
4
  */
5
5
  export declare function IsEmail(value: string): boolean;
@@ -1,7 +1,7 @@
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])?)*$/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
- * @specification ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc5322
5
5
  */
6
6
  export function IsEmail(value) {
7
7
  return Email.test(value);
@@ -1,4 +1,4 @@
1
- import * as Idna from './_idna.mjs';
1
+ import * as Idna from './idna/index.mjs';
2
2
  /**
3
3
  * Returns true if the value is a valid hostname.
4
4
  * @specification https://tools.ietf.org/html/rfc1123
@@ -6,13 +6,5 @@ import * as Idna from './_idna.mjs';
6
6
  * @specification https://tools.ietf.org/html/rfc5892
7
7
  */
8
8
  export function IsHostname(value) {
9
- if (value.length === 0 || value.length > 253)
10
- return false;
11
- if (value.charCodeAt(value.length - 1) === 46)
12
- return false;
13
- for (const label of value.split('.')) {
14
- if (!Idna.IsLabel(label))
15
- return false;
16
- }
17
- return true;
9
+ return Idna.IsHostname(value);
18
10
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Returns true if the value is an IdnEmail
3
- * @specification ajv-formats (unicode-extension)
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc4952
4
4
  */
5
5
  export declare function IsIdnEmail(value: string): boolean;
@@ -1,8 +1,8 @@
1
- const IdnEmail = /^(?!.*\.\.)[\p{L}\p{N}!#$%&'*+/=?^_`{|}~-]+(?:\.[\p{L}\p{N}!#$%&'*+/=?^_`{|}~-]+)*@[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,61}[\p{L}\p{N}])?(?:\.[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,61}[\p{L}\p{N}])?)*$/iu;
1
+ const IdnEmail = /^(?:[A-Za-z0-9!#$%&'*+\/=?^_`{|}~\u{0080}-\u{10FFFF}-]+(?:\.[A-Za-z0-9!#$%&'*+\/=?^_`{|}~\u{0080}-\u{10FFFF}-]+)*|"(?:[^"\\]|\\.)*")@[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,62})(?<!-)(?:\.[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,62})(?<!-))*$/iu;
2
2
  /**
3
3
  * Returns true if the value is an IdnEmail
4
- * @specification ajv-formats (unicode-extension)
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc4952
5
5
  */
6
6
  export function IsIdnEmail(value) {
7
- return IdnEmail.test(value);
7
+ return IdnEmail.test(value.normalize('NFC'));
8
8
  }
@@ -3,5 +3,6 @@
3
3
  * @specification https://tools.ietf.org/html/rfc3490
4
4
  * @specification https://tools.ietf.org/html/rfc5891
5
5
  * @specification https://tools.ietf.org/html/rfc5892
6
+ * @specification https://tools.ietf.org/html/rfc5893
6
7
  */
7
8
  export declare function IsIdnHostname(value: string): boolean;
@@ -1,19 +1,11 @@
1
- import { IsIdnLabel } from './_idna.mjs';
1
+ import * as Idna from './idna/index.mjs';
2
2
  /**
3
3
  * Returns true if the value is a valid internationalized (IDN) hostname.
4
4
  * @specification https://tools.ietf.org/html/rfc3490
5
5
  * @specification https://tools.ietf.org/html/rfc5891
6
6
  * @specification https://tools.ietf.org/html/rfc5892
7
+ * @specification https://tools.ietf.org/html/rfc5893
7
8
  */
8
9
  export function IsIdnHostname(value) {
9
- if (value.length === 0 || value.includes(' '))
10
- return false;
11
- const canonical = value.normalize('NFC').replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.');
12
- if (canonical.length > 253)
13
- return false;
14
- for (const label of canonical.split('.')) {
15
- if (!IsIdnLabel(label))
16
- return false;
17
- }
18
- return true;
10
+ return Idna.IsIdnHostname(value);
19
11
  }
@@ -0,0 +1,3 @@
1
+ export declare function HasBidiChars(value: string): boolean;
2
+ export declare function HasRightToLeftCharacters(value: string): boolean;
3
+ export declare function SatisfiesBidiRule(value: string): boolean;
@@ -0,0 +1,98 @@
1
+ // deno-fmt-ignore-file
2
+ import * as FormatPuny from './puny.mjs';
3
+ import * as Pattern from '../pattern/pattern.mjs';
4
+ // ------------------------------------------------------------------
5
+ // LOCAL REGEX: Allowed Bidi classes per direction (RFC 5893)
6
+ // ------------------------------------------------------------------
7
+ const RE_RTL_ALLOWED = /^(?:R|AL|AN|EN|ES|CS|ET|ON|BN|NSM)$/;
8
+ const RE_LTR_ALLOWED = /^(?:L|EN|ES|CS|ET|ON|BN|NSM)$/;
9
+ const RE_RTL_CLASSES = /^(?:R|AL|AN)$/;
10
+ // ------------------------------------------------------------------
11
+ // HasBidiChars
12
+ //
13
+ // Decodes a punycode label to its Unicode form (if it is one) and
14
+ // checks whether the result is an RTL label per RFC 5893 §1.4.
15
+ // ------------------------------------------------------------------
16
+ export function HasBidiChars(value) {
17
+ if (FormatPuny.IsAcePrefixed(value)) {
18
+ try {
19
+ return HasRightToLeftCharacters(FormatPuny.Decode(value.slice(4).toLowerCase()));
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ return HasRightToLeftCharacters(value);
26
+ }
27
+ // ------------------------------------------------------------------
28
+ // GetBidiClass
29
+ // ------------------------------------------------------------------
30
+ function GetBidiClass(codePoint) {
31
+ const char = String.fromCodePoint(codePoint);
32
+ return (Pattern.RE_EUROPEAN_NUMBER.test(char) ? 'EN' :
33
+ Pattern.RE_ARABIC_INDIC_DIGIT.test(char) ? 'AN' :
34
+ // Pattern.RE_EUROPEAN_SEPARATOR.test(char) ? 'ES' : // (no-spec-coverage)
35
+ // Pattern.RE_COMMON_SEPARATOR.test(char) ? 'CS' : // (no-spec-coverage)
36
+ Pattern.RE_MARK_NONSPACING.test(char) ? 'NSM' :
37
+ Pattern.RE_SCRIPT_HEBREW.test(char) ? 'R' :
38
+ Pattern.RE_SCRIPT_ARABIC_LETTER.test(char) ? 'AL' :
39
+ Pattern.RE_LETTER.test(char) ? 'L' :
40
+ 'ON');
41
+ }
42
+ // ------------------------------------------------------------------
43
+ // HasRightToLeftCharacters
44
+ //
45
+ // Per RFC 5893 §1.4: "An RTL label is a label that contains at least
46
+ // one character of type R, AL, or AN." Used to determine whether a
47
+ // domain name is a "Bidi domain name" (RFC 5893 §1.4), in which case
48
+ // the Bidi Rule applies to every label in the domain.
49
+ // ------------------------------------------------------------------
50
+ export function HasRightToLeftCharacters(value) {
51
+ for (const ch of value)
52
+ if (RE_RTL_CLASSES.test(GetBidiClass(ch.codePointAt(0))))
53
+ return true;
54
+ return false;
55
+ }
56
+ // ------------------------------------------------------------------
57
+ // SatisfiesBidiRule
58
+ // ------------------------------------------------------------------
59
+ export function SatisfiesBidiRule(value) {
60
+ let isRtl = false;
61
+ let allowed = RE_LTR_ALLOWED;
62
+ let sawEN = false;
63
+ let sawAN = false;
64
+ let isFirst = true;
65
+ // let lastClass: string | null = null // (no-spec-coverage)
66
+ for (const ch of value) {
67
+ const bidiClass = GetBidiClass(ch.codePointAt(0));
68
+ if (isFirst) {
69
+ // 1. The first character must be a character with Bidi property L, R, or AL.
70
+ if (bidiClass !== 'L' && bidiClass !== 'R' && bidiClass !== 'AL')
71
+ return false;
72
+ isRtl = bidiClass === 'R' || bidiClass === 'AL';
73
+ allowed = isRtl ? RE_RTL_ALLOWED : RE_LTR_ALLOWED;
74
+ isFirst = false;
75
+ }
76
+ // 2 / 5. Only characters in the allowed set for this direction may appear.
77
+ if (!allowed.test(bidiClass))
78
+ return false;
79
+ if (bidiClass === 'EN')
80
+ sawEN = true;
81
+ else if (bidiClass === 'AN')
82
+ sawAN = true;
83
+ // if (bidiClass !== 'NSM') lastClass = bidiClass // (no-spec-coverage)
84
+ }
85
+ if (isRtl && sawEN && sawAN)
86
+ return false; // spec coverage path
87
+ // (no-spec-coverage)
88
+ // if (isRtl) {
89
+ // // 3. The end of the label must be R, AL, EN, or AN (ignoring trailing NSM).
90
+ // // if (lastClass !== 'R' && lastClass !== 'AL' && lastClass !== 'EN' && lastClass !== 'AN') return false
91
+ // // 4. If an EN is present, no AN may be present, and vice versa.
92
+ // if (sawEN && sawAN) return false
93
+ // } else {
94
+ // // 6. The end of the label must be L or EN (ignoring trailing NSM).
95
+ // // if (lastClass !== 'L' && lastClass !== 'EN') return false
96
+ // }
97
+ return true;
98
+ }
@@ -0,0 +1,3 @@
1
+ export declare function IsAcePrefixed(value: string): boolean;
2
+ export declare function Decode(value: string): string;
3
+ export declare function Encode(input: string): string;