@openclaw/google-meet 2026.7.2-beta.7 → 2026.8.1-beta.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,16 +1,33 @@
1
- import { n as hasCreateSpaceConfigInput, r as resolveCreateSpaceConfig } from "./create-af1MDlus.js";
2
- import { a as buildGoogleMeetCalendarDayWindow, i as resolveGoogleMeetGatewayOperationTimeoutMs, o as findGoogleMeetCalendarEvent, s as listGoogleMeetCalendarEvents } from "./config-BcaS1BDr.js";
3
- import { _ as endGoogleMeetActiveConference, g as createGoogleMeetSpace, h as fetchGoogleMeetAttendance, m as fetchGoogleMeetArtifacts, p as buildGoogleMeetPreflightReport, v as fetchGoogleMeetSpace, y as fetchLatestGoogleMeetConferenceRecord } from "./chrome-create-DMKruRFW.js";
4
- import { buildGoogleMeetAuthUrl, createGoogleMeetOAuthState, createGoogleMeetPkce, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-DOfMKlGp.js";
5
- import { callGatewayFromCli } from "openclaw/plugin-sdk/gateway-runtime";
6
- import { clampTimerTimeoutMs, parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
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-CfeT1SYY.js";
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-UHeaRzsH.js";
7
5
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
6
+ import { clampTimerTimeoutMs, parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
7
+ import { callGatewayFromCli } from "openclaw/plugin-sdk/gateway-runtime";
8
+ import { generateHexPkceVerifierChallenge } from "openclaw/plugin-sdk/provider-auth";
9
+ import { generateOAuthState } from "openclaw/plugin-sdk/provider-auth-runtime";
10
+ import fsp, { writeFile } from "node:fs/promises";
8
11
  import path from "node:path";
9
- import { mkdir, writeFile } from "node:fs/promises";
10
12
  import JSZip from "jszip";
13
+ import { writeExternalFileWithinRoot } from "openclaw/plugin-sdk/security-runtime";
11
14
  import { createInterface } from "node:readline/promises";
12
15
  import { format } from "node:util";
13
16
  import prettyMilliseconds from "pretty-ms";
17
+ //#region extensions/google-meet/src/cli-command-context.ts
18
+ function addGoogleMeetOAuthOptions(command) {
19
+ return command.option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds");
20
+ }
21
+ function addGoogleMeetMeetingOption(command) {
22
+ return command.option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}");
23
+ }
24
+ function addGoogleMeetCalendarOptions(command) {
25
+ return command.option("--today", "Find a Meet link on today's calendar").option("--event <query>", "Find a matching calendar event with a Meet link").option("--calendar <id>", "Calendar id for --today or --event", "primary");
26
+ }
27
+ function addGoogleMeetArtifactOptions(command) {
28
+ return addGoogleMeetOAuthOptions(addGoogleMeetCalendarOptions(addGoogleMeetMeetingOption(command).option("--conference-record <name>", "Conference record name or id"))).option("--page-size <n>", "Max resources per Meet API page").option("--all-conference-records", "Fetch every conference record for --meeting");
29
+ }
30
+ //#endregion
14
31
  //#region extensions/google-meet/src/cli-shared.ts
15
32
  const testing = {
16
33
  parsePositiveNumber,
@@ -20,6 +37,19 @@ const testing = {
20
37
  };
21
38
  const GOOGLE_MEET_GATEWAY_DEFAULT_TIMEOUT_MS = 5e3;
22
39
  const PLAIN_DECIMAL_NUMBER_RE = /^\d+(?:\.\d+)?$/;
40
+ function parseGoogleMeetMode(value) {
41
+ if (value === void 0 || value === "agent" || value === "bidi" || value === "transcribe" || value === "realtime") return value;
42
+ throw new Error(`mode must be agent, bidi, transcribe, or realtime; received ${value}`);
43
+ }
44
+ function parseGoogleMeetTransport(value) {
45
+ if (value === void 0 || value === "chrome" || value === "chrome-node" || value === "twilio") return value;
46
+ throw new Error(`transport must be chrome, chrome-node, or twilio; received ${value}`);
47
+ }
48
+ function parseGoogleMeetBrowserTransport(value) {
49
+ const transport = parseGoogleMeetTransport(value);
50
+ if (transport === "twilio") throw new Error(`transport must be chrome or chrome-node; received ${value}`);
51
+ return transport;
52
+ }
23
53
  function writeStdoutJson(value) {
24
54
  process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
25
55
  }
@@ -199,7 +229,6 @@ function writeRecoverCurrentTabResult(result) {
199
229
  toolPolicy: "safe-read-only"
200
230
  },
201
231
  chrome: {
202
- audioBackend: "blackhole-2ch",
203
232
  launched: true,
204
233
  nodeId: result.nodeId,
205
234
  health: result.browser
@@ -543,9 +572,19 @@ function googleMeetExportFileNames() {
543
572
  function defaultExportDirectory() {
544
573
  return `google-meet-export-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")}`;
545
574
  }
575
+ async function publishMeetExportFile(outputPath, content) {
576
+ const absolutePath = path.resolve(outputPath);
577
+ await writeExternalFileWithinRoot({
578
+ rootDir: path.dirname(absolutePath),
579
+ path: path.basename(absolutePath),
580
+ write: async (tempPath) => {
581
+ await fsp.writeFile(tempPath, content);
582
+ }
583
+ });
584
+ }
546
585
  async function writeMeetExportBundle(params) {
547
586
  const outputDir = params.outputDir?.trim() || defaultExportDirectory();
548
- await mkdir(outputDir, { recursive: true });
587
+ await fsp.mkdir(outputDir, { recursive: true });
549
588
  const zipFile = params.zip ? `${outputDir.replace(/\/$/, "")}.zip` : void 0;
550
589
  const fileNames = googleMeetExportFileNames();
551
590
  const files = [
@@ -582,7 +621,7 @@ async function writeMeetExportBundle(params) {
582
621
  }), null, 2)}\n`
583
622
  }
584
623
  ];
585
- for (const file of files) await writeFile(path.join(outputDir, file.name), file.content, "utf8");
624
+ for (const file of files) await publishMeetExportFile(path.join(outputDir, file.name), file.content);
586
625
  const result = {
587
626
  outputDir,
588
627
  files: files.map((file) => path.join(outputDir, file.name))
@@ -590,38 +629,31 @@ async function writeMeetExportBundle(params) {
590
629
  if (zipFile) {
591
630
  const zip = new JSZip();
592
631
  for (const file of files) zip.file(file.name, file.content);
593
- await writeFile(zipFile, await zip.generateAsync({ type: "nodebuffer" }));
632
+ await publishMeetExportFile(zipFile, await zip.generateAsync({ type: "nodebuffer" }));
594
633
  result.zipFile = zipFile;
595
634
  }
596
635
  return result;
597
636
  }
598
637
  //#endregion
599
638
  //#region extensions/google-meet/src/cli-artifact-commands.ts
639
+ async function resolveCliArtifactQuery(context, options) {
640
+ const { lateAfterMinutes, earlyBeforeMinutes, ...raw } = context.resolveCliArtifactParams(options);
641
+ return {
642
+ ...await resolveArtifactQueryFromParams(context.config, raw),
643
+ lateAfterMinutes,
644
+ earlyBeforeMinutes
645
+ };
646
+ }
600
647
  function registerGoogleMeetArtifactCommands(context) {
601
648
  const params = context;
602
- const { root, resolveArtifactTokenOptions, resolveMeetingForToken } = context;
603
- root.command("artifacts").description("List Meet conference records and available participant/artifact metadata").option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}").option("--conference-record <name>", "Conference record name or id").option("--today", "Find a Meet link on today's calendar").option("--event <query>", "Find a matching calendar event with a Meet link").option("--calendar <id>", "Calendar id for --today or --event", "primary").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--page-size <n>", "Max resources per Meet API page").option("--all-conference-records", "Fetch every conference record for --meeting").option("--no-transcript-entries", "Skip structured transcript entry lookup").option("--include-doc-bodies", "Export linked transcript and smart-note Google Docs text").option("--format <format>", "Output format: summary or markdown", "summary").option("--output <path>", "Write output to a file instead of stdout").option("--json", "Print JSON output", false).action(async (options) => {
604
- const resolved = resolveArtifactTokenOptions(params.config, options);
605
- const token = await resolveGoogleMeetAccessToken(resolved);
606
- const meeting = resolved.conferenceRecord ? resolved.meeting : (await resolveMeetingForToken({
607
- config: params.config,
608
- options,
609
- accessToken: token.accessToken,
610
- configuredMeeting: resolved.meeting
611
- })).meeting;
612
- const result = await fetchGoogleMeetArtifacts({
613
- accessToken: token.accessToken,
614
- meeting,
615
- conferenceRecord: resolved.conferenceRecord,
616
- pageSize: resolved.pageSize,
617
- includeTranscriptEntries: resolved.includeTranscriptEntries,
618
- allConferenceRecords: resolved.allConferenceRecords,
619
- includeDocumentBodies: resolved.includeDocumentBodies
620
- });
649
+ const { root } = context;
650
+ addGoogleMeetArtifactOptions(root.command("artifacts").description("List Meet conference records and available participant/artifact metadata")).option("--no-transcript-entries", "Skip structured transcript entry lookup").option("--include-doc-bodies", "Export linked transcript and smart-note Google Docs text").option("--format <format>", "Output format: summary or markdown", "summary").option("--output <path>", "Write output to a file instead of stdout").option("--json", "Print JSON output", false).action(async (options) => {
651
+ const resolved = await resolveCliArtifactQuery(params, options);
652
+ const result = await fetchResolvedGoogleMeetArtifacts(resolved);
621
653
  if (options.json) {
622
654
  await writeCliOutput(options, JSON.stringify({
623
655
  ...result,
624
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token"
656
+ tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
625
657
  }, null, 2));
626
658
  return;
627
659
  }
@@ -631,31 +663,15 @@ function registerGoogleMeetArtifactCommands(context) {
631
663
  }
632
664
  if (options.format && options.format !== "summary") throw new Error("Unsupported format. Expected summary or markdown.");
633
665
  writeArtifactsSummary(result);
634
- writeStdoutLine("token source: %s", token.refreshed ? "refresh-token" : "cached-access-token");
666
+ writeStdoutLine("token source: %s", resolved.token.refreshed ? "refresh-token" : "cached-access-token");
635
667
  });
636
- root.command("attendance").description("List Meet participants and participant sessions").option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}").option("--conference-record <name>", "Conference record name or id").option("--today", "Find a Meet link on today's calendar").option("--event <query>", "Find a matching calendar event with a Meet link").option("--calendar <id>", "Calendar id for --today or --event", "primary").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--page-size <n>", "Max resources per Meet API page").option("--all-conference-records", "Fetch every conference record for --meeting").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) => {
637
- const resolved = resolveArtifactTokenOptions(params.config, options);
638
- const token = await resolveGoogleMeetAccessToken(resolved);
639
- const meeting = resolved.conferenceRecord ? resolved.meeting : (await resolveMeetingForToken({
640
- config: params.config,
641
- options,
642
- accessToken: token.accessToken,
643
- configuredMeeting: resolved.meeting
644
- })).meeting;
645
- const result = await fetchGoogleMeetAttendance({
646
- accessToken: token.accessToken,
647
- meeting,
648
- conferenceRecord: resolved.conferenceRecord,
649
- pageSize: resolved.pageSize,
650
- allConferenceRecords: resolved.allConferenceRecords,
651
- mergeDuplicateParticipants: resolved.mergeDuplicateParticipants,
652
- lateAfterMinutes: resolved.lateAfterMinutes,
653
- earlyBeforeMinutes: resolved.earlyBeforeMinutes
654
- });
668
+ 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) => {
669
+ const resolved = await resolveCliArtifactQuery(params, options);
670
+ const result = await fetchResolvedGoogleMeetAttendance(resolved);
655
671
  if (options.json) {
656
672
  await writeCliOutput(options, JSON.stringify({
657
673
  ...result,
658
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token"
674
+ tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
659
675
  }, null, 2));
660
676
  return;
661
677
  }
@@ -669,42 +685,17 @@ function registerGoogleMeetArtifactCommands(context) {
669
685
  }
670
686
  if (options.format && options.format !== "summary") throw new Error("Unsupported format. Expected summary, markdown, or csv.");
671
687
  writeAttendanceSummary(result);
672
- writeStdoutLine("token source: %s", token.refreshed ? "refresh-token" : "cached-access-token");
688
+ writeStdoutLine("token source: %s", resolved.token.refreshed ? "refresh-token" : "cached-access-token");
673
689
  });
674
- root.command("export").description("Write Meet artifacts, attendance, transcript, and raw JSON into a folder").option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}").option("--conference-record <name>", "Conference record name or id").option("--today", "Find a Meet link on today's calendar").option("--event <query>", "Find a matching calendar event with a Meet link").option("--calendar <id>", "Calendar id for --today or --event", "primary").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--page-size <n>", "Max resources per Meet API page").option("--all-conference-records", "Fetch every conference record for --meeting").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) => {
675
- const resolved = resolveArtifactTokenOptions(params.config, options);
676
- const token = await resolveGoogleMeetAccessToken(resolved);
677
- const meetingResult = resolved.conferenceRecord ? { meeting: resolved.meeting } : await resolveMeetingForToken({
678
- config: params.config,
679
- options,
680
- accessToken: token.accessToken,
681
- configuredMeeting: resolved.meeting
682
- });
683
- const artifacts = await fetchGoogleMeetArtifacts({
684
- accessToken: token.accessToken,
685
- meeting: meetingResult.meeting,
686
- conferenceRecord: resolved.conferenceRecord,
687
- pageSize: resolved.pageSize,
688
- includeTranscriptEntries: resolved.includeTranscriptEntries,
689
- allConferenceRecords: resolved.allConferenceRecords,
690
- includeDocumentBodies: resolved.includeDocumentBodies
691
- });
692
- const attendance = await fetchGoogleMeetAttendance({
693
- accessToken: token.accessToken,
694
- meeting: meetingResult.meeting,
695
- conferenceRecord: resolved.conferenceRecord,
696
- pageSize: resolved.pageSize,
697
- allConferenceRecords: resolved.allConferenceRecords,
698
- mergeDuplicateParticipants: resolved.mergeDuplicateParticipants,
699
- lateAfterMinutes: resolved.lateAfterMinutes,
700
- earlyBeforeMinutes: resolved.earlyBeforeMinutes
701
- });
702
- const resolvedMeeting = meetingResult.meeting ?? resolved.meeting;
690
+ 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) => {
691
+ const resolved = await resolveCliArtifactQuery(params, options);
692
+ const artifacts = await fetchResolvedGoogleMeetArtifacts(resolved);
693
+ const attendance = await fetchResolvedGoogleMeetAttendance(resolved);
703
694
  const request = {
704
- ...resolvedMeeting ? { meeting: resolvedMeeting } : {},
695
+ ...resolved.meeting ? { meeting: resolved.meeting } : {},
705
696
  ...resolved.conferenceRecord ? { conferenceRecord: resolved.conferenceRecord } : {},
706
- ...meetingResult.calendarEvent?.event.id ? { calendarEventId: meetingResult.calendarEvent.event.id } : {},
707
- ...meetingResult.calendarEvent?.event.summary ? { calendarEventSummary: meetingResult.calendarEvent.event.summary } : {},
697
+ ...resolved.calendarEvent?.event.id ? { calendarEventId: resolved.calendarEvent.event.id } : {},
698
+ ...resolved.calendarEvent?.event.summary ? { calendarEventSummary: resolved.calendarEvent.event.summary } : {},
708
699
  ...options.calendar ? { calendarId: options.calendar } : {},
709
700
  ...resolved.pageSize !== void 0 ? { pageSize: resolved.pageSize } : {},
710
701
  includeTranscriptEntries: resolved.includeTranscriptEntries,
@@ -722,11 +713,11 @@ function registerGoogleMeetArtifactCommands(context) {
722
713
  attendance,
723
714
  files: googleMeetExportFileNames(),
724
715
  request,
725
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token",
726
- ...meetingResult.calendarEvent ? { calendarEvent: meetingResult.calendarEvent } : {}
716
+ tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token",
717
+ ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
727
718
  }),
728
- ...meetingResult.calendarEvent ? { calendarEvent: meetingResult.calendarEvent } : {},
729
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token"
719
+ ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {},
720
+ tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
730
721
  });
731
722
  return;
732
723
  }
@@ -736,13 +727,13 @@ function registerGoogleMeetArtifactCommands(context) {
736
727
  attendance,
737
728
  zip: Boolean(options.zip),
738
729
  request,
739
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token",
740
- ...meetingResult.calendarEvent ? { calendarEvent: meetingResult.calendarEvent } : {}
730
+ tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token",
731
+ ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
741
732
  });
742
733
  const payload = {
743
734
  ...bundle,
744
- ...meetingResult.calendarEvent ? { calendarEvent: meetingResult.calendarEvent } : {},
745
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token"
735
+ ...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {},
736
+ tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token"
746
737
  };
747
738
  if (options.json) {
748
739
  writeStdoutJson(payload);
@@ -904,8 +895,8 @@ function registerGoogleMeetProbeCommands(context) {
904
895
  root.command("join").argument("[url]", "Explicit https://meet.google.com/... URL").option("--transport <transport>", "Transport: chrome, chrome-node, or twilio").option("--mode <mode>", "Mode: agent, bidi, or transcribe").option("--message <text>", "Realtime speech to trigger after join").option("--dial-in-number <phone>", "Meet dial-in number for Twilio transport").option("--pin <pin>", "Meet phone PIN; # is appended if omitted").option("--dtmf-sequence <sequence>", "Explicit Twilio DTMF sequence").action(async (url, options) => {
905
896
  const payload = {
906
897
  url: resolveMeetingInput(params.config, url),
907
- transport: options.transport,
908
- mode: options.mode,
898
+ transport: parseGoogleMeetTransport(options.transport),
899
+ mode: parseGoogleMeetMode(options.mode),
909
900
  message: options.message,
910
901
  dialInNumber: options.dialInNumber,
911
902
  pin: options.pin,
@@ -927,8 +918,8 @@ function registerGoogleMeetProbeCommands(context) {
927
918
  root.command("test-speech").argument("[url]", "Explicit https://meet.google.com/... URL").option("--transport <transport>", "Transport: chrome, chrome-node, or twilio").option("--mode <mode>", "Mode: agent, bidi, or transcribe").option("--message <text>", "Realtime speech to trigger", "Say exactly: Google Meet speech test complete.").action(async (url, options) => {
928
919
  const payload = {
929
920
  url: resolveMeetingInput(params.config, url),
930
- transport: options.transport,
931
- mode: options.mode,
921
+ transport: parseGoogleMeetTransport(options.transport),
922
+ mode: parseGoogleMeetMode(options.mode),
932
923
  message: options.message
933
924
  };
934
925
  const delegated = await callGoogleMeetGateway({
@@ -946,7 +937,7 @@ function registerGoogleMeetProbeCommands(context) {
946
937
  root.command("test-listen").argument("[url]", "Explicit https://meet.google.com/... URL").option("--transport <transport>", "Transport: chrome or chrome-node").option("--timeout-ms <ms>", "How long to wait for fresh captions/transcript movement").action(async (url, options) => {
947
938
  const payload = {
948
939
  url: resolveMeetingInput(params.config, url),
949
- transport: options.transport,
940
+ transport: parseGoogleMeetBrowserTransport(options.transport),
950
941
  timeoutMs: parsePositiveNumber(options.timeoutMs, "timeout-ms")
951
942
  };
952
943
  const delegated = await callGoogleMeetGateway({
@@ -1006,7 +997,7 @@ function registerGoogleMeetLifecycleCommands(context) {
1006
997
  root.command("recover-tab").description("Focus and inspect an existing Google Meet tab").argument("[url]", "Optional Meet URL to match").option("--transport <transport>", "Transport to inspect: chrome or chrome-node").option("--json", "Print JSON output", false).action(async (url, options) => {
1007
998
  const result = await (await params.ensureRuntime()).recoverCurrentTab({
1008
999
  url,
1009
- transport: options.transport
1000
+ transport: parseGoogleMeetBrowserTransport(options.transport)
1010
1001
  });
1011
1002
  if (options.json) {
1012
1003
  writeStdoutJson(result);
@@ -1016,14 +1007,16 @@ function registerGoogleMeetLifecycleCommands(context) {
1016
1007
  });
1017
1008
  root.command("setup").description("Show Google Meet transport setup status").option("--transport <transport>", "Transport to check: chrome, chrome-node, or twilio").option("--mode <mode>", "Mode to check: agent, bidi, or transcribe").option("--json", "Print JSON output", false).action(async (options) => {
1018
1009
  const status = await (await params.ensureRuntime()).setupStatus({
1019
- transport: options.transport,
1020
- mode: options.mode
1010
+ transport: parseGoogleMeetTransport(options.transport),
1011
+ mode: parseGoogleMeetMode(options.mode)
1021
1012
  });
1022
1013
  if (options.json) {
1023
1014
  writeStdoutJson(status);
1015
+ if (!status.ok) process.exitCode = 1;
1024
1016
  return;
1025
1017
  }
1026
1018
  writeSetupStatus(status);
1019
+ if (!status.ok) process.exitCode = 1;
1027
1020
  });
1028
1021
  root.command("leave").argument("<session-id>", "Meet session ID").action(async (sessionId) => {
1029
1022
  const delegated = await callGoogleMeetGateway({
@@ -1065,10 +1058,24 @@ function registerGoogleMeetLifecycleCommands(context) {
1065
1058
  }
1066
1059
  //#endregion
1067
1060
  //#region extensions/google-meet/src/cli-space-commands.ts
1061
+ function writeGoogleMeetCreateOutput(payload, json) {
1062
+ if (json) {
1063
+ writeStdoutJson(payload);
1064
+ return;
1065
+ }
1066
+ writeStdoutLine("meeting uri: %s", payload.meetingUri);
1067
+ if (payload.space?.name) writeStdoutLine("space: %s", payload.space.name);
1068
+ if (payload.space?.meetingCode) writeStdoutLine("meeting code: %s", payload.space.meetingCode);
1069
+ if (payload.source) writeStdoutLine("source: %s", payload.source);
1070
+ if (payload.browser?.nodeId) writeStdoutLine("node: %s", payload.browser.nodeId);
1071
+ if (payload.tokenSource) writeStdoutLine("token source: %s", payload.tokenSource);
1072
+ const joinedSessionId = payload.joined ? payload.join?.session?.id : void 0;
1073
+ writeStdoutLine(joinedSessionId ? "joined: %s" : "joined: no (run `openclaw googlemeet join %s`)", joinedSessionId ?? payload.meetingUri);
1074
+ }
1068
1075
  function registerGoogleMeetCreateCommands(context) {
1069
1076
  const params = context;
1070
- const { root, callGateway, operationTimeoutMs, hasCreateOAuth, resolveMeetingInput, resolveOAuthTokenOptions } = context;
1071
- root.command("create").description("Create a new Google Meet space and print its meeting URL").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--access-type <type>", "Google Meet SpaceConfig accessType for API create: OPEN, TRUSTED, or RESTRICTED").option("--entry-point-access <type>", "Google Meet SpaceConfig entryPointAccess for API create: ALL or CREATOR_APP_ONLY").option("--no-join", "Only create the meeting URL; do not join it").option("--transport <transport>", "Join transport: chrome, chrome-node, or twilio").option("--mode <mode>", "Join mode: agent, bidi, or transcribe").option("--message <text>", "Realtime speech to trigger after join").option("--dial-in-number <phone>", "Meet dial-in number for Twilio transport").option("--pin <pin>", "Meet phone PIN; # is appended if omitted").option("--dtmf-sequence <sequence>", "Explicit Twilio DTMF sequence").option("--json", "Print JSON output", false).action(async (options) => {
1077
+ const { root, callGateway, operationTimeoutMs, hasCreateOAuth, resolveMeetingInput, resolveCliParams } = context;
1078
+ addGoogleMeetOAuthOptions(root.command("create").description("Create a new Google Meet space and print its meeting URL")).option("--access-type <type>", "Google Meet SpaceConfig accessType for API create: OPEN, TRUSTED, or RESTRICTED").option("--entry-point-access <type>", "Google Meet SpaceConfig entryPointAccess for API create: ALL or CREATOR_APP_ONLY").option("--no-join", "Only create the meeting URL; do not join it").option("--transport <transport>", "Join transport: chrome, chrome-node, or twilio").option("--mode <mode>", "Join mode: agent, bidi, or transcribe").option("--message <text>", "Realtime speech to trigger after join").option("--dial-in-number <phone>", "Meet dial-in number for Twilio transport").option("--pin <pin>", "Meet phone PIN; # is appended if omitted").option("--dtmf-sequence <sequence>", "Explicit Twilio DTMF sequence").option("--json", "Print JSON output", false).action(async (options) => {
1072
1079
  if (options.join !== false) {
1073
1080
  const delegated = await callGoogleMeetGateway({
1074
1081
  callGateway,
@@ -1078,18 +1085,7 @@ function registerGoogleMeetCreateCommands(context) {
1078
1085
  });
1079
1086
  if (delegated.ok) {
1080
1087
  const payload = delegated.payload;
1081
- if (options.json) {
1082
- writeStdoutJson(payload);
1083
- return;
1084
- }
1085
- writeStdoutLine("meeting uri: %s", payload.meetingUri);
1086
- if (payload.space?.name) writeStdoutLine("space: %s", payload.space.name);
1087
- if (payload.space?.meetingCode) writeStdoutLine("meeting code: %s", payload.space.meetingCode);
1088
- if (payload.source) writeStdoutLine("source: %s", payload.source);
1089
- if (payload.browser?.nodeId) writeStdoutLine("node: %s", payload.browser.nodeId);
1090
- if (payload.tokenSource) writeStdoutLine("token source: %s", payload.tokenSource);
1091
- if (payload.joined && payload.join?.session?.id) writeStdoutLine("joined: %s", payload.join.session.id);
1092
- else writeStdoutLine("joined: no (run `openclaw googlemeet join %s`)", payload.meetingUri);
1088
+ writeGoogleMeetCreateOutput(payload, options.json);
1093
1089
  return;
1094
1090
  }
1095
1091
  }
@@ -1099,14 +1095,14 @@ function registerGoogleMeetCreateCommands(context) {
1099
1095
  const result = await rt.createViaBrowser();
1100
1096
  const join = options.join !== false ? await rt.join({
1101
1097
  url: result.meetingUri,
1102
- transport: options.transport,
1103
- mode: options.mode,
1098
+ transport: parseGoogleMeetTransport(options.transport),
1099
+ mode: parseGoogleMeetMode(options.mode),
1104
1100
  message: options.message,
1105
1101
  dialInNumber: options.dialInNumber,
1106
1102
  pin: options.pin,
1107
1103
  dtmfSequence: options.dtmfSequence
1108
1104
  }) : void 0;
1109
- const payload = {
1105
+ writeGoogleMeetCreateOutput({
1110
1106
  source: result.source,
1111
1107
  meetingUri: result.meetingUri,
1112
1108
  joined: Boolean(join),
@@ -1117,50 +1113,32 @@ function registerGoogleMeetCreateCommands(context) {
1117
1113
  browserUrl: result.browserUrl,
1118
1114
  browserTitle: result.browserTitle
1119
1115
  }
1120
- };
1121
- if (options.json) {
1122
- writeStdoutJson(payload);
1123
- return;
1124
- }
1125
- writeStdoutLine("meeting uri: %s", result.meetingUri);
1126
- writeStdoutLine("source: browser");
1127
- writeStdoutLine("node: %s", result.nodeId);
1128
- if (join) writeStdoutLine("joined: %s", join.session.id);
1129
- else writeStdoutLine("joined: no (run `openclaw googlemeet join %s`)", result.meetingUri);
1116
+ }, options.json);
1130
1117
  return;
1131
1118
  }
1132
- const token = await resolveGoogleMeetAccessToken(resolveOAuthTokenOptions(params.config, options));
1119
+ const token = await resolveGoogleMeetTokenFromParams(params.config, resolveCliParams(options));
1133
1120
  const result = await createGoogleMeetSpace({
1134
1121
  accessToken: token.accessToken,
1135
1122
  config: resolveCreateSpaceConfig(options)
1136
1123
  });
1137
1124
  const join = options.join !== false ? await (await params.ensureRuntime()).join({
1138
1125
  url: result.meetingUri,
1139
- transport: options.transport,
1140
- mode: options.mode,
1126
+ transport: parseGoogleMeetTransport(options.transport),
1127
+ mode: parseGoogleMeetMode(options.mode),
1141
1128
  message: options.message,
1142
1129
  dialInNumber: options.dialInNumber,
1143
1130
  pin: options.pin,
1144
1131
  dtmfSequence: options.dtmfSequence
1145
1132
  }) : void 0;
1146
- if (options.json) {
1147
- writeStdoutJson({
1148
- ...result,
1149
- tokenSource: token.refreshed ? "refresh-token" : "cached-access-token",
1150
- joined: Boolean(join),
1151
- ...join ? { join } : {}
1152
- });
1153
- return;
1154
- }
1155
- writeStdoutLine("meeting uri: %s", result.meetingUri);
1156
- writeStdoutLine("space: %s", result.space.name);
1157
- if (result.space.meetingCode) writeStdoutLine("meeting code: %s", result.space.meetingCode);
1158
- writeStdoutLine("token source: %s", token.refreshed ? "refresh-token" : "cached-access-token");
1159
- if (join) writeStdoutLine("joined: %s", join.session.id);
1160
- else writeStdoutLine("joined: no (run `openclaw googlemeet join %s`)", result.meetingUri);
1133
+ writeGoogleMeetCreateOutput({
1134
+ ...result,
1135
+ tokenSource: token.refreshed ? "refresh-token" : "cached-access-token",
1136
+ joined: Boolean(join),
1137
+ ...join ? { join } : {}
1138
+ }, options.json);
1161
1139
  });
1162
- root.command("end-active-conference").description("End the active conference for a Google Meet space").argument("[meeting]", "Meet URL, meeting code, or spaces/{id}").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--json", "Print JSON output", false).action(async (meeting, options) => {
1163
- const token = await resolveGoogleMeetAccessToken(resolveOAuthTokenOptions(params.config, options));
1140
+ addGoogleMeetOAuthOptions(root.command("end-active-conference").description("End the active conference for a Google Meet space").argument("[meeting]", "Meet URL, meeting code, or spaces/{id}")).option("--json", "Print JSON output", false).action(async (meeting, options) => {
1141
+ const token = await resolveGoogleMeetTokenFromParams(params.config, resolveCliParams(options));
1164
1142
  const result = await endGoogleMeetActiveConference({
1165
1143
  accessToken: token.accessToken,
1166
1144
  meeting: resolveMeetingInput(params.config, meeting ?? options.meeting)
@@ -1179,34 +1157,32 @@ function registerGoogleMeetCreateCommands(context) {
1179
1157
  }
1180
1158
  function registerGoogleMeetApiCommands(context) {
1181
1159
  const params = context;
1182
- const { root, resolveMeetingForToken, resolveOAuthTokenOptions, resolveTokenOptions } = context;
1183
- root.command("resolve-space").description("Resolve a Meet URL, meeting code, or spaces/{id} to its canonical space").option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--json", "Print JSON output", false).action(async (options) => {
1184
- const resolved = resolveTokenOptions(params.config, options);
1185
- const token = await resolveGoogleMeetAccessToken(resolved);
1186
- const space = await fetchGoogleMeetSpace({
1187
- accessToken: token.accessToken,
1188
- meeting: resolved.meeting
1160
+ const { root, resolveCliParams, resolveMeetingInput } = context;
1161
+ addGoogleMeetOAuthOptions(addGoogleMeetMeetingOption(root.command("resolve-space").description("Resolve a Meet URL, meeting code, or spaces/{id} to its canonical space"))).option("--json", "Print JSON output", false).action(async (options) => {
1162
+ const meeting = resolveMeetingInput(params.config, options.meeting);
1163
+ const { space, token } = await resolveSpaceFromParams(params.config, {
1164
+ ...resolveCliParams(options),
1165
+ meeting
1189
1166
  });
1190
1167
  if (options.json) {
1191
1168
  writeStdoutJson(space);
1192
1169
  return;
1193
1170
  }
1194
- writeStdoutLine("input: %s", resolved.meeting);
1171
+ writeStdoutLine("input: %s", meeting);
1195
1172
  writeStdoutLine("space: %s", space.name);
1196
1173
  if (space.meetingCode) writeStdoutLine("meeting code: %s", space.meetingCode);
1197
1174
  if (space.meetingUri) writeStdoutLine("meeting uri: %s", space.meetingUri);
1198
1175
  writeStdoutLine("active conference: %s", space.activeConference ? "yes" : "no");
1199
1176
  writeStdoutLine("token source: %s", token.refreshed ? "refresh-token" : "cached-access-token");
1200
1177
  });
1201
- root.command("preflight").description("Validate OAuth + meeting resolution prerequisites for Meet media work").option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--json", "Print JSON output", false).action(async (options) => {
1202
- const resolved = resolveTokenOptions(params.config, options);
1203
- const token = await resolveGoogleMeetAccessToken(resolved);
1204
- const space = await fetchGoogleMeetSpace({
1205
- accessToken: token.accessToken,
1206
- meeting: resolved.meeting
1178
+ addGoogleMeetOAuthOptions(addGoogleMeetMeetingOption(root.command("preflight").description("Validate OAuth + meeting resolution prerequisites for Meet media work"))).option("--json", "Print JSON output", false).action(async (options) => {
1179
+ const meeting = resolveMeetingInput(params.config, options.meeting);
1180
+ const { space, token } = await resolveSpaceFromParams(params.config, {
1181
+ ...resolveCliParams(options),
1182
+ meeting
1207
1183
  });
1208
1184
  const report = buildGoogleMeetPreflightReport({
1209
- input: resolved.meeting,
1185
+ input: meeting,
1210
1186
  space,
1211
1187
  previewAcknowledged: params.config.preview.enrollmentAcknowledged,
1212
1188
  tokenSource: token.refreshed ? "refresh-token" : "cached-access-token"
@@ -1229,13 +1205,18 @@ function registerGoogleMeetApiCommands(context) {
1229
1205
  writeStdoutLine("blockers:");
1230
1206
  for (const blocker of report.blockers) writeStdoutLine("- %s", blocker);
1231
1207
  });
1232
- root.command("latest").description("Find the latest Meet conference record for a meeting").option("--meeting <value>", "Meet URL, meeting code, or spaces/{id}").option("--today", "Find a Meet link on today's calendar").option("--event <query>", "Find a matching calendar event with a Meet link").option("--calendar <id>", "Calendar id for --today or --event", "primary").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--json", "Print JSON output", false).action(async (options) => {
1233
- const token = await resolveGoogleMeetAccessToken(resolveOAuthTokenOptions(params.config, options));
1234
- const resolved = await resolveMeetingForToken({
1208
+ addGoogleMeetOAuthOptions(addGoogleMeetCalendarOptions(addGoogleMeetMeetingOption(root.command("latest").description("Find the latest Meet conference record for a meeting")))).option("--json", "Print JSON output", false).action(async (options) => {
1209
+ const raw = resolveCliParams(options);
1210
+ const token = await resolveGoogleMeetTokenFromParams(params.config, raw);
1211
+ if (!options.today && !options.event?.trim()) {
1212
+ const meeting = options.meeting?.trim() || params.config.defaults.meeting;
1213
+ if (!meeting) throw new Error("Meeting input is required. Pass --meeting, --today, --event, or configure defaults.meeting.");
1214
+ raw.meeting = meeting;
1215
+ }
1216
+ const resolved = await resolveMeetingFromParams({
1235
1217
  config: params.config,
1236
- options,
1237
- accessToken: token.accessToken,
1238
- configuredMeeting: options.meeting?.trim()
1218
+ raw,
1219
+ accessToken: token.accessToken
1239
1220
  });
1240
1221
  const result = await fetchLatestGoogleMeetConferenceRecord({
1241
1222
  accessToken: token.accessToken,
@@ -1257,7 +1238,7 @@ function registerGoogleMeetApiCommands(context) {
1257
1238
  writeStdoutLine("token source: %s", token.refreshed ? "refresh-token" : "cached-access-token");
1258
1239
  });
1259
1240
  root.command("calendar-events").description("Preview Calendar events with Google Meet links").option("--today", "Find Meet links on today's calendar").option("--event <query>", "Find matching calendar events with Meet links").option("--calendar <id>", "Calendar id for lookup", "primary").option("--access-token <token>", "Access token override").option("--refresh-token <token>", "Refresh token override").option("--client-id <id>", "OAuth client id override").option("--client-secret <secret>", "OAuth client secret override").option("--expires-at <ms>", "Cached access token expiry as unix epoch milliseconds").option("--json", "Print JSON output", false).action(async (options) => {
1260
- const token = await resolveGoogleMeetAccessToken(resolveOAuthTokenOptions(params.config, options));
1241
+ const token = await resolveGoogleMeetTokenFromParams(params.config, resolveCliParams(options));
1261
1242
  const window = options.today ? buildGoogleMeetCalendarDayWindow() : {};
1262
1243
  const result = await listGoogleMeetCalendarEvents({
1263
1244
  accessToken: token.accessToken,
@@ -1284,67 +1265,30 @@ function resolveMeetingInput(config, value) {
1284
1265
  if (!meeting) throw new Error("Meeting input is required. Pass a URL/meeting code or configure defaults.meeting.");
1285
1266
  return meeting;
1286
1267
  }
1287
- function resolveOAuthTokenOptions(config, options) {
1288
- return {
1289
- clientId: options.clientId?.trim() || config.oauth.clientId,
1290
- clientSecret: options.clientSecret?.trim() || config.oauth.clientSecret,
1291
- refreshToken: options.refreshToken?.trim() || config.oauth.refreshToken,
1292
- accessToken: options.accessToken?.trim() || config.oauth.accessToken,
1293
- expiresAt: parseOptionalNumber(options.expiresAt) ?? config.oauth.expiresAt
1294
- };
1295
- }
1296
- function resolveTokenOptions(config, options) {
1297
- return {
1298
- meeting: resolveMeetingInput(config, options.meeting),
1299
- ...resolveOAuthTokenOptions(config, options)
1300
- };
1301
- }
1302
1268
  function hasCalendarLookupOptions(options) {
1303
1269
  return Boolean(options.today || options.event?.trim());
1304
1270
  }
1305
- async function resolveCalendarMeetingInput(params) {
1306
- if (!hasCalendarLookupOptions(params.options)) return {};
1307
- const window = params.options.today ? buildGoogleMeetCalendarDayWindow() : {};
1308
- const calendarEvent = await findGoogleMeetCalendarEvent({
1309
- accessToken: params.accessToken,
1310
- calendarId: params.options.calendar,
1311
- eventQuery: params.options.event,
1312
- ...window
1313
- });
1271
+ function resolveCliParams(options) {
1272
+ const { calendar, expiresAt, ...raw } = options;
1314
1273
  return {
1315
- meeting: calendarEvent.meetingUri,
1316
- calendarEvent
1274
+ ...raw,
1275
+ calendarId: calendar,
1276
+ expiresAt: parseOptionalNumber(expiresAt)
1317
1277
  };
1318
1278
  }
1319
- async function resolveMeetingForToken(params) {
1320
- const calendarMeeting = await resolveCalendarMeetingInput({
1321
- accessToken: params.accessToken,
1322
- options: params.options
1323
- });
1324
- const meeting = calendarMeeting.meeting ?? params.configuredMeeting ?? params.config.defaults.meeting;
1325
- if (!meeting) throw new Error("Meeting input is required. Pass --meeting, --today, --event, or configure defaults.meeting.");
1326
- return calendarMeeting.calendarEvent ? {
1327
- meeting,
1328
- calendarEvent: calendarMeeting.calendarEvent
1329
- } : { meeting };
1330
- }
1331
- function resolveArtifactTokenOptions(config, options) {
1279
+ function resolveCliArtifactParams(config, options) {
1332
1280
  const meeting = options.meeting?.trim() || config.defaults.meeting;
1333
1281
  const conferenceRecord = options.conferenceRecord?.trim();
1334
1282
  if (!meeting && !conferenceRecord && !hasCalendarLookupOptions(options)) throw new Error("Meeting input or conference record is required. Pass --meeting, --today, --event, --conference-record, or configure defaults.meeting.");
1335
1283
  return {
1284
+ ...resolveCliParams(options),
1336
1285
  meeting,
1337
1286
  conferenceRecord,
1338
- clientId: options.clientId?.trim() || config.oauth.clientId,
1339
- clientSecret: options.clientSecret?.trim() || config.oauth.clientSecret,
1340
- refreshToken: options.refreshToken?.trim() || config.oauth.refreshToken,
1341
- accessToken: options.accessToken?.trim() || config.oauth.accessToken,
1342
- expiresAt: parseOptionalNumber(options.expiresAt) ?? config.oauth.expiresAt,
1343
1287
  pageSize: parsePositiveIntegerOption(options.pageSize, "page-size"),
1344
- includeTranscriptEntries: options.transcriptEntries !== false,
1345
- allConferenceRecords: Boolean(options.allConferenceRecords),
1346
- includeDocumentBodies: Boolean(options.includeDocBodies),
1347
- mergeDuplicateParticipants: options.mergeDuplicates !== false,
1288
+ includeTranscriptEntries: options.transcriptEntries,
1289
+ includeAllConferenceRecords: options.allConferenceRecords,
1290
+ includeDocumentBodies: options.includeDocBodies,
1291
+ mergeDuplicateParticipants: options.mergeDuplicates,
1348
1292
  lateAfterMinutes: parseOptionalNumber(options.lateAfterMinutes),
1349
1293
  earlyBeforeMinutes: parseOptionalNumber(options.earlyBeforeMinutes)
1350
1294
  };
@@ -1360,8 +1304,8 @@ function registerGoogleMeetCli(params) {
1360
1304
  const clientId = options.clientId?.trim() || params.config.oauth.clientId;
1361
1305
  const clientSecret = options.clientSecret?.trim() || params.config.oauth.clientSecret;
1362
1306
  if (!clientId) throw new Error("Missing Google Meet OAuth client id. Configure oauth.clientId or pass --client-id.");
1363
- const { verifier, challenge } = createGoogleMeetPkce();
1364
- const state = createGoogleMeetOAuthState();
1307
+ const { verifier, challenge } = generateHexPkceVerifierChallenge();
1308
+ const state = generateOAuthState();
1365
1309
  const authUrl = buildGoogleMeetAuthUrl({
1366
1310
  clientId,
1367
1311
  challenge,
@@ -1402,10 +1346,8 @@ function registerGoogleMeetCli(params) {
1402
1346
  callGateway,
1403
1347
  operationTimeoutMs,
1404
1348
  resolveMeetingInput,
1405
- resolveOAuthTokenOptions,
1406
- resolveTokenOptions,
1407
- resolveMeetingForToken,
1408
- resolveArtifactTokenOptions,
1349
+ resolveCliParams,
1350
+ resolveCliArtifactParams: (options) => resolveCliArtifactParams(params.config, options),
1409
1351
  hasCreateOAuth
1410
1352
  };
1411
1353
  registerGoogleMeetCreateCommands(context);