@openclaw/google-meet 2026.5.27 → 2026.5.28-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.
@@ -8,8 +8,10 @@ import path from "node:path";
8
8
  import { mkdir, writeFile } from "node:fs/promises";
9
9
  import { createInterface } from "node:readline/promises";
10
10
  import { format } from "node:util";
11
+ import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
11
12
  //#region extensions/google-meet/src/cli.ts
12
13
  const GOOGLE_MEET_GATEWAY_DEFAULT_TIMEOUT_MS = 5e3;
14
+ const PLAIN_DECIMAL_NUMBER_RE = /^\d+(?:\.\d+)?$/;
13
15
  function writeStdoutJson(value) {
14
16
  process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
15
17
  }
@@ -41,7 +43,8 @@ async function promptInput(message) {
41
43
  }
42
44
  function parseOptionalNumber(value) {
43
45
  if (!value?.trim()) return;
44
- const parsed = Number(value);
46
+ const trimmed = value.trim();
47
+ const parsed = PLAIN_DECIMAL_NUMBER_RE.test(trimmed) ? Number(trimmed) : NaN;
45
48
  if (!Number.isFinite(parsed)) throw new Error(`Expected a numeric value, received ${value}`);
46
49
  return parsed;
47
50
  }
@@ -57,10 +60,17 @@ function formatOptional(value) {
57
60
  }
58
61
  function parsePositiveNumber(value, label) {
59
62
  if (value === void 0) return;
60
- const parsed = Number(value);
63
+ const trimmed = value.trim();
64
+ const parsed = PLAIN_DECIMAL_NUMBER_RE.test(trimmed) ? Number(trimmed) : NaN;
61
65
  if (!Number.isFinite(parsed) || parsed <= 0) throw new Error(`${label} must be a positive number`);
62
66
  return parsed;
63
67
  }
68
+ function parsePositiveIntegerOption(value, label) {
69
+ if (value === void 0) return;
70
+ const parsed = parseStrictPositiveInteger(value);
71
+ if (parsed === void 0) throw new Error(`${label} must be a positive integer`);
72
+ return parsed;
73
+ }
64
74
  async function callGoogleMeetGateway(params) {
65
75
  try {
66
76
  const timeoutMs = typeof params.timeoutMs === "number" && Number.isFinite(params.timeoutMs) ? Math.max(1, Math.ceil(params.timeoutMs)) : GOOGLE_MEET_GATEWAY_DEFAULT_TIMEOUT_MS;
@@ -366,7 +376,7 @@ function resolveArtifactTokenOptions(config, options) {
366
376
  refreshToken: options.refreshToken?.trim() || config.oauth.refreshToken,
367
377
  accessToken: options.accessToken?.trim() || config.oauth.accessToken,
368
378
  expiresAt: parseOptionalNumber(options.expiresAt) ?? config.oauth.expiresAt,
369
- pageSize: parseOptionalNumber(options.pageSize),
379
+ pageSize: parsePositiveIntegerOption(options.pageSize, "page-size"),
370
380
  includeTranscriptEntries: options.transcriptEntries !== false,
371
381
  allConferenceRecords: Boolean(options.allConferenceRecords),
372
382
  includeDocumentBodies: Boolean(options.includeDocBodies),
@@ -847,7 +857,7 @@ function registerGoogleMeetCli(params) {
847
857
  code: await waitForGoogleMeetAuthCode({
848
858
  state,
849
859
  manual: Boolean(options.manual),
850
- timeoutMs: (parseOptionalNumber(options.timeoutSec) ?? 300) * 1e3,
860
+ timeoutMs: (parsePositiveNumber(options.timeoutSec, "timeout-sec") ?? 300) * 1e3,
851
861
  authUrl,
852
862
  promptInput,
853
863
  writeLine: (message) => writeStdoutLine("%s", message)
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { a as isSameMeetUrlForReuse, c as resolveChromeNode, f as endGoogleMeetActiveConference, g as fetchLatestGoogleMeetConferenceRecord, h as fetchGoogleMeetSpace, i as callBrowserProxyOnNode, l as resolveChromeNodeInfo, m as fetchGoogleMeetAttendance, n as isGoogleMeetBrowserManualActionError, o as normalizeMeetUrlForReuse, p as fetchGoogleMeetArtifacts, r as asBrowserTabs, s as readBrowserTab, t as createMeetWithBrowserProxyOnNode, u as buildGoogleMeetPreflightReport } from "./chrome-create-B3zyjf5f.js";
2
2
  import { n as findGoogleMeetCalendarEvent, r as listGoogleMeetCalendarEvents, t as buildGoogleMeetCalendarDayWindow } from "./calendar-IxWkFtfn.js";
3
+ import { optionalPositiveIntegerSchema, readPositiveIntegerParam } from "openclaw/plugin-sdk/channel-actions";
3
4
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
4
5
  import { ErrorCodes, GatewayClient, callGatewayFromCli, errorShape, startGatewayClientWhenEventLoopReady } from "openclaw/plugin-sdk/gateway-runtime";
5
6
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
@@ -20,6 +21,7 @@ import { getRealtimeTranscriptionProvider, listRealtimeTranscriptionProviders }
20
21
  const SOX_DEFAULT_BUFFER_BYTES = 8192;
21
22
  const SOX_MIN_BUFFER_BYTES = 17;
22
23
  const DEFAULT_GOOGLE_MEET_AUDIO_BUFFER_BYTES = SOX_DEFAULT_BUFFER_BYTES / 2;
24
+ const PLAIN_DECIMAL_NUMBER_RE = /^\d+(?:\.\d+)?$/;
23
25
  function withSoxBuffer(command, bufferBytes) {
24
26
  return [
25
27
  command[0] ?? "sox",
@@ -163,7 +165,8 @@ function resolveNumber(value, fallback) {
163
165
  function resolveOptionalNumber(value) {
164
166
  if (typeof value === "number" && Number.isFinite(value)) return value;
165
167
  if (typeof value === "string" && value.trim()) {
166
- const parsed = Number(value);
168
+ const trimmed = value.trim();
169
+ const parsed = PLAIN_DECIMAL_NUMBER_RE.test(trimmed) ? Number(trimmed) : NaN;
167
170
  return Number.isFinite(parsed) ? parsed : void 0;
168
171
  }
169
172
  }
@@ -4338,13 +4341,13 @@ const GoogleMeetToolSchema = Type.Object({
4338
4341
  dtmfSequence: Type.Optional(Type.String({ description: "Explicit DTMF sequence for Twilio" })),
4339
4342
  sessionId: Type.Optional(Type.String({ description: "Meet session ID" })),
4340
4343
  message: Type.Optional(Type.String({ description: "Realtime instructions to speak now" })),
4341
- timeoutMs: Type.Optional(Type.Number({ description: "Probe timeout in milliseconds" })),
4344
+ timeoutMs: optionalPositiveIntegerSchema({ description: "Probe timeout in milliseconds" }),
4342
4345
  meeting: Type.Optional(Type.String({ description: "Meet URL, meeting code, or spaces/{id}" })),
4343
4346
  today: Type.Optional(Type.Boolean({ description: "For latest, artifacts, or attendance, find a Meet link on today's calendar." })),
4344
4347
  event: Type.Optional(Type.String({ description: "For latest, artifacts, or attendance, find a matching Calendar event." })),
4345
4348
  calendarId: Type.Optional(Type.String({ description: "Calendar id for today/event lookup" })),
4346
4349
  conferenceRecord: Type.Optional(Type.String({ description: "Meet conferenceRecords/{id} resource name or id" })),
4347
- pageSize: Type.Optional(Type.Number({ description: "Meet API page size for list actions" })),
4350
+ pageSize: optionalPositiveIntegerSchema({ description: "Meet API page size for list actions" }),
4348
4351
  includeTranscriptEntries: Type.Optional(Type.Boolean({ description: "For artifacts, include structured transcript entries" })),
4349
4352
  includeDocumentBodies: Type.Optional(Type.Boolean({ description: "For artifacts/export, export linked transcript and smart-note Google Docs text through Drive." })),
4350
4353
  outputDir: Type.Optional(Type.String({ description: "For export, output directory" })),
@@ -4352,8 +4355,8 @@ const GoogleMeetToolSchema = Type.Object({
4352
4355
  dryRun: Type.Optional(Type.Boolean({ description: "For export, return the manifest without writing files." })),
4353
4356
  includeAllConferenceRecords: Type.Optional(Type.Boolean({ description: "For artifacts, attendance, or export with meeting input, fetch all conference records instead of only the latest." })),
4354
4357
  mergeDuplicateParticipants: Type.Optional(Type.Boolean({ description: "For attendance, merge duplicate participant resources." })),
4355
- lateAfterMinutes: Type.Optional(Type.Number({ description: "For attendance, mark participants late after this many minutes." })),
4356
- earlyBeforeMinutes: Type.Optional(Type.Number({ description: "For attendance, mark early leavers before this many minutes." })),
4358
+ lateAfterMinutes: optionalPositiveIntegerSchema({ description: "For attendance, mark participants late after this many minutes." }),
4359
+ earlyBeforeMinutes: optionalPositiveIntegerSchema({ description: "For attendance, mark early leavers before this many minutes." }),
4357
4360
  accessToken: Type.Optional(Type.String({ description: "Access token override" })),
4358
4361
  refreshToken: Type.Optional(Type.String({ description: "Refresh token override" })),
4359
4362
  clientId: Type.Optional(Type.String({ description: "OAuth client id override" })),
@@ -4387,12 +4390,6 @@ function resolveMeetingInput(config, value) {
4387
4390
  if (!meeting) throw new Error("Meeting input is required");
4388
4391
  return meeting;
4389
4392
  }
4390
- function resolveOptionalPositiveInteger(value) {
4391
- if (value === void 0) return;
4392
- const parsed = typeof value === "number" ? value : Number(normalizeOptionalString(value));
4393
- if (!Number.isInteger(parsed) || parsed <= 0) throw new Error("Expected pageSize to be a positive integer");
4394
- return parsed;
4395
- }
4396
4393
  function shouldJoinCreatedMeet(raw) {
4397
4394
  return raw.join !== false && raw.join !== "false";
4398
4395
  }
@@ -4517,13 +4514,13 @@ async function resolveArtifactQueryFromParams(config, raw) {
4517
4514
  meeting: resolvedMeeting.meeting,
4518
4515
  calendarEvent: resolvedMeeting.calendarEvent,
4519
4516
  conferenceRecord,
4520
- pageSize: resolveOptionalPositiveInteger(raw.pageSize),
4517
+ pageSize: readPositiveIntegerParam(raw, "pageSize"),
4521
4518
  includeTranscriptEntries: raw.includeTranscriptEntries !== false,
4522
4519
  includeDocumentBodies: raw.includeDocumentBodies === true,
4523
4520
  allConferenceRecords: raw.includeAllConferenceRecords === true,
4524
4521
  mergeDuplicateParticipants: raw.mergeDuplicateParticipants !== false,
4525
- lateAfterMinutes: resolveOptionalPositiveInteger(raw.lateAfterMinutes),
4526
- earlyBeforeMinutes: resolveOptionalPositiveInteger(raw.earlyBeforeMinutes)
4522
+ lateAfterMinutes: readPositiveIntegerParam(raw, "lateAfterMinutes"),
4523
+ earlyBeforeMinutes: readPositiveIntegerParam(raw, "earlyBeforeMinutes")
4527
4524
  };
4528
4525
  }
4529
4526
  async function exportGoogleMeetBundleFromParams(config, raw) {
@@ -4546,7 +4543,7 @@ async function exportGoogleMeetBundleFromParams(config, raw) {
4546
4543
  lateAfterMinutes: resolved.lateAfterMinutes,
4547
4544
  earlyBeforeMinutes: resolved.earlyBeforeMinutes
4548
4545
  })]);
4549
- const { buildGoogleMeetExportManifest, googleMeetExportFileNames, writeMeetExportBundle } = await import("./cli-CS9eUUSs.js");
4546
+ const { buildGoogleMeetExportManifest, googleMeetExportFileNames, writeMeetExportBundle } = await import("./cli-Bnu0qPW-.js");
4550
4547
  const calendarId = normalizeOptionalString(raw.calendarId);
4551
4548
  const request = {
4552
4549
  ...resolved.meeting ? { meeting: resolved.meeting } : {},
@@ -4807,7 +4804,7 @@ var google_meet_default = definePluginEntry({
4807
4804
  url: resolveMeetingInput(config, params?.url),
4808
4805
  transport: normalizeTransport(params?.transport),
4809
4806
  mode: normalizeMode(params?.mode),
4810
- timeoutMs: typeof params?.timeoutMs === "number" ? params.timeoutMs : void 0
4807
+ timeoutMs: readPositiveIntegerParam(asParamRecord(params), "timeoutMs")
4811
4808
  }));
4812
4809
  } catch (err) {
4813
4810
  sendError(respond, err);
@@ -4962,7 +4959,7 @@ var google_meet_default = definePluginEntry({
4962
4959
  handle: handleGoogleMeetNodeHostCommand
4963
4960
  });
4964
4961
  api.registerCli(async ({ program }) => {
4965
- const { registerGoogleMeetCli } = await import("./cli-CS9eUUSs.js");
4962
+ const { registerGoogleMeetCli } = await import("./cli-Bnu0qPW-.js");
4966
4963
  registerGoogleMeetCli({
4967
4964
  program,
4968
4965
  config,
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@openclaw/google-meet",
3
- "version": "2026.5.27",
3
+ "version": "2026.5.28-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/google-meet",
9
- "version": "2026.5.27",
9
+ "version": "2026.5.28-beta.2",
10
10
  "dependencies": {
11
11
  "commander": "14.0.3",
12
12
  "typebox": "1.1.38"
13
13
  },
14
14
  "peerDependencies": {
15
- "openclaw": ">=2026.5.27"
15
+ "openclaw": ">=2026.5.28-beta.2"
16
16
  },
17
17
  "peerDependenciesMeta": {
18
18
  "openclaw": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/google-meet",
3
- "version": "2026.5.27",
3
+ "version": "2026.5.28-beta.2",
4
4
  "description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,7 +12,7 @@
12
12
  "typebox": "1.1.38"
13
13
  },
14
14
  "peerDependencies": {
15
- "openclaw": ">=2026.5.27"
15
+ "openclaw": ">=2026.5.28-beta.2"
16
16
  },
17
17
  "peerDependenciesMeta": {
18
18
  "openclaw": {
@@ -29,10 +29,10 @@
29
29
  "minHostVersion": ">=2026.4.20"
30
30
  },
31
31
  "compat": {
32
- "pluginApi": ">=2026.5.27"
32
+ "pluginApi": ">=2026.5.28-beta.2"
33
33
  },
34
34
  "build": {
35
- "openclawVersion": "2026.5.27"
35
+ "openclawVersion": "2026.5.28-beta.2"
36
36
  },
37
37
  "release": {
38
38
  "publishToClawHub": true,