@openclaw/google-meet 2026.7.2-beta.5 → 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.
- package/dist/chrome-create-PKAyxCiL.js +325 -0
- package/dist/{cli-GeuAaEIy.js → cli-o7RWVqDb.js} +166 -234
- package/dist/{config-BcaS1BDr.js → config-wBK8loBb.js} +97 -221
- package/dist/{create-af1MDlus.js → create-UHeaRzsH.js} +3 -14
- package/dist/google-meet-platform-adapter-C3J-iFRE.js +791 -0
- package/dist/google-meet-platform-constants-Bs5iAg3E.js +25 -0
- package/dist/index.js +185 -2639
- package/dist/meet-url-BP2Jlvjs.js +17 -0
- package/dist/node-host-BXtXbsMa.js +49 -0
- package/dist/node-invoke-policy-B0gOlLJR.js +24 -0
- package/dist/{oauth-DOfMKlGp.js → oauth-9sUJ68Mw.js} +3 -14
- package/dist/{chrome-create-DMKruRFW.js → plugin-helpers-CfeT1SYY.js} +335 -355
- package/dist/plugin-registration-rSOssQmm.js +141 -0
- package/dist/runtime-B8d1beHo.js +1308 -0
- package/openclaw.plugin.json +8 -47
- package/package.json +4 -4
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/LICENSE +0 -0
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/README.md +0 -0
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/lib/util.js +0 -0
- /package/node_modules/{core-util-is → jszip/node_modules/core-util-is}/package.json +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/LICENSE.txt +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/README.md +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/dist/immediate.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/dist/immediate.min.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/lib/browser.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/lib/index.js +0 -0
- /package/node_modules/{immediate → jszip/node_modules/immediate}/package.json +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/LICENSE +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/README.md +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/inherits.js +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/inherits_browser.js +0 -0
- /package/node_modules/{inherits → jszip/node_modules/inherits}/package.json +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/.npmignore +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/.travis.yml +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/Makefile +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/README.md +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/component.json +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/index.js +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/package.json +0 -0
- /package/node_modules/{isarray → jszip/node_modules/isarray}/test.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/README.md +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.min.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.polyfill.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/dist/lie.polyfill.min.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/lib/browser.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/lib/index.js +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/license.md +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/lie.d.ts +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/package.json +0 -0
- /package/node_modules/{lie → jszip/node_modules/lie}/polyfill.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/CHANGELOG.md +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/LICENSE +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/README.md +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako.min.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_deflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_deflate.min.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_inflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/dist/pako_inflate.min.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/index.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/deflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/inflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/utils/common.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/utils/strings.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/README +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/adler32.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/constants.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/crc32.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/deflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/gzheader.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inffast.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inflate.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/inftrees.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/messages.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/trees.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/lib/zlib/zstream.js +0 -0
- /package/node_modules/{pako → jszip/node_modules/pako}/package.json +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/index.js +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/license.md +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/package.json +0 -0
- /package/node_modules/{process-nextick-args → jszip/node_modules/process-nextick-args}/readme.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/.travis.yml +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/CONTRIBUTING.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/GOVERNANCE.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/LICENSE +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/README.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/doc/wg-meetings/2015-01-30.md +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/duplex-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/duplex.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_duplex.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_passthrough.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_readable.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_transform.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/_stream_writable.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/BufferList.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/destroy.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/stream-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/lib/internal/streams/stream.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/package.json +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/passthrough.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/readable-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/readable.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/transform.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/writable-browser.js +0 -0
- /package/node_modules/{readable-stream → jszip/node_modules/readable-stream}/writable.js +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/LICENSE +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/README.md +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/index.d.ts +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/index.js +0 -0
- /package/node_modules/{safe-buffer → jszip/node_modules/safe-buffer}/package.json +0 -0
- /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/LICENSE.txt +0 -0
- /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/package.json +0 -0
- /package/node_modules/{setimmediate → jszip/node_modules/setimmediate}/setImmediate.js +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/.travis.yml +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/LICENSE +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/README.md +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/lib/string_decoder.js +0 -0
- /package/node_modules/{string_decoder → jszip/node_modules/string_decoder}/package.json +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/History.md +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/LICENSE +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/README.md +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/browser.js +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/node.js +0 -0
- /package/node_modules/{util-deprecate → jszip/node_modules/util-deprecate}/package.json +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/index.d.ts +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/index.js +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/license +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/package.json +0 -0
- /package/node_modules/{parse-ms → pretty-ms/node_modules/parse-ms}/readme.md +0 -0
|
@@ -1,16 +1,33 @@
|
|
|
1
|
-
import { n as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
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
|
|
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
|
|
603
|
-
root.command("artifacts").description("List Meet conference records and available participant/artifact metadata")
|
|
604
|
-
const resolved =
|
|
605
|
-
const
|
|
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")
|
|
637
|
-
const resolved =
|
|
638
|
-
const
|
|
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")
|
|
675
|
-
const resolved =
|
|
676
|
-
const
|
|
677
|
-
const
|
|
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
|
-
...
|
|
695
|
+
...resolved.meeting ? { meeting: resolved.meeting } : {},
|
|
705
696
|
...resolved.conferenceRecord ? { conferenceRecord: resolved.conferenceRecord } : {},
|
|
706
|
-
...
|
|
707
|
-
...
|
|
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
|
-
...
|
|
716
|
+
tokenSource: resolved.token.refreshed ? "refresh-token" : "cached-access-token",
|
|
717
|
+
...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
|
|
727
718
|
}),
|
|
728
|
-
...
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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,
|
|
1071
|
-
root.command("create").description("Create a new Google Meet space and print its meeting URL")
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
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}")
|
|
1163
|
-
const token = await
|
|
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,
|
|
1183
|
-
root.command("resolve-space").description("Resolve a Meet URL, meeting code, or spaces/{id} to its canonical space")
|
|
1184
|
-
const
|
|
1185
|
-
const token = await
|
|
1186
|
-
|
|
1187
|
-
|
|
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",
|
|
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")
|
|
1202
|
-
const
|
|
1203
|
-
const token = await
|
|
1204
|
-
|
|
1205
|
-
|
|
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:
|
|
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")
|
|
1233
|
-
const
|
|
1234
|
-
const
|
|
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
|
-
|
|
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
|
|
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,76 +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
|
-
|
|
1306
|
-
|
|
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
|
-
});
|
|
1314
|
-
return {
|
|
1315
|
-
meeting: calendarEvent.meetingUri,
|
|
1316
|
-
calendarEvent
|
|
1317
|
-
};
|
|
1318
|
-
}
|
|
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 resolveCreateTokenOptions(config, options) {
|
|
1271
|
+
function resolveCliParams(options) {
|
|
1272
|
+
const { calendar, expiresAt, ...raw } = options;
|
|
1332
1273
|
return {
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
accessToken: options.accessToken?.trim() || config.oauth.accessToken,
|
|
1337
|
-
expiresAt: parseOptionalNumber(options.expiresAt) ?? config.oauth.expiresAt
|
|
1274
|
+
...raw,
|
|
1275
|
+
calendarId: calendar,
|
|
1276
|
+
expiresAt: parseOptionalNumber(expiresAt)
|
|
1338
1277
|
};
|
|
1339
1278
|
}
|
|
1340
|
-
function
|
|
1279
|
+
function resolveCliArtifactParams(config, options) {
|
|
1341
1280
|
const meeting = options.meeting?.trim() || config.defaults.meeting;
|
|
1342
1281
|
const conferenceRecord = options.conferenceRecord?.trim();
|
|
1343
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.");
|
|
1344
1283
|
return {
|
|
1284
|
+
...resolveCliParams(options),
|
|
1345
1285
|
meeting,
|
|
1346
1286
|
conferenceRecord,
|
|
1347
|
-
clientId: options.clientId?.trim() || config.oauth.clientId,
|
|
1348
|
-
clientSecret: options.clientSecret?.trim() || config.oauth.clientSecret,
|
|
1349
|
-
refreshToken: options.refreshToken?.trim() || config.oauth.refreshToken,
|
|
1350
|
-
accessToken: options.accessToken?.trim() || config.oauth.accessToken,
|
|
1351
|
-
expiresAt: parseOptionalNumber(options.expiresAt) ?? config.oauth.expiresAt,
|
|
1352
1287
|
pageSize: parsePositiveIntegerOption(options.pageSize, "page-size"),
|
|
1353
|
-
includeTranscriptEntries: options.transcriptEntries
|
|
1354
|
-
|
|
1355
|
-
includeDocumentBodies:
|
|
1356
|
-
mergeDuplicateParticipants: options.mergeDuplicates
|
|
1288
|
+
includeTranscriptEntries: options.transcriptEntries,
|
|
1289
|
+
includeAllConferenceRecords: options.allConferenceRecords,
|
|
1290
|
+
includeDocumentBodies: options.includeDocBodies,
|
|
1291
|
+
mergeDuplicateParticipants: options.mergeDuplicates,
|
|
1357
1292
|
lateAfterMinutes: parseOptionalNumber(options.lateAfterMinutes),
|
|
1358
1293
|
earlyBeforeMinutes: parseOptionalNumber(options.earlyBeforeMinutes)
|
|
1359
1294
|
};
|
|
@@ -1369,8 +1304,8 @@ function registerGoogleMeetCli(params) {
|
|
|
1369
1304
|
const clientId = options.clientId?.trim() || params.config.oauth.clientId;
|
|
1370
1305
|
const clientSecret = options.clientSecret?.trim() || params.config.oauth.clientSecret;
|
|
1371
1306
|
if (!clientId) throw new Error("Missing Google Meet OAuth client id. Configure oauth.clientId or pass --client-id.");
|
|
1372
|
-
const { verifier, challenge } =
|
|
1373
|
-
const state =
|
|
1307
|
+
const { verifier, challenge } = generateHexPkceVerifierChallenge();
|
|
1308
|
+
const state = generateOAuthState();
|
|
1374
1309
|
const authUrl = buildGoogleMeetAuthUrl({
|
|
1375
1310
|
clientId,
|
|
1376
1311
|
challenge,
|
|
@@ -1411,11 +1346,8 @@ function registerGoogleMeetCli(params) {
|
|
|
1411
1346
|
callGateway,
|
|
1412
1347
|
operationTimeoutMs,
|
|
1413
1348
|
resolveMeetingInput,
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
resolveMeetingForToken,
|
|
1417
|
-
resolveCreateTokenOptions,
|
|
1418
|
-
resolveArtifactTokenOptions,
|
|
1349
|
+
resolveCliParams,
|
|
1350
|
+
resolveCliArtifactParams: (options) => resolveCliArtifactParams(params.config, options),
|
|
1419
1351
|
hasCreateOAuth
|
|
1420
1352
|
};
|
|
1421
1353
|
registerGoogleMeetCreateCommands(context);
|