@openclaw/google-meet 2026.8.1-beta.3 → 2026.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{cli-Bd63VJ5q.js → cli-D8EyxtkZ.js} +25 -20
- package/dist/{create-BEDHM6uL.js → create-Da-nAEHY.js} +2 -2
- package/dist/doctor-contract-api.js +3 -1
- package/dist/{google-api-errors-CDUYkIcK.js → google-api-errors-BDYXfKRa.js} +1 -1
- package/dist/index.js +5 -2
- package/dist/{oauth-9sUJ68Mw.js → oauth-DgBscjXK.js} +4 -3
- package/dist/{plugin-helpers-C9-Y0Ago.js → plugin-helpers-CiAxinMY.js} +5 -5
- package/dist/{plugin-registration-Csi-NdQU.js → plugin-registration-CeQ3RzYT.js} +3 -3
- package/dist/{runtime-B8d1beHo.js → runtime-BP1uG83z.js} +5 -3
- package/node_modules/typebox/build/format/date.d.mts +1 -1
- package/node_modules/typebox/build/format/date.mjs +1 -1
- package/node_modules/typebox/build/format/date_time.d.mts +2 -2
- package/node_modules/typebox/build/format/date_time.mjs +3 -3
- package/node_modules/typebox/build/format/email.d.mts +1 -1
- package/node_modules/typebox/build/format/email.mjs +2 -2
- package/node_modules/typebox/build/format/hostname.mjs +2 -10
- package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
- package/node_modules/typebox/build/format/idn_email.mjs +3 -3
- package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
- package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
- package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
- package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
- package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
- package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
- package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
- package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/idn-hostname.mjs +41 -0
- package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
- package/node_modules/typebox/build/format/idna/index.mjs +2 -0
- package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
- package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
- package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
- package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
- package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
- package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
- package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
- package/node_modules/typebox/build/format/ipv4.mjs +2 -32
- package/node_modules/typebox/build/format/ipv6.mjs +2 -61
- package/node_modules/typebox/build/format/iri.d.mts +2 -2
- package/node_modules/typebox/build/format/iri.mjs +26 -8
- package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
- package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
- package/node_modules/typebox/build/format/regex.d.mts +1 -2
- package/node_modules/typebox/build/format/regex.mjs +2 -6
- package/node_modules/typebox/build/format/time.d.mts +2 -2
- package/node_modules/typebox/build/format/time.mjs +19 -14
- package/node_modules/typebox/build/format/uri.d.mts +1 -1
- package/node_modules/typebox/build/format/uri.mjs +3 -130
- package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
- package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
- package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
- package/node_modules/typebox/build/format/uri_template.mjs +4 -5
- package/node_modules/typebox/build/format/url.d.mts +3 -3
- package/node_modules/typebox/build/format/url.mjs +4 -5
- package/node_modules/typebox/build/guard/emit.d.mts +3 -1
- package/node_modules/typebox/build/guard/emit.mjs +12 -5
- package/node_modules/typebox/build/guard/guard.d.mts +8 -2
- package/node_modules/typebox/build/guard/guard.mjs +25 -4
- package/node_modules/typebox/build/guard/string.d.mts +2 -2
- package/node_modules/typebox/build/guard/string.mjs +7 -7
- package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
- package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
- package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
- package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
- package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
- package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
- package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
- package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
- package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
- package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
- package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
- package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
- package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
- package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
- package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
- package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
- package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
- package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
- package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
- package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
- package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
- package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
- package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
- package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
- package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
- package/node_modules/typebox/build/schema/types/index.mjs +0 -2
- package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
- package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
- package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
- package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
- package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
- package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
- package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
- package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
- package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
- package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
- package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
- package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
- package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
- package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
- package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
- package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
- package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
- package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
- package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
- package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
- package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
- package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
- package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
- package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
- package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
- package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
- package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
- package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
- package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
- package/node_modules/typebox/build/type/script/parser.mjs +27 -23
- package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
- package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
- package/node_modules/typebox/package.json +27 -27
- package/node_modules/typebox/readme.md +79 -82
- package/package.json +5 -5
- package/node_modules/typebox/build/format/_idna.d.mts +0 -2
- package/node_modules/typebox/build/format/_idna.mjs +0 -246
- package/node_modules/typebox/build/format/_puny.d.mts +0 -1
- package/node_modules/typebox/build/format/_puny.mjs +0 -77
- package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
- package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
- package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
- package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
- package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
- package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as resolveGoogleMeetTokenFromParams, c as buildGoogleMeetPreflightReport, d as fetchGoogleMeetSpace, f as fetchLatestGoogleMeetConferenceRecord, i as resolveArtifactQueryFromParams, l as createGoogleMeetSpace, m as listGoogleMeetCalendarEvents, n as fetchResolvedGoogleMeetAttendance, o as resolveMeetingFromParams, p as buildGoogleMeetCalendarDayWindow, s as resolveSpaceFromParams, t as fetchResolvedGoogleMeetArtifacts, u as endGoogleMeetActiveConference } from "./plugin-helpers-
|
|
1
|
+
import { a as resolveGoogleMeetTokenFromParams, c as buildGoogleMeetPreflightReport, d as fetchGoogleMeetSpace, f as fetchLatestGoogleMeetConferenceRecord, i as resolveArtifactQueryFromParams, l as createGoogleMeetSpace, m as listGoogleMeetCalendarEvents, n as fetchResolvedGoogleMeetAttendance, o as resolveMeetingFromParams, p as buildGoogleMeetCalendarDayWindow, s as resolveSpaceFromParams, t as fetchResolvedGoogleMeetArtifacts, u as endGoogleMeetActiveConference } from "./plugin-helpers-CiAxinMY.js";
|
|
2
2
|
import { i as resolveGoogleMeetGatewayOperationTimeoutMs } from "./config-wBK8loBb.js";
|
|
3
|
-
import { buildGoogleMeetAuthUrl, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-
|
|
4
|
-
import { n as hasCreateSpaceConfigInput, r as resolveCreateSpaceConfig } from "./create-
|
|
3
|
+
import { buildGoogleMeetAuthUrl, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-DgBscjXK.js";
|
|
4
|
+
import { n as hasCreateSpaceConfigInput, r as resolveCreateSpaceConfig } from "./create-Da-nAEHY.js";
|
|
5
5
|
import { clampTimerTimeoutMs, parseStrictNonNegativeInteger, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
|
|
6
6
|
import { callGatewayFromCli, isGatewayClientRequestError, isGatewayTransportError } from "openclaw/plugin-sdk/gateway-runtime";
|
|
7
7
|
import { generateHexPkceVerifierChallenge } from "openclaw/plugin-sdk/provider-auth";
|
|
@@ -139,7 +139,8 @@ async function callGoogleMeetGateway(params) {
|
|
|
139
139
|
}
|
|
140
140
|
function formatDuration(value) {
|
|
141
141
|
if (value === void 0) return "n/a";
|
|
142
|
-
|
|
142
|
+
const roundedMs = Math.max(0, Math.round(value / 1e3) * 1e3);
|
|
143
|
+
return formatDurationCompact(roundedMs, {
|
|
143
144
|
showYears: true,
|
|
144
145
|
spaced: true
|
|
145
146
|
}) ?? "0ms";
|
|
@@ -656,6 +657,9 @@ async function resolveCliArtifactQuery(context, options) {
|
|
|
656
657
|
earlyBeforeMinutes
|
|
657
658
|
};
|
|
658
659
|
}
|
|
660
|
+
function resolveTokenSource(refreshed) {
|
|
661
|
+
return refreshed ? "refresh-token" : "cached-access-token";
|
|
662
|
+
}
|
|
659
663
|
function registerGoogleMeetArtifactCommands(context) {
|
|
660
664
|
const params = context;
|
|
661
665
|
const { root } = context;
|
|
@@ -665,7 +669,7 @@ function registerGoogleMeetArtifactCommands(context) {
|
|
|
665
669
|
if (options.json) {
|
|
666
670
|
await writeCliOutput(options, JSON.stringify({
|
|
667
671
|
...result,
|
|
668
|
-
tokenSource: resolved.token.refreshed
|
|
672
|
+
tokenSource: resolveTokenSource(resolved.token.refreshed)
|
|
669
673
|
}, null, 2));
|
|
670
674
|
return;
|
|
671
675
|
}
|
|
@@ -675,7 +679,7 @@ function registerGoogleMeetArtifactCommands(context) {
|
|
|
675
679
|
}
|
|
676
680
|
if (options.format && options.format !== "summary") throw new Error("Unsupported format. Expected summary or markdown.");
|
|
677
681
|
writeArtifactsSummary(result);
|
|
678
|
-
writeStdoutLine("token source: %s", resolved.token.refreshed
|
|
682
|
+
writeStdoutLine("token source: %s", resolveTokenSource(resolved.token.refreshed));
|
|
679
683
|
});
|
|
680
684
|
addGoogleMeetArtifactOptions(root.command("attendance").description("List Meet participants and participant sessions")).option("--no-merge-duplicates", "Keep duplicate participant resources as separate rows").option("--late-after-minutes <n>", "Mark participants late after this many minutes", "5").option("--early-before-minutes <n>", "Mark early leavers before this many minutes", "5").option("--format <format>", "Output format: summary, markdown, or csv", "summary").option("--output <path>", "Write output to a file instead of stdout").option("--json", "Print JSON output", false).action(async (options) => {
|
|
681
685
|
const resolved = await resolveCliArtifactQuery(params, options);
|
|
@@ -683,7 +687,7 @@ function registerGoogleMeetArtifactCommands(context) {
|
|
|
683
687
|
if (options.json) {
|
|
684
688
|
await writeCliOutput(options, JSON.stringify({
|
|
685
689
|
...result,
|
|
686
|
-
tokenSource: resolved.token.refreshed
|
|
690
|
+
tokenSource: resolveTokenSource(resolved.token.refreshed)
|
|
687
691
|
}, null, 2));
|
|
688
692
|
return;
|
|
689
693
|
}
|
|
@@ -697,7 +701,7 @@ function registerGoogleMeetArtifactCommands(context) {
|
|
|
697
701
|
}
|
|
698
702
|
if (options.format && options.format !== "summary") throw new Error("Unsupported format. Expected summary, markdown, or csv.");
|
|
699
703
|
writeAttendanceSummary(result);
|
|
700
|
-
writeStdoutLine("token source: %s", resolved.token.refreshed
|
|
704
|
+
writeStdoutLine("token source: %s", resolveTokenSource(resolved.token.refreshed));
|
|
701
705
|
});
|
|
702
706
|
addGoogleMeetArtifactOptions(root.command("export").description("Write Meet artifacts, attendance, transcript, and raw JSON into a folder")).option("--no-transcript-entries", "Skip structured transcript entry lookup").option("--include-doc-bodies", "Export linked transcript and smart-note Google Docs text").option("--no-merge-duplicates", "Keep duplicate participant resources as separate rows").option("--late-after-minutes <n>", "Mark participants late after this many minutes", "5").option("--early-before-minutes <n>", "Mark early leavers before this many minutes", "5").option("--output <dir>", "Output directory").option("--zip", "Also write a portable .zip archive").option("--dry-run", "Fetch export data and print the manifest without writing files", false).option("--json", "Print JSON output", false).action(async (options) => {
|
|
703
707
|
const resolved = await resolveCliArtifactQuery(params, options);
|
|
@@ -725,11 +729,11 @@ function registerGoogleMeetArtifactCommands(context) {
|
|
|
725
729
|
attendance,
|
|
726
730
|
files: googleMeetExportFileNames(),
|
|
727
731
|
request,
|
|
728
|
-
tokenSource: resolved.token.refreshed
|
|
732
|
+
tokenSource: resolveTokenSource(resolved.token.refreshed),
|
|
729
733
|
...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
|
|
730
734
|
}),
|
|
731
735
|
...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {},
|
|
732
|
-
tokenSource: resolved.token.refreshed
|
|
736
|
+
tokenSource: resolveTokenSource(resolved.token.refreshed)
|
|
733
737
|
});
|
|
734
738
|
return;
|
|
735
739
|
}
|
|
@@ -739,13 +743,13 @@ function registerGoogleMeetArtifactCommands(context) {
|
|
|
739
743
|
attendance,
|
|
740
744
|
zip: Boolean(options.zip),
|
|
741
745
|
request,
|
|
742
|
-
tokenSource: resolved.token.refreshed
|
|
746
|
+
tokenSource: resolveTokenSource(resolved.token.refreshed),
|
|
743
747
|
...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {}
|
|
744
748
|
});
|
|
745
749
|
const payload = {
|
|
746
750
|
...bundle,
|
|
747
751
|
...resolved.calendarEvent ? { calendarEvent: resolved.calendarEvent } : {},
|
|
748
|
-
tokenSource: resolved.token.refreshed
|
|
752
|
+
tokenSource: resolveTokenSource(resolved.token.refreshed)
|
|
749
753
|
};
|
|
750
754
|
if (options.json) {
|
|
751
755
|
writeStdoutJson(payload);
|
|
@@ -1323,17 +1327,18 @@ function registerGoogleMeetCli(params) {
|
|
|
1323
1327
|
challenge,
|
|
1324
1328
|
state
|
|
1325
1329
|
});
|
|
1330
|
+
const code = await waitForGoogleMeetAuthCode({
|
|
1331
|
+
state,
|
|
1332
|
+
manual: Boolean(options.manual),
|
|
1333
|
+
timeoutMs: resolveGoogleMeetOAuthCallbackTimeoutMs(options.timeoutSec),
|
|
1334
|
+
authUrl,
|
|
1335
|
+
promptInput,
|
|
1336
|
+
writeLine: (message) => writeStdoutLine("%s", message)
|
|
1337
|
+
});
|
|
1326
1338
|
const tokens = await exchangeGoogleMeetAuthCode({
|
|
1327
1339
|
clientId,
|
|
1328
1340
|
clientSecret,
|
|
1329
|
-
code
|
|
1330
|
-
state,
|
|
1331
|
-
manual: Boolean(options.manual),
|
|
1332
|
-
timeoutMs: resolveGoogleMeetOAuthCallbackTimeoutMs(options.timeoutSec),
|
|
1333
|
-
authUrl,
|
|
1334
|
-
promptInput,
|
|
1335
|
-
writeLine: (message) => writeStdoutLine("%s", message)
|
|
1336
|
-
}),
|
|
1341
|
+
code,
|
|
1337
1342
|
verifier
|
|
1338
1343
|
});
|
|
1339
1344
|
if (!tokens.refreshToken) throw new Error("Google OAuth did not return a refresh token. Re-run the flow with consent and offline access.");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { h as __exportAll, l as createGoogleMeetSpace } from "./plugin-helpers-
|
|
2
|
-
import { resolveGoogleMeetAccessToken } from "./oauth-
|
|
1
|
+
import { h as __exportAll, l as createGoogleMeetSpace } from "./plugin-helpers-CiAxinMY.js";
|
|
2
|
+
import { resolveGoogleMeetAccessToken } from "./oauth-DgBscjXK.js";
|
|
3
3
|
import { t as createMeetWithBrowserProxyOnNode } from "./chrome-create-PKAyxCiL.js";
|
|
4
4
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
//#region extensions/google-meet/src/create.ts
|
|
@@ -20,7 +20,9 @@ const legacyConfigRules = [{
|
|
|
20
20
|
match: hasLegacyGoogleRealtimeProvider
|
|
21
21
|
}];
|
|
22
22
|
function migrateGoogleMeetLegacyRealtimeProvider(config) {
|
|
23
|
-
const
|
|
23
|
+
const rawEntry = asNullableRecord(config.plugins?.entries?.["google-meet"]);
|
|
24
|
+
const rawPluginConfig = asNullableRecord(rawEntry?.config);
|
|
25
|
+
const rawRealtime = asNullableRecord(rawPluginConfig?.realtime);
|
|
24
26
|
if (!rawRealtime || !hasLegacyGoogleRealtimeProvider(rawRealtime)) return null;
|
|
25
27
|
const nextConfig = structuredClone(config);
|
|
26
28
|
const nextPlugins = asNullableRecord(nextConfig.plugins) ?? {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
|
2
2
|
//#region extensions/google-meet/src/google-api-errors.ts
|
|
3
3
|
const REAUTH_HINT = "Re-run `openclaw googlemeet auth login` and store the refreshed oauth block.";
|
|
4
|
-
const GOOGLE_API_ERROR_BODY_LIMIT_BYTES =
|
|
4
|
+
const GOOGLE_API_ERROR_BODY_LIMIT_BYTES = 8192;
|
|
5
5
|
function scopeText(scopes) {
|
|
6
6
|
return scopes.map((scope) => `\`${scope}\``).join(", ");
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as GOOGLE_MEET_CLI_DESCRIPTOR } from "./cli-output-mode-BwH_6tH8.js";
|
|
2
2
|
import { n as GOOGLE_MEET_NODE_COMMAND } from "./google-meet-platform-constants-Bs5iAg3E.js";
|
|
3
3
|
import { r as resolveGoogleMeetConfig } from "./config-wBK8loBb.js";
|
|
4
|
-
import { a as createLazyGoogleMeetNodeInvokePolicy, c as loadGoogleMeetCliModule, d as normalizeMode, f as normalizeTransport, h as shouldJoinCreatedMeet, i as createGoogleMeetRuntimeAccessor, l as loadGoogleMeetNodeHostModule, m as sendGoogleMeetGatewayError, n as assertGoogleMeetAgentToolActionSupported, o as formatGoogleMeetGatewayError, p as resolveMeetingInput, r as callGoogleMeetGatewayFromTool, s as keepTrustedToolAgentId, t as asParamRecord, u as loadGoogleMeetPluginHelpers } from "./plugin-registration-
|
|
4
|
+
import { a as createLazyGoogleMeetNodeInvokePolicy, c as loadGoogleMeetCliModule, d as normalizeMode, f as normalizeTransport, h as shouldJoinCreatedMeet, i as createGoogleMeetRuntimeAccessor, l as loadGoogleMeetNodeHostModule, m as sendGoogleMeetGatewayError, n as assertGoogleMeetAgentToolActionSupported, o as formatGoogleMeetGatewayError, p as resolveMeetingInput, r as callGoogleMeetGatewayFromTool, s as keepTrustedToolAgentId, t as asParamRecord, u as loadGoogleMeetPluginHelpers } from "./plugin-registration-CeQ3RzYT.js";
|
|
5
5
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
6
6
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
7
7
|
import { jsonResult } from "openclaw/plugin-sdk/tool-results";
|
|
@@ -338,7 +338,10 @@ var google_meet_default = definePluginEntry({
|
|
|
338
338
|
case "calendar_events":
|
|
339
339
|
case "artifacts":
|
|
340
340
|
case "attendance": return jsonResult(await queryActions[raw.action](raw));
|
|
341
|
-
case "export":
|
|
341
|
+
case "export": {
|
|
342
|
+
const helpers = await loadGoogleMeetPluginHelpers();
|
|
343
|
+
return jsonResult(await helpers.exportGoogleMeetBundleFromParams(config, raw));
|
|
344
|
+
}
|
|
342
345
|
case "leave":
|
|
343
346
|
case "speak":
|
|
344
347
|
if (!normalizeOptionalString(raw.sessionId)) throw new Error("sessionId required");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as readGoogleApiErrorDetail } from "./google-api-errors-
|
|
1
|
+
import { n as readGoogleApiErrorDetail } from "./google-api-errors-BDYXfKRa.js";
|
|
2
2
|
import { MAX_DATE_TIMESTAMP_MS, resolveDateTimestampMs, resolveExpiresAtMsFromDurationSeconds } from "openclaw/plugin-sdk/number-runtime";
|
|
3
3
|
import { parseOAuthCallbackInput, waitForLocalOAuthCallback } from "openclaw/plugin-sdk/provider-auth-runtime";
|
|
4
4
|
import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
|
|
@@ -9,7 +9,7 @@ const GOOGLE_MEET_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
|
9
9
|
const GOOGLE_MEET_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
10
10
|
const GOOGLE_MEET_TOKEN_HOST = "oauth2.googleapis.com";
|
|
11
11
|
const GOOGLE_MEET_DEFAULT_TOKEN_LIFETIME_SECONDS = 3600;
|
|
12
|
-
const GOOGLE_OAUTH_TOKEN_JSON_MAX_BYTES =
|
|
12
|
+
const GOOGLE_OAUTH_TOKEN_JSON_MAX_BYTES = 262144;
|
|
13
13
|
const GOOGLE_OAUTH_REQUEST_TIMEOUT_MS = 3e4;
|
|
14
14
|
const GOOGLE_MEET_SCOPES = [
|
|
15
15
|
"https://www.googleapis.com/auth/meetings.space.created",
|
|
@@ -123,7 +123,8 @@ function isLocalCallbackListenerError(error) {
|
|
|
123
123
|
return error.message.includes("EADDRINUSE") || error.message.includes("port") || error.message.includes("listen");
|
|
124
124
|
}
|
|
125
125
|
async function readManualGoogleMeetAuthCode(params) {
|
|
126
|
-
const
|
|
126
|
+
const input = await params.promptInput("Paste the full redirect URL here: ");
|
|
127
|
+
const parsed = parseOAuthCallbackInput(input, {
|
|
127
128
|
missingState: "Missing 'state' parameter. Paste the full redirect URL.",
|
|
128
129
|
invalidInput: "Paste the full redirect URL, not just the code."
|
|
129
130
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as loadGoogleMeetCliModule, p as resolveMeetingInput } from "./plugin-registration-
|
|
2
|
-
import { t as googleApiError } from "./google-api-errors-
|
|
1
|
+
import { c as loadGoogleMeetCliModule, p as resolveMeetingInput } from "./plugin-registration-CeQ3RzYT.js";
|
|
2
|
+
import { t as googleApiError } from "./google-api-errors-BDYXfKRa.js";
|
|
3
3
|
import { t as normalizeMeetUrl } from "./meet-url-BP2Jlvjs.js";
|
|
4
4
|
import { normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
@@ -87,7 +87,7 @@ function rankCalendarEvent(event, nowMs) {
|
|
|
87
87
|
const endMs = parseCalendarEventTime(event.end) ?? startMs;
|
|
88
88
|
if (startMs <= nowMs && endMs >= nowMs) return 0;
|
|
89
89
|
if (startMs > nowMs) return startMs - nowMs;
|
|
90
|
-
return nowMs - startMs +
|
|
90
|
+
return nowMs - startMs + 2592e6;
|
|
91
91
|
}
|
|
92
92
|
function chooseBestMeetCalendarEvent(events, now) {
|
|
93
93
|
const nowMs = now.getTime();
|
|
@@ -773,7 +773,7 @@ var plugin_helpers_exports = /* @__PURE__ */ __exportAll({
|
|
|
773
773
|
resolveMeetingFromParams: () => resolveMeetingFromParams,
|
|
774
774
|
resolveSpaceFromParams: () => resolveSpaceFromParams
|
|
775
775
|
});
|
|
776
|
-
const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-
|
|
776
|
+
const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-Da-nAEHY.js").then((n) => n.t));
|
|
777
777
|
async function createMeetFromParams(params) {
|
|
778
778
|
return (await loadGoogleMeetCreateModule()).createMeetFromParams(params);
|
|
779
779
|
}
|
|
@@ -781,7 +781,7 @@ async function createAndJoinMeetFromParams(params) {
|
|
|
781
781
|
return (await loadGoogleMeetCreateModule()).createAndJoinMeetFromParams(params);
|
|
782
782
|
}
|
|
783
783
|
async function resolveGoogleMeetTokenFromParams(config, raw) {
|
|
784
|
-
const { resolveGoogleMeetAccessToken } = await import("./oauth-
|
|
784
|
+
const { resolveGoogleMeetAccessToken } = await import("./oauth-DgBscjXK.js");
|
|
785
785
|
return resolveGoogleMeetAccessToken({
|
|
786
786
|
clientId: normalizeOptionalString(raw.clientId) ?? config.oauth.clientId,
|
|
787
787
|
clientSecret: normalizeOptionalString(raw.clientSecret) ?? config.oauth.clientSecret,
|
|
@@ -4,10 +4,10 @@ import { asNonArrayRecord as asParamRecord, normalizeOptionalString } from "open
|
|
|
4
4
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
5
5
|
import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
|
|
6
6
|
//#region extensions/google-meet/src/plugin-registration.ts
|
|
7
|
-
const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-
|
|
8
|
-
const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-
|
|
7
|
+
const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-CiAxinMY.js").then((n) => n.r));
|
|
8
|
+
const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-D8EyxtkZ.js"));
|
|
9
9
|
const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-BXtXbsMa.js"));
|
|
10
|
-
const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-
|
|
10
|
+
const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-BP1uG83z.js"));
|
|
11
11
|
const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-B0gOlLJR.js"));
|
|
12
12
|
const loadGoogleMeetGatewayRuntimeModule = createLazyRuntimeModule(() => import("openclaw/plugin-sdk/gateway-runtime"));
|
|
13
13
|
const loadGoogleMeetNodeInvokePolicy = async (config) => (await loadGoogleMeetNodeInvokePolicyModule()).createGoogleMeetChromeNodeInvokePolicy(config);
|
|
@@ -71,7 +71,8 @@ function resolveUserPath(input) {
|
|
|
71
71
|
}
|
|
72
72
|
function isProviderUnreachableWebhookUrl(webhookUrl) {
|
|
73
73
|
try {
|
|
74
|
-
|
|
74
|
+
const parsed = new URL(webhookUrl);
|
|
75
|
+
return isBlockedHostnameOrIp(parsed.hostname);
|
|
75
76
|
} catch {
|
|
76
77
|
return false;
|
|
77
78
|
}
|
|
@@ -665,11 +666,12 @@ async function launchChromeMeetOnNode(params) {
|
|
|
665
666
|
//#endregion
|
|
666
667
|
//#region extensions/google-meet/src/runtime-setup.ts
|
|
667
668
|
function collectChromeAudioCommands(config) {
|
|
668
|
-
|
|
669
|
+
const commands = config.chrome.audioBridgeCommand ? [config.chrome.audioBridgeCommand[0]] : [
|
|
669
670
|
config.chrome.audioInputCommand?.[0],
|
|
670
671
|
config.chrome.audioOutputCommand?.[0],
|
|
671
672
|
config.chrome.bargeInInputCommand?.[0]
|
|
672
|
-
]
|
|
673
|
+
];
|
|
674
|
+
return uniqueStrings(commands.filter((value) => Boolean(value?.trim())));
|
|
673
675
|
}
|
|
674
676
|
async function commandExists(runtime, command) {
|
|
675
677
|
return (await runtime.system.runCommandWithTimeout([
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Returns true if the value is a ISO8601 DateTime string
|
|
3
|
-
* @
|
|
3
|
+
* @specification https://datatracker.ietf.org/doc/html/rfc3339
|
|
4
4
|
* @example `2020-12-12T20:20:40+00:00`
|
|
5
5
|
*/
|
|
6
|
-
export declare function IsDateTime(value: string
|
|
6
|
+
export declare function IsDateTime(value: string): boolean;
|
|
@@ -2,10 +2,10 @@ import { IsDate } from './date.mjs';
|
|
|
2
2
|
import { IsTime } from './time.mjs';
|
|
3
3
|
/**
|
|
4
4
|
* Returns true if the value is a ISO8601 DateTime string
|
|
5
|
-
* @
|
|
5
|
+
* @specification https://datatracker.ietf.org/doc/html/rfc3339
|
|
6
6
|
* @example `2020-12-12T20:20:40+00:00`
|
|
7
7
|
*/
|
|
8
|
-
export function IsDateTime(value
|
|
8
|
+
export function IsDateTime(value) {
|
|
9
9
|
const dateTime = value.split(/T/i);
|
|
10
|
-
return dateTime.length === 2 && IsDate(dateTime[0]) && IsTime(dateTime[1]
|
|
10
|
+
return dateTime.length === 2 && IsDate(dateTime[0]) && IsTime(dateTime[1]);
|
|
11
11
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const Email = /^(
|
|
1
|
+
const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\[\x20-\x7e])*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
|
|
2
2
|
/**
|
|
3
3
|
* Returns true if the value is an Email
|
|
4
|
-
* @specification
|
|
4
|
+
* @specification https://datatracker.ietf.org/doc/html/rfc5322
|
|
5
5
|
*/
|
|
6
6
|
export function IsEmail(value) {
|
|
7
7
|
return Email.test(value);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as Idna from './
|
|
1
|
+
import * as Idna from './idna/index.mjs';
|
|
2
2
|
/**
|
|
3
3
|
* Returns true if the value is a valid hostname.
|
|
4
4
|
* @specification https://tools.ietf.org/html/rfc1123
|
|
@@ -6,13 +6,5 @@ import * as Idna from './_idna.mjs';
|
|
|
6
6
|
* @specification https://tools.ietf.org/html/rfc5892
|
|
7
7
|
*/
|
|
8
8
|
export function IsHostname(value) {
|
|
9
|
-
|
|
10
|
-
return false;
|
|
11
|
-
if (value.charCodeAt(value.length - 1) === 46)
|
|
12
|
-
return false;
|
|
13
|
-
for (const label of value.split('.')) {
|
|
14
|
-
if (!Idna.IsLabel(label))
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
return true;
|
|
9
|
+
return Idna.IsHostname(value);
|
|
18
10
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const IdnEmail = /^(
|
|
1
|
+
const IdnEmail = /^(?:[A-Za-z0-9!#$%&'*+\/=?^_`{|}~\u{0080}-\u{10FFFF}-]+(?:\.[A-Za-z0-9!#$%&'*+\/=?^_`{|}~\u{0080}-\u{10FFFF}-]+)*|"(?:[^"\\]|\\.)*")@[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,62})(?<!-)(?:\.[\p{L}\p{N}](?:[\p{L}\p{N}-]{0,62})(?<!-))*$/iu;
|
|
2
2
|
/**
|
|
3
3
|
* Returns true if the value is an IdnEmail
|
|
4
|
-
* @specification
|
|
4
|
+
* @specification https://datatracker.ietf.org/doc/html/rfc4952
|
|
5
5
|
*/
|
|
6
6
|
export function IsIdnEmail(value) {
|
|
7
|
-
return IdnEmail.test(value);
|
|
7
|
+
return IdnEmail.test(value.normalize('NFC'));
|
|
8
8
|
}
|
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
* @specification https://tools.ietf.org/html/rfc3490
|
|
4
4
|
* @specification https://tools.ietf.org/html/rfc5891
|
|
5
5
|
* @specification https://tools.ietf.org/html/rfc5892
|
|
6
|
+
* @specification https://tools.ietf.org/html/rfc5893
|
|
6
7
|
*/
|
|
7
8
|
export declare function IsIdnHostname(value: string): boolean;
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Idna from './idna/index.mjs';
|
|
2
2
|
/**
|
|
3
3
|
* Returns true if the value is a valid internationalized (IDN) hostname.
|
|
4
4
|
* @specification https://tools.ietf.org/html/rfc3490
|
|
5
5
|
* @specification https://tools.ietf.org/html/rfc5891
|
|
6
6
|
* @specification https://tools.ietf.org/html/rfc5892
|
|
7
|
+
* @specification https://tools.ietf.org/html/rfc5893
|
|
7
8
|
*/
|
|
8
9
|
export function IsIdnHostname(value) {
|
|
9
|
-
|
|
10
|
-
return false;
|
|
11
|
-
const canonical = value.normalize('NFC').replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.');
|
|
12
|
-
if (canonical.length > 253)
|
|
13
|
-
return false;
|
|
14
|
-
for (const label of canonical.split('.')) {
|
|
15
|
-
if (!IsIdnLabel(label))
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
return true;
|
|
10
|
+
return Idna.IsIdnHostname(value);
|
|
19
11
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// deno-fmt-ignore-file
|
|
2
|
+
import * as FormatPuny from './puny.mjs';
|
|
3
|
+
import * as Pattern from '../pattern/pattern.mjs';
|
|
4
|
+
// ------------------------------------------------------------------
|
|
5
|
+
// LOCAL REGEX: Allowed Bidi classes per direction (RFC 5893)
|
|
6
|
+
// ------------------------------------------------------------------
|
|
7
|
+
const RE_RTL_ALLOWED = /^(?:R|AL|AN|EN|ES|CS|ET|ON|BN|NSM)$/;
|
|
8
|
+
const RE_LTR_ALLOWED = /^(?:L|EN|ES|CS|ET|ON|BN|NSM)$/;
|
|
9
|
+
const RE_RTL_CLASSES = /^(?:R|AL|AN)$/;
|
|
10
|
+
// ------------------------------------------------------------------
|
|
11
|
+
// HasBidiChars
|
|
12
|
+
//
|
|
13
|
+
// Decodes a punycode label to its Unicode form (if it is one) and
|
|
14
|
+
// checks whether the result is an RTL label per RFC 5893 §1.4.
|
|
15
|
+
// ------------------------------------------------------------------
|
|
16
|
+
export function HasBidiChars(value) {
|
|
17
|
+
if (FormatPuny.IsAcePrefixed(value)) {
|
|
18
|
+
try {
|
|
19
|
+
return HasRightToLeftCharacters(FormatPuny.Decode(value.slice(4).toLowerCase()));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return HasRightToLeftCharacters(value);
|
|
26
|
+
}
|
|
27
|
+
// ------------------------------------------------------------------
|
|
28
|
+
// GetBidiClass
|
|
29
|
+
// ------------------------------------------------------------------
|
|
30
|
+
function GetBidiClass(codePoint) {
|
|
31
|
+
const char = String.fromCodePoint(codePoint);
|
|
32
|
+
return (Pattern.RE_EUROPEAN_NUMBER.test(char) ? 'EN' :
|
|
33
|
+
Pattern.RE_ARABIC_INDIC_DIGIT.test(char) ? 'AN' :
|
|
34
|
+
// Pattern.RE_EUROPEAN_SEPARATOR.test(char) ? 'ES' : // (no-spec-coverage)
|
|
35
|
+
// Pattern.RE_COMMON_SEPARATOR.test(char) ? 'CS' : // (no-spec-coverage)
|
|
36
|
+
Pattern.RE_MARK_NONSPACING.test(char) ? 'NSM' :
|
|
37
|
+
Pattern.RE_SCRIPT_HEBREW.test(char) ? 'R' :
|
|
38
|
+
Pattern.RE_SCRIPT_ARABIC_LETTER.test(char) ? 'AL' :
|
|
39
|
+
Pattern.RE_LETTER.test(char) ? 'L' :
|
|
40
|
+
'ON');
|
|
41
|
+
}
|
|
42
|
+
// ------------------------------------------------------------------
|
|
43
|
+
// HasRightToLeftCharacters
|
|
44
|
+
//
|
|
45
|
+
// Per RFC 5893 §1.4: "An RTL label is a label that contains at least
|
|
46
|
+
// one character of type R, AL, or AN." Used to determine whether a
|
|
47
|
+
// domain name is a "Bidi domain name" (RFC 5893 §1.4), in which case
|
|
48
|
+
// the Bidi Rule applies to every label in the domain.
|
|
49
|
+
// ------------------------------------------------------------------
|
|
50
|
+
export function HasRightToLeftCharacters(value) {
|
|
51
|
+
for (const ch of value)
|
|
52
|
+
if (RE_RTL_CLASSES.test(GetBidiClass(ch.codePointAt(0))))
|
|
53
|
+
return true;
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// ------------------------------------------------------------------
|
|
57
|
+
// SatisfiesBidiRule
|
|
58
|
+
// ------------------------------------------------------------------
|
|
59
|
+
export function SatisfiesBidiRule(value) {
|
|
60
|
+
let isRtl = false;
|
|
61
|
+
let allowed = RE_LTR_ALLOWED;
|
|
62
|
+
let sawEN = false;
|
|
63
|
+
let sawAN = false;
|
|
64
|
+
let isFirst = true;
|
|
65
|
+
// let lastClass: string | null = null // (no-spec-coverage)
|
|
66
|
+
for (const ch of value) {
|
|
67
|
+
const bidiClass = GetBidiClass(ch.codePointAt(0));
|
|
68
|
+
if (isFirst) {
|
|
69
|
+
// 1. The first character must be a character with Bidi property L, R, or AL.
|
|
70
|
+
if (bidiClass !== 'L' && bidiClass !== 'R' && bidiClass !== 'AL')
|
|
71
|
+
return false;
|
|
72
|
+
isRtl = bidiClass === 'R' || bidiClass === 'AL';
|
|
73
|
+
allowed = isRtl ? RE_RTL_ALLOWED : RE_LTR_ALLOWED;
|
|
74
|
+
isFirst = false;
|
|
75
|
+
}
|
|
76
|
+
// 2 / 5. Only characters in the allowed set for this direction may appear.
|
|
77
|
+
if (!allowed.test(bidiClass))
|
|
78
|
+
return false;
|
|
79
|
+
if (bidiClass === 'EN')
|
|
80
|
+
sawEN = true;
|
|
81
|
+
else if (bidiClass === 'AN')
|
|
82
|
+
sawAN = true;
|
|
83
|
+
// if (bidiClass !== 'NSM') lastClass = bidiClass // (no-spec-coverage)
|
|
84
|
+
}
|
|
85
|
+
if (isRtl && sawEN && sawAN)
|
|
86
|
+
return false; // spec coverage path
|
|
87
|
+
// (no-spec-coverage)
|
|
88
|
+
// if (isRtl) {
|
|
89
|
+
// // 3. The end of the label must be R, AL, EN, or AN (ignoring trailing NSM).
|
|
90
|
+
// // if (lastClass !== 'R' && lastClass !== 'AL' && lastClass !== 'EN' && lastClass !== 'AN') return false
|
|
91
|
+
// // 4. If an EN is present, no AN may be present, and vice versa.
|
|
92
|
+
// if (sawEN && sawAN) return false
|
|
93
|
+
// } else {
|
|
94
|
+
// // 6. The end of the label must be L or EN (ignoring trailing NSM).
|
|
95
|
+
// // if (lastClass !== 'L' && lastClass !== 'EN') return false
|
|
96
|
+
// }
|
|
97
|
+
return true;
|
|
98
|
+
}
|