@openclaw/google-meet 2026.7.2-beta.5 → 2026.7.33

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 (207) hide show
  1. package/dist/{chrome-create-DMKruRFW.js → .setup/chrome-create-CFNlY-qH.mjs} +153 -132
  2. package/dist/{cli-GeuAaEIy.js → .setup/cli-DfOl5mwt.mjs} +716 -735
  3. package/dist/{config-BcaS1BDr.js → .setup/config-DeJhjNWQ.mjs} +95 -76
  4. package/dist/{create-af1MDlus.js → .setup/create-BVsTTJt1.mjs} +3 -21
  5. package/dist/{google-api-errors-CDUYkIcK.js → .setup/google-api-errors-BDYXfKRa.mjs} +1 -1
  6. package/dist/{oauth-DOfMKlGp.js → .setup/oauth-CtVbvmvR.mjs} +4 -3
  7. package/dist/doctor-contract-api.js +3 -1
  8. package/dist/index.js +3868 -1818
  9. package/node_modules/{setimmediate/LICENSE.txt → commander/LICENSE} +10 -8
  10. package/node_modules/commander/Readme.md +1172 -0
  11. package/node_modules/commander/index.js +21 -0
  12. package/node_modules/commander/lib/argument.js +147 -0
  13. package/node_modules/commander/lib/command.js +2790 -0
  14. package/node_modules/commander/lib/error.js +36 -0
  15. package/node_modules/commander/lib/help.js +731 -0
  16. package/node_modules/commander/lib/option.js +377 -0
  17. package/node_modules/commander/lib/suggestSimilar.js +99 -0
  18. package/node_modules/commander/package-support.json +19 -0
  19. package/node_modules/commander/package.json +64 -0
  20. package/node_modules/commander/typings/index.d.ts +1113 -0
  21. package/node_modules/typebox/build/compile/validator.d.mts +4 -1
  22. package/node_modules/typebox/build/guard/guard.d.mts +1 -1
  23. package/node_modules/typebox/build/guard/guard.mjs +2 -5
  24. package/node_modules/typebox/build/guard/string.mjs +4 -16
  25. package/node_modules/typebox/build/schema/engine/_functions.mjs +15 -34
  26. package/node_modules/typebox/build/type/action/readonly_object.d.mts +0 -5
  27. package/node_modules/typebox/build/type/action/readonly_object.mjs +0 -8
  28. package/node_modules/typebox/build/typebox.d.mts +1 -1
  29. package/node_modules/typebox/build/typebox.mjs +1 -1
  30. package/node_modules/typebox/package.json +1 -1
  31. package/node_modules/typebox/readme.md +32 -29
  32. package/openclaw.plugin.json +3 -4
  33. package/package.json +7 -9
  34. package/dist/cli-metadata.js +0 -13
  35. package/dist/cli-output-mode-BwH_6tH8.js +0 -28
  36. package/node_modules/core-util-is/LICENSE +0 -19
  37. package/node_modules/core-util-is/README.md +0 -3
  38. package/node_modules/core-util-is/lib/util.js +0 -107
  39. package/node_modules/core-util-is/package.json +0 -38
  40. package/node_modules/immediate/LICENSE.txt +0 -20
  41. package/node_modules/immediate/README.md +0 -93
  42. package/node_modules/immediate/dist/immediate.js +0 -75
  43. package/node_modules/immediate/dist/immediate.min.js +0 -1
  44. package/node_modules/immediate/lib/browser.js +0 -69
  45. package/node_modules/immediate/lib/index.js +0 -73
  46. package/node_modules/immediate/package.json +0 -42
  47. package/node_modules/inherits/LICENSE +0 -16
  48. package/node_modules/inherits/README.md +0 -42
  49. package/node_modules/inherits/inherits.js +0 -9
  50. package/node_modules/inherits/inherits_browser.js +0 -27
  51. package/node_modules/inherits/package.json +0 -29
  52. package/node_modules/isarray/.npmignore +0 -1
  53. package/node_modules/isarray/.travis.yml +0 -4
  54. package/node_modules/isarray/Makefile +0 -6
  55. package/node_modules/isarray/README.md +0 -60
  56. package/node_modules/isarray/component.json +0 -19
  57. package/node_modules/isarray/index.js +0 -5
  58. package/node_modules/isarray/package.json +0 -45
  59. package/node_modules/isarray/test.js +0 -20
  60. package/node_modules/jszip/.codeclimate.yml +0 -16
  61. package/node_modules/jszip/.editorconfig +0 -8
  62. package/node_modules/jszip/.eslintrc.js +0 -43
  63. package/node_modules/jszip/.github/workflows/pr.yaml +0 -58
  64. package/node_modules/jszip/.jekyll-metadata +0 -0
  65. package/node_modules/jszip/.travis.yml +0 -17
  66. package/node_modules/jszip/CHANGES.md +0 -204
  67. package/node_modules/jszip/LICENSE.markdown +0 -651
  68. package/node_modules/jszip/README.markdown +0 -33
  69. package/node_modules/jszip/deps.js +0 -37
  70. package/node_modules/jszip/dist/jszip.js +0 -11577
  71. package/node_modules/jszip/dist/jszip.min.js +0 -13
  72. package/node_modules/jszip/graph.svg +0 -601
  73. package/node_modules/jszip/index.d.ts +0 -330
  74. package/node_modules/jszip/lib/base64.js +0 -106
  75. package/node_modules/jszip/lib/compressedObject.js +0 -74
  76. package/node_modules/jszip/lib/compressions.js +0 -14
  77. package/node_modules/jszip/lib/crc32.js +0 -77
  78. package/node_modules/jszip/lib/defaults.js +0 -11
  79. package/node_modules/jszip/lib/external.js +0 -18
  80. package/node_modules/jszip/lib/flate.js +0 -85
  81. package/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -539
  82. package/node_modules/jszip/lib/generate/index.js +0 -57
  83. package/node_modules/jszip/lib/index.js +0 -55
  84. package/node_modules/jszip/lib/license_header.js +0 -11
  85. package/node_modules/jszip/lib/load.js +0 -88
  86. package/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  87. package/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  88. package/node_modules/jszip/lib/nodejsUtils.js +0 -57
  89. package/node_modules/jszip/lib/object.js +0 -384
  90. package/node_modules/jszip/lib/readable-stream-browser.js +0 -10
  91. package/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  92. package/node_modules/jszip/lib/reader/DataReader.js +0 -116
  93. package/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  94. package/node_modules/jszip/lib/reader/StringReader.js +0 -38
  95. package/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  96. package/node_modules/jszip/lib/reader/readerFor.js +0 -28
  97. package/node_modules/jszip/lib/signature.js +0 -7
  98. package/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  99. package/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  100. package/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  101. package/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  102. package/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  103. package/node_modules/jszip/lib/stream/StreamHelper.js +0 -214
  104. package/node_modules/jszip/lib/support.js +0 -38
  105. package/node_modules/jszip/lib/utf8.js +0 -275
  106. package/node_modules/jszip/lib/utils.js +0 -501
  107. package/node_modules/jszip/lib/zipEntries.js +0 -261
  108. package/node_modules/jszip/lib/zipEntry.js +0 -293
  109. package/node_modules/jszip/lib/zipObject.js +0 -133
  110. package/node_modules/jszip/package.json +0 -67
  111. package/node_modules/jszip/sponsors.md +0 -21
  112. package/node_modules/jszip/tsconfig.json +0 -101
  113. package/node_modules/jszip/vendor/FileSaver.js +0 -247
  114. package/node_modules/lie/README.md +0 -62
  115. package/node_modules/lie/dist/lie.js +0 -350
  116. package/node_modules/lie/dist/lie.min.js +0 -1
  117. package/node_modules/lie/dist/lie.polyfill.js +0 -358
  118. package/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  119. package/node_modules/lie/lib/browser.js +0 -273
  120. package/node_modules/lie/lib/index.js +0 -298
  121. package/node_modules/lie/license.md +0 -7
  122. package/node_modules/lie/lie.d.ts +0 -244
  123. package/node_modules/lie/package.json +0 -69
  124. package/node_modules/lie/polyfill.js +0 -4
  125. package/node_modules/pako/CHANGELOG.md +0 -164
  126. package/node_modules/pako/LICENSE +0 -21
  127. package/node_modules/pako/README.md +0 -191
  128. package/node_modules/pako/dist/pako.js +0 -6818
  129. package/node_modules/pako/dist/pako.min.js +0 -1
  130. package/node_modules/pako/dist/pako_deflate.js +0 -3997
  131. package/node_modules/pako/dist/pako_deflate.min.js +0 -1
  132. package/node_modules/pako/dist/pako_inflate.js +0 -3300
  133. package/node_modules/pako/dist/pako_inflate.min.js +0 -1
  134. package/node_modules/pako/index.js +0 -14
  135. package/node_modules/pako/lib/deflate.js +0 -400
  136. package/node_modules/pako/lib/inflate.js +0 -423
  137. package/node_modules/pako/lib/utils/common.js +0 -105
  138. package/node_modules/pako/lib/utils/strings.js +0 -187
  139. package/node_modules/pako/lib/zlib/README +0 -59
  140. package/node_modules/pako/lib/zlib/adler32.js +0 -51
  141. package/node_modules/pako/lib/zlib/constants.js +0 -68
  142. package/node_modules/pako/lib/zlib/crc32.js +0 -59
  143. package/node_modules/pako/lib/zlib/deflate.js +0 -1874
  144. package/node_modules/pako/lib/zlib/gzheader.js +0 -58
  145. package/node_modules/pako/lib/zlib/inffast.js +0 -345
  146. package/node_modules/pako/lib/zlib/inflate.js +0 -1556
  147. package/node_modules/pako/lib/zlib/inftrees.js +0 -343
  148. package/node_modules/pako/lib/zlib/messages.js +0 -32
  149. package/node_modules/pako/lib/zlib/trees.js +0 -1222
  150. package/node_modules/pako/lib/zlib/zstream.js +0 -47
  151. package/node_modules/pako/package.json +0 -44
  152. package/node_modules/parse-ms/index.d.ts +0 -30
  153. package/node_modules/parse-ms/index.js +0 -45
  154. package/node_modules/parse-ms/license +0 -9
  155. package/node_modules/parse-ms/package.json +0 -47
  156. package/node_modules/parse-ms/readme.md +0 -46
  157. package/node_modules/pretty-ms/index.d.ts +0 -157
  158. package/node_modules/pretty-ms/index.js +0 -149
  159. package/node_modules/pretty-ms/license +0 -9
  160. package/node_modules/pretty-ms/package.json +0 -55
  161. package/node_modules/pretty-ms/readme.md +0 -179
  162. package/node_modules/process-nextick-args/index.js +0 -45
  163. package/node_modules/process-nextick-args/license.md +0 -19
  164. package/node_modules/process-nextick-args/package.json +0 -25
  165. package/node_modules/process-nextick-args/readme.md +0 -18
  166. package/node_modules/readable-stream/.travis.yml +0 -34
  167. package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  168. package/node_modules/readable-stream/GOVERNANCE.md +0 -136
  169. package/node_modules/readable-stream/LICENSE +0 -47
  170. package/node_modules/readable-stream/README.md +0 -58
  171. package/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  172. package/node_modules/readable-stream/duplex-browser.js +0 -1
  173. package/node_modules/readable-stream/duplex.js +0 -1
  174. package/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  175. package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  176. package/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  177. package/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  178. package/node_modules/readable-stream/lib/_stream_writable.js +0 -685
  179. package/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -78
  180. package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -84
  181. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  182. package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  183. package/node_modules/readable-stream/package.json +0 -52
  184. package/node_modules/readable-stream/passthrough.js +0 -1
  185. package/node_modules/readable-stream/readable-browser.js +0 -7
  186. package/node_modules/readable-stream/readable.js +0 -19
  187. package/node_modules/readable-stream/transform.js +0 -1
  188. package/node_modules/readable-stream/writable-browser.js +0 -1
  189. package/node_modules/readable-stream/writable.js +0 -8
  190. package/node_modules/safe-buffer/LICENSE +0 -21
  191. package/node_modules/safe-buffer/README.md +0 -584
  192. package/node_modules/safe-buffer/index.d.ts +0 -187
  193. package/node_modules/safe-buffer/index.js +0 -62
  194. package/node_modules/safe-buffer/package.json +0 -37
  195. package/node_modules/setimmediate/package.json +0 -30
  196. package/node_modules/setimmediate/setImmediate.js +0 -186
  197. package/node_modules/string_decoder/.travis.yml +0 -50
  198. package/node_modules/string_decoder/LICENSE +0 -48
  199. package/node_modules/string_decoder/README.md +0 -47
  200. package/node_modules/string_decoder/lib/string_decoder.js +0 -296
  201. package/node_modules/string_decoder/package.json +0 -31
  202. package/node_modules/util-deprecate/History.md +0 -16
  203. package/node_modules/util-deprecate/LICENSE +0 -24
  204. package/node_modules/util-deprecate/README.md +0 -53
  205. package/node_modules/util-deprecate/browser.js +0 -67
  206. package/node_modules/util-deprecate/node.js +0 -6
  207. package/node_modules/util-deprecate/package.json +0 -27
@@ -1,8 +1,8 @@
1
- import { t as googleApiError } from "./google-api-errors-CDUYkIcK.js";
1
+ import { t as googleApiError } from "./google-api-errors-BDYXfKRa.mjs";
2
2
  import { uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
3
3
  import { readProviderJsonResponse, readProviderTextResponse } from "openclaw/plugin-sdk/provider-http";
4
4
  import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
5
- import { asMeetingBrowserTabs, callMeetingBrowserProxyOnNode, readMeetingBrowserTab, resolveMeetingBrowserNode, resolveMeetingBrowserNodeInfo } from "openclaw/plugin-sdk/meeting-runtime";
5
+ import { addTimerTimeoutGraceMs } from "openclaw/plugin-sdk/number-runtime";
6
6
  import { sleep } from "openclaw/plugin-sdk/runtime-env";
7
7
  //#region extensions/google-meet/src/drive.ts
8
8
  const GOOGLE_DRIVE_API_BASE_URL = "https://www.googleapis.com/drive/v3";
@@ -49,7 +49,7 @@ async function exportGoogleDriveDocumentText(params) {
49
49
  }
50
50
  }
51
51
  //#endregion
52
- //#region extensions/google-meet/src/meet-api.ts
52
+ //#region extensions/google-meet/src/meet.ts
53
53
  const GOOGLE_MEET_API_BASE_URL = `https://meet.googleapis.com/v2`;
54
54
  const GOOGLE_MEET_URL_HOST = "meet.google.com";
55
55
  const GOOGLE_MEET_API_HOST = "meet.googleapis.com";
@@ -341,36 +341,6 @@ async function listGoogleMeetSmartNotes(params) {
341
341
  errorPrefix: "Google Meet conferenceRecords.smartNotes.list"
342
342
  });
343
343
  }
344
- async function resolveConferenceRecordQuery(params) {
345
- if (params.conferenceRecord?.trim()) {
346
- const conferenceRecord = await fetchGoogleMeetConferenceRecord({
347
- accessToken: params.accessToken,
348
- conferenceRecord: params.conferenceRecord
349
- });
350
- return {
351
- input: params.conferenceRecord.trim(),
352
- conferenceRecords: [conferenceRecord]
353
- };
354
- }
355
- if (!params.meeting?.trim()) throw new Error("Meeting input or conference record is required");
356
- const space = await fetchGoogleMeetSpace({
357
- accessToken: params.accessToken,
358
- meeting: params.meeting
359
- });
360
- const conferenceRecords = await listGoogleMeetConferenceRecords({
361
- accessToken: params.accessToken,
362
- meeting: space.name,
363
- pageSize: params.allConferenceRecords ? params.pageSize : 1,
364
- maxItems: params.allConferenceRecords ? void 0 : 1
365
- });
366
- return {
367
- input: params.meeting,
368
- space,
369
- conferenceRecords
370
- };
371
- }
372
- //#endregion
373
- //#region extensions/google-meet/src/meet.ts
374
344
  function getParticipantDisplayName(participant) {
375
345
  return participant.signedinUser?.displayName ?? participant.anonymousUser?.displayName ?? participant.phoneUser?.displayName;
376
346
  }
@@ -486,6 +456,34 @@ function mergeAttendanceRows(rows, conferenceRecord, params) {
486
456
  }
487
457
  return [...grouped.values()].map((row) => decorateAttendanceRow(row, conferenceRecord, params));
488
458
  }
459
+ async function resolveConferenceRecordQuery(params) {
460
+ if (params.conferenceRecord?.trim()) {
461
+ const conferenceRecord = await fetchGoogleMeetConferenceRecord({
462
+ accessToken: params.accessToken,
463
+ conferenceRecord: params.conferenceRecord
464
+ });
465
+ return {
466
+ input: params.conferenceRecord.trim(),
467
+ conferenceRecords: [conferenceRecord]
468
+ };
469
+ }
470
+ if (!params.meeting?.trim()) throw new Error("Meeting input or conference record is required");
471
+ const space = await fetchGoogleMeetSpace({
472
+ accessToken: params.accessToken,
473
+ meeting: params.meeting
474
+ });
475
+ const conferenceRecords = await listGoogleMeetConferenceRecords({
476
+ accessToken: params.accessToken,
477
+ meeting: space.name,
478
+ pageSize: params.allConferenceRecords ? params.pageSize : 1,
479
+ maxItems: params.allConferenceRecords ? void 0 : 1
480
+ });
481
+ return {
482
+ input: params.meeting,
483
+ space,
484
+ conferenceRecords
485
+ };
486
+ }
489
487
  async function fetchGoogleMeetArtifacts(params) {
490
488
  const resolved = await resolveConferenceRecordQuery(params);
491
489
  const artifacts = await Promise.all(resolved.conferenceRecords.map(async (conferenceRecord) => {
@@ -599,37 +597,7 @@ function buildGoogleMeetPreflightReport(params) {
599
597
  };
600
598
  }
601
599
  //#endregion
602
- //#region extensions/google-meet/src/transports/google-meet-platform-constants.ts
603
- const GOOGLE_MEET_NODE_COMMAND = "googlemeet.chrome";
604
- const GOOGLE_MEET_BROWSER_NODE_ADAPTER = {
605
- displayName: "Google Meet",
606
- nodeCommandName: GOOGLE_MEET_NODE_COMMAND,
607
- nodeConfigPath: "plugins.entries.google-meet.config.chromeNode.node"
608
- };
609
- //#endregion
610
600
  //#region extensions/google-meet/src/transports/chrome-browser-proxy.ts
611
- async function resolveChromeNodeInfo(params) {
612
- return await resolveMeetingBrowserNodeInfo({
613
- ...params,
614
- adapter: GOOGLE_MEET_BROWSER_NODE_ADAPTER
615
- });
616
- }
617
- async function resolveChromeNode(params) {
618
- return await resolveMeetingBrowserNode({
619
- ...params,
620
- adapter: GOOGLE_MEET_BROWSER_NODE_ADAPTER
621
- });
622
- }
623
- async function callBrowserProxyOnNode(params) {
624
- return await callMeetingBrowserProxyOnNode({
625
- ...params,
626
- adapter: GOOGLE_MEET_BROWSER_NODE_ADAPTER
627
- });
628
- }
629
- const asBrowserTabs = asMeetingBrowserTabs;
630
- const readBrowserTab = readMeetingBrowserTab;
631
- //#endregion
632
- //#region extensions/google-meet/src/transports/google-meet-urls.ts
633
601
  function forceMeetEnglishUi(url) {
634
602
  try {
635
603
  const parsed = new URL(url);
@@ -644,7 +612,7 @@ function normalizeMeetUrlForReuse(url) {
644
612
  try {
645
613
  const parsed = new URL(url);
646
614
  if (parsed.protocol !== "https:" || parsed.hostname.toLowerCase() !== "meet.google.com") return;
647
- const match = parsed.pathname.match(/^\/([a-z]{3}-[a-z]{4}-[a-z]{3})(?:\/)?$/i);
615
+ const match = parsed.pathname.match(/^\/(new|[a-z]{3}-[a-z]{4}-[a-z]{3})(?:\/)?$/i);
648
616
  if (!match?.[1]) return;
649
617
  return `https://meet.google.com/${match[1].toLowerCase()}`;
650
618
  } catch {
@@ -656,27 +624,100 @@ function isSameMeetUrlForReuse(a, b) {
656
624
  const normalizedB = normalizeMeetUrlForReuse(b);
657
625
  return Boolean(normalizedA && normalizedB && normalizedA === normalizedB);
658
626
  }
659
- function isEnglishMeetTab(url) {
660
- if (!url) return false;
627
+ function isGoogleMeetNode(node) {
628
+ const commands = Array.isArray(node.commands) ? node.commands : [];
629
+ const caps = Array.isArray(node.caps) ? node.caps : [];
630
+ return node.connected === true && commands.includes("googlemeet.chrome") && (commands.includes("browser.proxy") || caps.includes("browser"));
631
+ }
632
+ function matchesRequestedNode(node, requested) {
633
+ return [
634
+ node.nodeId,
635
+ node.displayName,
636
+ node.remoteIp
637
+ ].some((value) => value === requested);
638
+ }
639
+ function formatNodeLabel(node) {
640
+ const parts = [
641
+ node.displayName,
642
+ node.nodeId,
643
+ node.remoteIp
644
+ ].filter(Boolean);
645
+ return parts.length > 0 ? parts.join(" / ") : "unknown node";
646
+ }
647
+ function describeNodeUsabilityIssues(node) {
648
+ const commands = Array.isArray(node.commands) ? node.commands : [];
649
+ const caps = Array.isArray(node.caps) ? node.caps : [];
650
+ const issues = [];
651
+ if (node.connected !== true) issues.push("offline");
652
+ if (!commands.includes("googlemeet.chrome")) issues.push("missing googlemeet.chrome");
653
+ if (!commands.includes("browser.proxy") && !caps.includes("browser")) issues.push("missing browser.proxy/browser capability");
654
+ return issues;
655
+ }
656
+ async function listGoogleMeetNodes(runtime, params) {
661
657
  try {
662
- const parsed = new URL(url);
663
- return parsed.protocol === "https:" && parsed.hostname.toLowerCase() === "meet.google.com" && parsed.searchParams.get("hl")?.toLowerCase() === "en";
664
- } catch {
665
- return false;
658
+ return params ? await runtime.nodes.list(params) : await runtime.nodes.list();
659
+ } catch (error) {
660
+ throw new Error("Google Meet node inventory unavailable", { cause: error });
666
661
  }
667
662
  }
668
- function readMeetAuthUser(url) {
669
- if (!url) return;
670
- try {
671
- return new URL(url).searchParams.get("authuser") ?? void 0;
672
- } catch {
673
- return;
663
+ async function resolveChromeNodeInfo(params) {
664
+ const requested = params.requestedNode?.trim();
665
+ if (requested) {
666
+ const matches = (await listGoogleMeetNodes(params.runtime)).nodes.filter((node) => matchesRequestedNode(node, requested));
667
+ if (matches.length === 1) {
668
+ const [node] = matches;
669
+ if (isGoogleMeetNode(node)) return node;
670
+ throw new Error(`Configured Google Meet node ${requested} is not usable (${formatNodeLabel(node)}): ${describeNodeUsabilityIssues(node).join("; ")}. Start or reinstall \`openclaw node run\` on that Chrome host, approve pairing, and allow googlemeet.chrome plus browser.proxy.`);
671
+ }
672
+ if (matches.length > 1) throw new Error(`Configured Google Meet node ${requested} is ambiguous (${matches.length} matches). Pin chromeNode.node to a unique node id, display name, or remote IP.`);
673
+ throw new Error(`Configured Google Meet node ${requested} was not found. Run \`openclaw nodes status\` and start or approve the Chrome node.`);
674
674
  }
675
+ const nodes = (await listGoogleMeetNodes(params.runtime, { connected: true })).nodes.filter(isGoogleMeetNode);
676
+ if (nodes.length === 0) throw new Error("No connected Google Meet-capable node with browser proxy. Run `openclaw node run` on the Chrome host with browser proxy enabled, approve pairing, and allow googlemeet.chrome plus browser.proxy.");
677
+ if (nodes.length === 1) return nodes[0];
678
+ throw new Error("Multiple Google Meet-capable nodes connected. Set plugins.entries.google-meet.config.chromeNode.node.");
679
+ }
680
+ async function resolveChromeNode(params) {
681
+ const node = await resolveChromeNodeInfo(params);
682
+ if (!node.nodeId) throw new Error("Google Meet node did not include a node id.");
683
+ return node.nodeId;
684
+ }
685
+ function unwrapNodeInvokePayload(raw) {
686
+ const record = raw && typeof raw === "object" ? raw : {};
687
+ if (typeof record.payloadJSON === "string" && record.payloadJSON.trim()) try {
688
+ return JSON.parse(record.payloadJSON);
689
+ } catch (error) {
690
+ throw new Error("Google Meet browser proxy returned malformed payloadJSON.", { cause: error });
691
+ }
692
+ if ("payload" in record) return record.payload;
693
+ return raw;
694
+ }
695
+ function parseBrowserProxyResult(raw) {
696
+ const payload = unwrapNodeInvokePayload(raw);
697
+ const proxy = payload && typeof payload === "object" ? payload : void 0;
698
+ if (!proxy || !("result" in proxy)) throw new Error("Google Meet browser proxy returned an invalid result.");
699
+ return proxy.result;
700
+ }
701
+ async function callBrowserProxyOnNode(params) {
702
+ return parseBrowserProxyResult(await params.runtime.nodes.invoke({
703
+ nodeId: params.nodeId,
704
+ command: "browser.proxy",
705
+ params: {
706
+ method: params.method,
707
+ path: params.path,
708
+ body: params.body,
709
+ timeoutMs: params.timeoutMs
710
+ },
711
+ timeoutMs: addTimerTimeoutGraceMs(params.timeoutMs) ?? 1,
712
+ scopes: ["operator.admin"]
713
+ }));
714
+ }
715
+ function asBrowserTabs(result) {
716
+ const record = result && typeof result === "object" ? result : {};
717
+ return Array.isArray(record.tabs) ? record.tabs : [];
675
718
  }
676
- function isRecoverableMeetTab(tab, url) {
677
- if (url) return isSameMeetUrlForReuse(tab.url, url);
678
- if (normalizeMeetUrlForReuse(tab.url)) return true;
679
- return (tab.url ?? "").startsWith("https://accounts.google.com/") && /sign in|google accounts|meet/i.test(tab.title ?? "");
719
+ function readBrowserTab(result) {
720
+ return result && typeof result === "object" ? result : void 0;
680
721
  }
681
722
  //#endregion
682
723
  //#region extensions/google-meet/src/transports/chrome-create.ts
@@ -687,7 +728,8 @@ const GOOGLE_MEET_BROWSER_NAVIGATION_RETRY_MS = 1e3;
687
728
  const GOOGLE_MEET_BROWSER_POLL_MS = 500;
688
729
  var GoogleMeetBrowserManualActionError = class extends Error {
689
730
  constructor(payload) {
690
- super(`${payload.manualAction.reason}: ${payload.manualAction.message}`);
731
+ const prefix = payload.manualActionReason ? `${payload.manualActionReason}: ` : "";
732
+ super(`${prefix}${payload.manualActionMessage}`);
691
733
  this.name = "GoogleMeetBrowserManualActionError";
692
734
  this.payload = {
693
735
  source: "browser",
@@ -737,14 +779,6 @@ async function focusBrowserTab(params) {
737
779
  function readStringArray(value) {
738
780
  return Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : void 0;
739
781
  }
740
- function readBrowserManualAction(value) {
741
- if (!value || typeof value !== "object") return;
742
- const action = value;
743
- return typeof action.reason === "string" && typeof action.message === "string" ? {
744
- reason: action.reason,
745
- message: action.message
746
- } : void 0;
747
- }
748
782
  function readBrowserCreateResult(result) {
749
783
  const record = result && typeof result === "object" ? result : {};
750
784
  const nested = record.result && typeof record.result === "object" ? record.result : record;
@@ -752,7 +786,8 @@ function readBrowserCreateResult(result) {
752
786
  meetingUri: typeof nested.meetingUri === "string" ? nested.meetingUri : void 0,
753
787
  browserUrl: typeof nested.browserUrl === "string" ? nested.browserUrl : void 0,
754
788
  browserTitle: typeof nested.browserTitle === "string" ? nested.browserTitle : void 0,
755
- manualAction: readBrowserManualAction(nested.manualAction),
789
+ manualAction: typeof nested.manualAction === "string" ? nested.manualAction : void 0,
790
+ manualActionReason: typeof nested.manualActionReason === "string" ? nested.manualActionReason : void 0,
756
791
  notes: readStringArray(nested.notes),
757
792
  retryAfterMs: typeof nested.retryAfterMs === "number" && Number.isFinite(nested.retryAfterMs) ? nested.retryAfterMs : void 0
758
793
  };
@@ -761,7 +796,6 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
761
796
  const meetUrlPattern = /^https:\\/\\/meet\\.google\\.com\\/[a-z]{3}-[a-z]{4}-[a-z]{3}(?:$|[/?#])/i;
762
797
  const text = (node) => (node?.innerText || node?.textContent || "").trim();
763
798
  const current = () => location.href;
764
- const manualActionFor = (reason, message) => ({ reason, message });
765
799
  const notes = [];
766
800
  const findButton = (pattern) =>
767
801
  [...document.querySelectorAll("button")].find((button) => {
@@ -785,7 +819,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
785
819
  };
786
820
  if (!current().startsWith("https://meet.google.com/")) {
787
821
  return {
788
- manualAction: manualActionFor("google-login-required", "Sign in to Google in the OpenClaw browser profile, then retry meeting creation."),
822
+ manualActionReason: "google-login-required",
823
+ manualAction: "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
789
824
  browserUrl: current(),
790
825
  browserTitle: document.title,
791
826
  notes,
@@ -811,7 +846,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
811
846
  }
812
847
  if (/do you want people to hear you in the meeting/i.test(pageText)) {
813
848
  return {
814
- manualAction: manualActionFor("meet-audio-choice-required", "Meet is showing the microphone choice. Click Use microphone in the OpenClaw browser profile, then retry meeting creation."),
849
+ manualActionReason: "meet-audio-choice-required",
850
+ manualAction: "Meet is showing the microphone choice. Click Use microphone in the OpenClaw browser profile, then retry meeting creation.",
815
851
  browserUrl: href,
816
852
  browserTitle: document.title,
817
853
  notes,
@@ -819,7 +855,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
819
855
  }
820
856
  if (/allow.*(microphone|camera)|blocked.*(microphone|camera)|permission.*(microphone|camera)/i.test(pageText)) {
821
857
  return {
822
- manualAction: manualActionFor("meet-permission-required", "Allow microphone/camera permissions for Meet in the OpenClaw browser profile, then retry meeting creation."),
858
+ manualActionReason: "meet-permission-required",
859
+ manualAction: "Allow microphone/camera permissions for Meet in the OpenClaw browser profile, then retry meeting creation.",
823
860
  browserUrl: href,
824
861
  browserTitle: document.title,
825
862
  notes,
@@ -827,7 +864,7 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
827
864
  }
828
865
  if (/couldn't create|unable to create/i.test(pageText)) {
829
866
  return {
830
- manualAction: manualActionFor("browser-control-unavailable", "Resolve the Google Meet page prompt in the OpenClaw browser profile, then retry meeting creation."),
867
+ manualAction: "Resolve the Google Meet page prompt in the OpenClaw browser profile, then retry meeting creation.",
831
868
  browserUrl: href,
832
869
  browserTitle: document.title,
833
870
  notes,
@@ -835,7 +872,8 @@ const CREATE_MEET_FROM_BROWSER_SCRIPT = `async () => {
835
872
  }
836
873
  if (location.hostname.toLowerCase() === "accounts.google.com" || /use your google account|to continue to google meet|choose an account|sign in to (join|continue)/i.test(pageText)) {
837
874
  return {
838
- manualAction: manualActionFor("google-login-required", "Sign in to Google in the OpenClaw browser profile, then retry meeting creation."),
875
+ manualActionReason: "google-login-required",
876
+ manualAction: "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.",
839
877
  browserUrl: href,
840
878
  browserTitle: document.title,
841
879
  notes,
@@ -855,43 +893,25 @@ async function createMeetWithBrowserProxyOnNode(params) {
855
893
  });
856
894
  const timeoutMs = Math.max(GOOGLE_MEET_BROWSER_CREATE_TIMEOUT_MS, params.config.chrome.joinTimeoutMs);
857
895
  const stepTimeoutMs = Math.min(timeoutMs, GOOGLE_MEET_BROWSER_STEP_TIMEOUT_MS);
858
- let openedByPlugin = false;
859
896
  let tab = await findGoogleMeetCreateTab({
860
897
  runtime: params.runtime,
861
898
  nodeId,
862
899
  timeoutMs: stepTimeoutMs
863
900
  });
864
- if (tab?.targetId) {
865
- await focusBrowserTab({
866
- runtime: params.runtime,
867
- nodeId,
868
- targetId: tab.targetId,
869
- timeoutMs: stepTimeoutMs
870
- });
871
- const reusedUrl = tab.url ?? "";
872
- const englishUrl = (/^https:\/\/meet\.google\.com\/new(?:$|[/?#])/i.test(reusedUrl) || reusedUrl.startsWith("https://accounts.google.com/")) && reusedUrl ? forceMeetEnglishUi(reusedUrl) : void 0;
873
- if (englishUrl && englishUrl !== reusedUrl) tab = readBrowserTab(await callBrowserProxyOnNode({
874
- runtime: params.runtime,
875
- nodeId,
876
- method: "POST",
877
- path: "/navigate",
878
- body: {
879
- targetId: tab.targetId,
880
- url: englishUrl
881
- },
882
- timeoutMs: stepTimeoutMs
883
- })) ?? tab;
884
- } else {
885
- tab = readBrowserTab(await callBrowserProxyOnNode({
886
- runtime: params.runtime,
887
- nodeId,
888
- method: "POST",
889
- path: "/tabs/open",
890
- body: { url: forceMeetEnglishUi(GOOGLE_MEET_NEW_URL) },
891
- timeoutMs: stepTimeoutMs
892
- }));
893
- openedByPlugin = Boolean(tab?.targetId);
894
- }
901
+ if (tab?.targetId) await focusBrowserTab({
902
+ runtime: params.runtime,
903
+ nodeId,
904
+ targetId: tab.targetId,
905
+ timeoutMs: stepTimeoutMs
906
+ });
907
+ else tab = readBrowserTab(await callBrowserProxyOnNode({
908
+ runtime: params.runtime,
909
+ nodeId,
910
+ method: "POST",
911
+ path: "/tabs/open",
912
+ body: { url: forceMeetEnglishUi(GOOGLE_MEET_NEW_URL) },
913
+ timeoutMs: stepTimeoutMs
914
+ }));
895
915
  const targetId = tab?.targetId;
896
916
  if (!targetId) throw new Error("Browser fallback opened Google Meet but did not return a targetId.");
897
917
  const notes = /* @__PURE__ */ new Set();
@@ -917,14 +937,15 @@ async function createMeetWithBrowserProxyOnNode(params) {
917
937
  source: "browser",
918
938
  nodeId,
919
939
  targetId,
920
- openedByPlugin,
921
940
  meetingUri: result.meetingUri,
922
941
  browserUrl: result.browserUrl,
923
942
  browserTitle: result.browserTitle,
924
943
  notes: [...notes]
925
944
  };
926
945
  if (result.manualAction) throw new GoogleMeetBrowserManualActionError({
927
- manualAction: result.manualAction,
946
+ manualActionRequired: true,
947
+ manualActionReason: result.manualActionReason,
948
+ manualActionMessage: result.manualAction,
928
949
  browser: {
929
950
  nodeId,
930
951
  targetId,
@@ -939,7 +960,7 @@ async function createMeetWithBrowserProxyOnNode(params) {
939
960
  if (!isBrowserNavigationInterruption(error)) throw error;
940
961
  await sleep(GOOGLE_MEET_BROWSER_NAVIGATION_RETRY_MS);
941
962
  }
942
- throw new Error(lastResult?.manualAction?.message ?? `Google Meet did not return a meeting URL from the browser create flow before timeout.${lastError ? ` Last browser automation error: ${formatBrowserAutomationError(lastError)}` : ""}`);
963
+ throw new Error(lastResult?.manualAction ?? `Google Meet did not return a meeting URL from the browser create flow before timeout.${lastError ? ` Last browser automation error: ${formatBrowserAutomationError(lastError)}` : ""}`);
943
964
  }
944
965
  //#endregion
945
- export { endGoogleMeetActiveConference as _, isRecoverableMeetTab as a, readMeetAuthUser as c, resolveChromeNodeInfo as d, GOOGLE_MEET_NODE_COMMAND as f, createGoogleMeetSpace as g, fetchGoogleMeetAttendance as h, isEnglishMeetTab as i, callBrowserProxyOnNode as l, fetchGoogleMeetArtifacts as m, isGoogleMeetBrowserManualActionError as n, isSameMeetUrlForReuse as o, buildGoogleMeetPreflightReport as p, forceMeetEnglishUi as r, normalizeMeetUrlForReuse as s, createMeetWithBrowserProxyOnNode as t, resolveChromeNode as u, fetchGoogleMeetSpace as v, fetchLatestGoogleMeetConferenceRecord as y };
966
+ export { fetchLatestGoogleMeetConferenceRecord as _, forceMeetEnglishUi as a, readBrowserTab as c, buildGoogleMeetPreflightReport as d, createGoogleMeetSpace as f, fetchGoogleMeetSpace as g, fetchGoogleMeetAttendance as h, callBrowserProxyOnNode as i, resolveChromeNode as l, fetchGoogleMeetArtifacts as m, isGoogleMeetBrowserManualActionError as n, isSameMeetUrlForReuse as o, endGoogleMeetActiveConference as p, asBrowserTabs as r, normalizeMeetUrlForReuse as s, createMeetWithBrowserProxyOnNode as t, resolveChromeNodeInfo as u };