@openclaw/google-meet 2026.10.1-beta.2 → 2026.10.5-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,13 @@
1
1
  import { n as GOOGLE_MEET_NODE_COMMAND } from "./google-meet-platform-constants-CnRfrYX7.mjs";
2
2
  import { n as DEFAULT_GOOGLE_MEET_AUDIO_OUTPUT_COMMAND, t as DEFAULT_GOOGLE_MEET_AUDIO_INPUT_COMMAND } from "./config-BXGAMntj.mjs";
3
- import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-CKXMbP3X.mjs";
3
+ import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-Bz77Bdt-.mjs";
4
4
  import { MeetingPlatformAdapter } from "openclaw/plugin-sdk/meeting-runtime";
5
5
  //#region extensions/google-meet/src/node-host.ts
6
6
  function normalizeMeetKey(value) {
7
7
  if (!value) return;
8
- try {
9
- const url = new URL(value);
10
- if (url.hostname.toLowerCase() !== "meet.google.com") return value;
11
- return /^\/([a-z]{3}-[a-z]{4}-[a-z]{3})(?:$|[/?#])/i.exec(url.pathname)?.[1]?.toLowerCase() ?? value;
12
- } catch {
13
- return value;
14
- }
8
+ const url = URL.parse(value);
9
+ if (url?.hostname.toLowerCase() !== "meet.google.com") return value;
10
+ return /^\/([a-z]{3}-[a-z]{4}-[a-z]{3})(?:$|[/?#])/i.exec(url.pathname)?.[1]?.toLowerCase() ?? value;
15
11
  }
16
12
  const handleGoogleMeetNodeHostCommand = MeetingPlatformAdapter.createNodeHostHandler({
17
13
  commandName: GOOGLE_MEET_NODE_COMMAND,
@@ -1,5 +1,5 @@
1
1
  import { n as GOOGLE_MEET_NODE_COMMAND } from "./google-meet-platform-constants-CnRfrYX7.mjs";
2
- import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-CKXMbP3X.mjs";
2
+ import { t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-Bz77Bdt-.mjs";
3
3
  import { createMeetingBrowserNodeInvokePolicy } from "openclaw/plugin-sdk/meeting-runtime";
4
4
  //#region extensions/google-meet/src/node-invoke-policy.ts
5
5
  const START_MODES = /* @__PURE__ */ new Set([
@@ -1,4 +1,4 @@
1
- import { t as readGoogleApiErrorDetail } from "./google-api-DEZ9mWx7.mjs";
1
+ import { t as readGoogleApiErrorDetail } from "./google-api-KAOF1Wn5.mjs";
2
2
  import { MAX_DATE_TIMESTAMP_MS, resolveDateTimestampMs, resolveExpiresAtMsFromDurationSeconds } from "openclaw/plugin-sdk/number-runtime";
3
3
  import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
4
4
  import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
@@ -19,8 +19,8 @@ const GOOGLE_MEET_SCOPES = [
19
19
  "https://www.googleapis.com/auth/calendar.events.readonly",
20
20
  "https://www.googleapis.com/auth/drive.meet.readonly"
21
21
  ];
22
- function resolveGoogleMeetTokenExpiresAt(value, nowMs = Date.now()) {
23
- const now = resolveDateTimestampMs(nowMs);
22
+ function resolveGoogleMeetTokenExpiresAt(value) {
23
+ const now = resolveDateTimestampMs(Date.now());
24
24
  if (typeof value === "number" && Number.isFinite(value) && value <= 0) return now;
25
25
  return resolveExpiresAtMsFromDurationSeconds(value, { nowMs: now }) ?? resolveExpiresAtMsFromDurationSeconds(GOOGLE_MEET_DEFAULT_TOKEN_LIFETIME_SECONDS, { nowMs: now }) ?? now;
26
26
  }
@@ -96,9 +96,8 @@ async function refreshGoogleMeetAccessToken(params) {
96
96
  }));
97
97
  }
98
98
  function shouldUseCachedGoogleMeetAccessToken(params) {
99
- const now = params.now ?? Date.now();
100
- const safetyWindowMs = params.safetyWindowMs ?? 6e4;
101
- return Boolean(params.accessToken?.trim() && typeof params.expiresAt === "number" && Number.isFinite(params.expiresAt) && params.expiresAt <= MAX_DATE_TIMESTAMP_MS && params.expiresAt > now + safetyWindowMs);
99
+ const now = Date.now();
100
+ return Boolean(params.accessToken?.trim() && typeof params.expiresAt === "number" && Number.isFinite(params.expiresAt) && params.expiresAt <= MAX_DATE_TIMESTAMP_MS && params.expiresAt > now + 6e4);
102
101
  }
103
102
  async function resolveGoogleMeetAccessToken(params) {
104
103
  if (shouldUseCachedGoogleMeetAccessToken(params)) return {
@@ -1,6 +1,6 @@
1
- import { m as resolveMeetingInput } from "./plugin-registration-BP83dqMw.mjs";
2
- import { n as requestGoogleApi } from "./google-api-DEZ9mWx7.mjs";
3
- import { t as normalizeMeetUrl } from "./meet-url-BP2Jlvjs.mjs";
1
+ import { m as resolveMeetingInput } from "./plugin-registration-B_Ohay99.mjs";
2
+ import { n as requestGoogleApi } from "./google-api-KAOF1Wn5.mjs";
3
+ import { t as normalizeMeetUrl } from "./meet-url-i_QvIxnP.mjs";
4
4
  import { normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
6
6
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
@@ -74,13 +74,13 @@ function rankCalendarEvent(event, nowMs) {
74
74
  }
75
75
  async function fetchGoogleCalendarEvents(params) {
76
76
  const calendarId = params.calendarId?.trim() || "primary";
77
- const now = params.now ?? /* @__PURE__ */ new Date();
77
+ const now = /* @__PURE__ */ new Date();
78
78
  const defaultTimeMax = new Date(now);
79
79
  defaultTimeMax.setDate(defaultTimeMax.getDate() + 7);
80
80
  return requestGoogleApi({
81
81
  url: `${GOOGLE_CALENDAR_API_BASE_URL}/calendars/${encodeURIComponent(calendarId)}/events`,
82
82
  query: {
83
- maxResults: params.maxResults ?? 50,
83
+ maxResults: 50,
84
84
  orderBy: "startTime",
85
85
  q: params.eventQuery?.trim() || void 0,
86
86
  showDeleted: false,
@@ -371,11 +371,7 @@ function extractGoogleDriveDocumentId(value) {
371
371
  if (typeof value !== "string") return;
372
372
  const trimmed = value.trim();
373
373
  if (!trimmed) return;
374
- if (/^https?:\/\//i.test(trimmed)) try {
375
- return new URL(trimmed).pathname.match(/\/document\/d\/([^/]+)/)?.[1];
376
- } catch {
377
- return;
378
- }
374
+ if (/^https?:\/\//i.test(trimmed)) return URL.parse(trimmed)?.pathname.match(/\/document\/d\/([^/]+)/)?.[1];
379
375
  return trimmed.split("/").filter(Boolean).at(-1);
380
376
  }
381
377
  async function exportGoogleDriveDocumentText(params) {
@@ -602,9 +598,9 @@ var plugin_helpers_exports = /* @__PURE__ */ __exportAll({
602
598
  resolveMeetingFromParams: () => resolveMeetingFromParams,
603
599
  resolveSpaceFromParams: () => resolveSpaceFromParams
604
600
  });
605
- const loadGoogleMeetExportModule = createLazyRuntimeModule(() => import("./cli-export-BOebaVFW.mjs").then((n) => n.t));
601
+ const loadGoogleMeetExportModule = createLazyRuntimeModule(() => import("./cli-export-DDUSzhh0.mjs").then((n) => n.t));
606
602
  async function resolveGoogleMeetTokenFromParams(config, raw) {
607
- const { resolveGoogleMeetAccessToken } = await import("./oauth-XgdPFWEJ.mjs");
603
+ const { resolveGoogleMeetAccessToken } = await import("./oauth-pXa-YQ9H.mjs");
608
604
  return resolveGoogleMeetAccessToken({
609
605
  clientId: normalizeOptionalString(raw.clientId) ?? config.oauth.clientId,
610
606
  clientSecret: normalizeOptionalString(raw.clientSecret) ?? config.oauth.clientSecret,
@@ -4,14 +4,13 @@ import { asNonArrayRecord, normalizeOptionalString } from "openclaw/plugin-sdk/s
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-D1OyyzEZ.mjs").then((n) => n.i));
8
- const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-Bfm5LpNM.mjs"));
9
- const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-DyYbmN11.mjs").then((n) => n.t));
10
- const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-CyFclhO_.mjs"));
11
- const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-DQgxZ2Na.mjs"));
12
- const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-BnX3PaH7.mjs"));
7
+ const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-BhofFtQ0.mjs").then((n) => n.i));
8
+ const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-vTuiXh8U.mjs"));
9
+ const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-0pfsnISA.mjs").then((n) => n.n));
10
+ const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-BP4g4zw3.mjs"));
11
+ const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-B9xiaF9M.mjs"));
12
+ const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-67WaZNPN.mjs"));
13
13
  const loadGoogleMeetGatewayRuntimeModule = createLazyRuntimeModule(() => import("openclaw/plugin-sdk/gateway-runtime"));
14
- const loadGoogleMeetNodeInvokePolicy = async (config) => (await loadGoogleMeetNodeInvokePolicyModule()).createGoogleMeetChromeNodeInvokePolicy(config);
15
14
  function normalizeTransport(value) {
16
15
  return value === "chrome" || value === "chrome-node" || value === "twilio" ? value : void 0;
17
16
  }
@@ -27,8 +26,14 @@ function resolveMeetingInput(config, value) {
27
26
  function shouldJoinCreatedMeet(raw) {
28
27
  return raw.join !== false && raw.join !== "false";
29
28
  }
30
- const googleMeetToolDeps = { platform: () => process.platform };
31
29
  const googleMeetGatewayMethods = {
30
+ join: "googlemeet.join",
31
+ create: "googlemeet.create",
32
+ status: "googlemeet.status",
33
+ transcript: "googlemeet.transcript",
34
+ participate: "googlemeet.participate",
35
+ leave: "googlemeet.leave",
36
+ speak: "googlemeet.speak",
32
37
  participation_context: "googlemeet.participationContext",
33
38
  recover_current_tab: "googlemeet.recoverCurrentTab",
34
39
  setup_status: "googlemeet.setup",
@@ -60,7 +65,7 @@ function readGoogleMeetParticipationParams(raw) {
60
65
  };
61
66
  }
62
67
  function assertGoogleMeetAgentToolActionSupported(params) {
63
- const platform = googleMeetToolDeps.platform();
68
+ const platform = process.platform;
64
69
  if (platform === "darwin" || platform === "linux") return;
65
70
  const action = params.raw.action;
66
71
  if (action !== "join" && action !== "test_speech" && !(action === "create" && shouldJoinCreatedMeet(params.raw))) return;
@@ -70,13 +75,14 @@ function assertGoogleMeetAgentToolActionSupported(params) {
70
75
  throw new Error("Google Meet local Chrome talk-back audio requires macOS with BlackHole 2ch or Linux with PipeWire-Pulse. On this host, use mode: transcribe, transport: twilio, or a supported chrome-node.");
71
76
  }
72
77
  async function callGoogleMeetGatewayFromTool(params) {
73
- const method = googleMeetGatewayMethods[params.action] ?? `googlemeet.${params.action}`;
78
+ const method = googleMeetGatewayMethods[params.action];
74
79
  try {
75
80
  if (params.runtime) return await params.runtime.gateway.request(method, params.raw, {
76
81
  timeoutMs: resolveGoogleMeetGatewayOperationTimeoutMs(params.config),
77
82
  scopes: ["operator.admin"]
78
83
  });
79
- return await (googleMeetToolDeps.callGatewayFromCli ?? (await loadGoogleMeetGatewayRuntimeModule()).callGatewayFromCli)(method, {
84
+ const { callGatewayFromCli } = await loadGoogleMeetGatewayRuntimeModule();
85
+ return await callGatewayFromCli(method, {
80
86
  json: true,
81
87
  timeout: String(resolveGoogleMeetGatewayOperationTimeoutMs(params.config))
82
88
  }, params.raw, {
@@ -129,7 +135,7 @@ function createGoogleMeetRuntimeAccessor(params) {
129
135
  return await runtimePromise;
130
136
  };
131
137
  }
132
- function createLazyGoogleMeetNodeInvokePolicy(config, loadPolicy = loadGoogleMeetNodeInvokePolicy) {
138
+ function createLazyGoogleMeetNodeInvokePolicy(config) {
133
139
  let policyPromise;
134
140
  return {
135
141
  commands: [GOOGLE_MEET_NODE_COMMAND],
@@ -137,7 +143,7 @@ function createLazyGoogleMeetNodeInvokePolicy(config, loadPolicy = loadGoogleMee
137
143
  async handle(ctx) {
138
144
  let policy;
139
145
  try {
140
- policyPromise ??= loadPolicy(config);
146
+ policyPromise ??= loadGoogleMeetNodeInvokePolicyModule().then((module) => module.createGoogleMeetChromeNodeInvokePolicy(config));
141
147
  policy = await policyPromise;
142
148
  } catch (error) {
143
149
  return {
@@ -1,7 +1,7 @@
1
1
  import { n as GOOGLE_MEET_NODE_COMMAND, t as GOOGLE_MEET_BROWSER_NODE_ADAPTER } from "./google-meet-platform-constants-CnRfrYX7.mjs";
2
- import { t as normalizeMeetUrl } from "./meet-url-BP2Jlvjs.mjs";
3
- import { c as callBrowserProxyOnNode, l as resolveChromeNode, u as resolveChromeNodeInfo } from "./chrome-create-Bh1L33pr.mjs";
4
- import { n as normalizeDialInNumber, t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-CKXMbP3X.mjs";
2
+ import { t as normalizeMeetUrl } from "./meet-url-i_QvIxnP.mjs";
3
+ import { c as callBrowserProxyOnNode, l as resolveChromeNode, u as resolveChromeNodeInfo } from "./chrome-create-CW_QQzuj.mjs";
4
+ import { n as normalizeDialInNumber, t as GOOGLE_MEET_PLATFORM_ADAPTER } from "./google-meet-platform-adapter-Bz77Bdt-.mjs";
5
5
  import { asOptionalRecord, asRecord, normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
7
7
  import path from "node:path";
@@ -65,12 +65,8 @@ function resolveUserPath(input) {
65
65
  return input;
66
66
  }
67
67
  function isProviderUnreachableWebhookUrl(webhookUrl) {
68
- try {
69
- const parsed = new URL(webhookUrl);
70
- return isBlockedHostnameOrIp(parsed.hostname);
71
- } catch {
72
- return false;
73
- }
68
+ const parsed = URL.parse(webhookUrl);
69
+ return parsed ? isBlockedHostnameOrIp(parsed.hostname) : false;
74
70
  }
75
71
  function resolveVoiceCallSetupValue(configured, fallback) {
76
72
  return normalizeOptionalString(configured) ?? normalizeOptionalString(fallback);
@@ -216,13 +212,10 @@ function shouldCaptureCaptions(mode, fullConfig) {
216
212
  return mode === "transcribe" || !fullConfig || resolveTranscriptsConfig(fullConfig.transcripts).enabled;
217
213
  }
218
214
  function chromeNodeBrowserRequest(runtime, nodeId) {
219
- return async (request) => await callBrowserProxyOnNode({
215
+ return (request) => callBrowserProxyOnNode({
216
+ ...request,
220
217
  runtime,
221
- nodeId,
222
- method: request.method,
223
- path: request.path,
224
- body: request.body,
225
- timeoutMs: request.timeoutMs
218
+ nodeId
226
219
  });
227
220
  }
228
221
  async function leaveChromeMeet(params) {
@@ -444,26 +437,19 @@ async function joinMeetViaVoiceCallGateway(params) {
444
437
  //#endregion
445
438
  //#region extensions/google-meet/src/runtime.ts
446
439
  const nowIso = () => (/* @__PURE__ */ new Date()).toISOString();
447
- var GoogleMeetRuntime = class {
448
- #createdBrowserTabs;
440
+ var GoogleMeetRuntime = class extends MeetingSessionRuntime {
441
+ #createdBrowserTabs = /* @__PURE__ */ new Map();
449
442
  #voiceCallGateway;
450
- #sessions;
451
- reconcileTranscriptPolicy(enabled) {
452
- return this.#sessions.reconcileTranscriptPolicy(enabled);
453
- }
454
443
  constructor(params) {
455
- this.params = params;
456
- this.#createdBrowserTabs = /* @__PURE__ */ new Map();
457
- this.transcriptSourceRuntime = () => this.#sessions;
458
444
  const adapter = GOOGLE_MEET_PLATFORM_ADAPTER;
459
- this.#voiceCallGateway = createVoiceCallGateway(params);
445
+ const voiceCallGateway = createVoiceCallGateway(params);
460
446
  let participationStore;
461
447
  const getParticipationStore = () => participationStore ??= params.runtime.state.openKeyedStore({
462
448
  namespace: "meeting-participation",
463
449
  maxEntries: 1e4,
464
450
  overflowPolicy: "reject-new"
465
451
  });
466
- this.#sessions = new MeetingSessionRuntime({
452
+ super({
467
453
  participation: {
468
454
  store: {
469
455
  entries: async () => await getParticipationStore().entries(),
@@ -556,21 +542,8 @@ var GoogleMeetRuntime = class {
556
542
  providerName: "Google Meet"
557
543
  }
558
544
  });
559
- }
560
- list() {
561
- return this.#sessions.list();
562
- }
563
- async status(sessionId) {
564
- return await this.#sessions.status(sessionId);
565
- }
566
- participationContext(sessionId) {
567
- return this.#sessions.participationContext(sessionId);
568
- }
569
- participate(sessionId, request) {
570
- return this.#sessions.participate(sessionId, request);
571
- }
572
- async transcript(sessionId, options = {}) {
573
- return await this.#sessions.transcript(sessionId, options);
545
+ this.params = params;
546
+ this.#voiceCallGateway = voiceCallGateway;
574
547
  }
575
548
  async setupStatus(options = {}) {
576
549
  return await getGoogleMeetRuntimeSetupStatus({
@@ -600,15 +573,6 @@ var GoogleMeetRuntime = class {
600
573
  url
601
574
  });
602
575
  }
603
- async join(request) {
604
- return await this.#sessions.join(request);
605
- }
606
- async leave(sessionId, options) {
607
- return await this.#sessions.leave(sessionId, options);
608
- }
609
- async speak(sessionId, instructions) {
610
- return await this.#sessions.speak(sessionId, instructions);
611
- }
612
576
  async testSpeech(request) {
613
577
  return await testGoogleMeetSpeech(this.#probeContext(), request);
614
578
  }
@@ -621,10 +585,10 @@ var GoogleMeetRuntime = class {
621
585
  resolveAgentId: (request) => this.#resolveAgentId(request.agentId),
622
586
  list: () => this.list(),
623
587
  join: async (request) => await this.join(request),
624
- isReusable: (session, resolved) => this.#sessions.isReusableSession(session, resolved),
625
- hasHealthHandle: (sessionId) => this.#sessions.hasHealthHandle(sessionId),
626
- refreshHealth: (sessionId) => this.#sessions.refreshHealth(sessionId),
627
- refreshCaptionHealth: async (session) => await this.#sessions.refreshCaptionHealth(session)
588
+ isReusable: (session, resolved) => this.isReusableSession(session, resolved),
589
+ hasHealthHandle: (sessionId) => this.hasHealthHandle(sessionId),
590
+ refreshHealth: (sessionId) => this.refreshHealth(sessionId),
591
+ refreshCaptionHealth: async (session) => await this.refreshCaptionHealth(session)
628
592
  };
629
593
  }
630
594
  #resolveAgentId(requestedAgentId) {
@@ -670,7 +634,7 @@ var GoogleMeetRuntime = class {
670
634
  const handles = this.#attachChromeAudioBridge(session, result.audioBridge);
671
635
  if (handles) context.attachRuntimeHandles(session, handles);
672
636
  session.notes.push(result.audioBridge ? session.transport === "chrome-node" ? "Chrome node transport joins as the signed-in Google profile on the selected node and routes realtime audio through the node bridge." : "Chrome transport joins as the signed-in Google profile and routes realtime audio through the configured bridge." : MeetingPlatformAdapter.isTalkBackMode(session.mode) ? "Chrome transport is waiting for verified virtual input/output audio routing." : "Chrome transport joins as the signed-in Google profile without starting the realtime audio bridge.");
673
- this.#sessions.refreshSpeechReadiness(session);
637
+ this.refreshSpeechReadiness(session);
674
638
  return {};
675
639
  }
676
640
  const dialPlan = GOOGLE_MEET_PLATFORM_ADAPTER.dialIn.buildPlan({
@@ -784,17 +748,17 @@ var GoogleMeetRuntime = class {
784
748
  }
785
749
  }
786
750
  async #refreshStatus(session) {
787
- if (isBrowserTransport(session.transport)) await this.#sessions.refreshBrowserHealth(session, {
751
+ if (isBrowserTransport(session.transport)) await this.refreshBrowserHealth(session, {
788
752
  force: true,
789
753
  readOnly: true
790
754
  });
791
755
  else if (session.transport === "twilio") await this.#refreshTwilioVoiceCallStatus(session);
792
- else this.#sessions.refreshSpeechReadiness(session);
756
+ else this.refreshSpeechReadiness(session);
793
757
  }
794
758
  async #refreshTwilioVoiceCallStatus(session) {
795
759
  const callId = session.twilio?.voiceCallId;
796
760
  if (!callId || session.state !== "active") {
797
- this.#sessions.refreshSpeechReadiness(session);
761
+ this.refreshSpeechReadiness(session);
798
762
  return;
799
763
  }
800
764
  try {
@@ -803,11 +767,11 @@ var GoogleMeetRuntime = class {
803
767
  callId
804
768
  });
805
769
  const call = asOptionalRecord(status.call);
806
- if (status.found === false || call?.endedAt !== void 0 || call?.endReason !== void 0) this.#sessions.markSessionEnded(session, "Voice Call is no longer active.");
770
+ if (status.found === false || call?.endedAt !== void 0 || call?.endReason !== void 0) this.markSessionEnded(session, "Voice Call is no longer active.");
807
771
  } catch (error) {
808
772
  this.params.logger.debug?.(`[google-meet] voice-call status refresh ignored: ${formatErrorMessage(error)}`);
809
773
  }
810
- this.#sessions.refreshSpeechReadiness(session);
774
+ this.refreshSpeechReadiness(session);
811
775
  }
812
776
  async #speakViaTransport(session, instructions) {
813
777
  if (session.transport !== "twilio" || !session.twilio?.voiceCallId) return;
@@ -819,7 +783,7 @@ var GoogleMeetRuntime = class {
819
783
  });
820
784
  } catch (error) {
821
785
  if (!isMeetingVoiceCallMissingError(error)) throw error;
822
- this.#sessions.markSessionEnded(session, "Voice Call is no longer active.");
786
+ this.markSessionEnded(session, "Voice Call is no longer active.");
823
787
  return {
824
788
  handled: true,
825
789
  spoken: false
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as GOOGLE_MEET_CLI_DESCRIPTOR } from "./.setup/cli-output-mode-BwH_6tH8.mjs";
2
2
  import { n as GOOGLE_MEET_NODE_COMMAND } from "./.setup/google-meet-platform-constants-CnRfrYX7.mjs";
3
3
  import { r as resolveGoogleMeetConfig } from "./.setup/config-BXGAMntj.mjs";
4
- import { a as formatGoogleMeetGatewayError, c as loadGoogleMeetCreateModule, d as normalizeMode, f as normalizeTransport, g as shouldJoinCreatedMeet, h as sendGoogleMeetGatewayError, i as createLazyGoogleMeetNodeInvokePolicy, l as loadGoogleMeetNodeHostModule, m as resolveMeetingInput, n as callGoogleMeetGatewayFromTool, o as keepTrustedToolAgentId, p as readGoogleMeetParticipationParams, r as createGoogleMeetRuntimeAccessor, s as loadGoogleMeetCliModule, t as assertGoogleMeetAgentToolActionSupported, u as loadGoogleMeetPluginHelpers } from "./.setup/plugin-registration-BP83dqMw.mjs";
4
+ import { a as formatGoogleMeetGatewayError, c as loadGoogleMeetCreateModule, d as normalizeMode, f as normalizeTransport, g as shouldJoinCreatedMeet, h as sendGoogleMeetGatewayError, i as createLazyGoogleMeetNodeInvokePolicy, l as loadGoogleMeetNodeHostModule, m as resolveMeetingInput, n as callGoogleMeetGatewayFromTool, o as keepTrustedToolAgentId, p as readGoogleMeetParticipationParams, r as createGoogleMeetRuntimeAccessor, s as loadGoogleMeetCliModule, t as assertGoogleMeetAgentToolActionSupported, u as loadGoogleMeetPluginHelpers } from "./.setup/plugin-registration-B_Ohay99.mjs";
5
5
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
6
6
  import { asNonArrayRecord, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
7
7
  import { jsonResult } from "openclaw/plugin-sdk/tool-results";
@@ -84,7 +84,7 @@ const GoogleMeetToolSchema = Type.Object({
84
84
  minimum: 0
85
85
  })),
86
86
  message: Type.Optional(Type.String({ description: "Realtime instructions to speak now" })),
87
- timeoutMs: optionalPositiveIntegerSchema({ description: "Probe timeout in milliseconds" }),
87
+ timeoutMs: optionalPositiveIntegerSchema({ description: "Check timeout in milliseconds" }),
88
88
  meeting: Type.Optional(Type.String({ description: "Meet URL, meeting code, or spaces/{id}" })),
89
89
  today: Type.Optional(Type.Boolean({ description: "For latest, artifacts, or attendance, find a Meet link on today's calendar." })),
90
90
  event: Type.Optional(Type.String({ description: "For latest, artifacts, or attendance, find a matching Calendar event." })),
@@ -108,6 +108,12 @@ const GoogleMeetToolSchema = Type.Object({
108
108
  });
109
109
  //#endregion
110
110
  //#region extensions/google-meet/index.ts
111
+ var InvalidGoogleMeetRequest = class extends Error {};
112
+ function requireSessionId(params) {
113
+ const sessionId = normalizeOptionalString(params?.sessionId);
114
+ if (!sessionId) throw new InvalidGoogleMeetRequest("sessionId required");
115
+ return sessionId;
116
+ }
111
117
  var google_meet_default = definePluginEntry({
112
118
  id: "google-meet",
113
119
  name: "Google Meet",
@@ -122,9 +128,9 @@ var google_meet_default = definePluginEntry({
122
128
  const registerGatewayMethod = (method, handler) => {
123
129
  api.registerGatewayMethod(method, async (options) => {
124
130
  try {
125
- await handler(options);
131
+ options.respond(true, await handler(options));
126
132
  } catch (err) {
127
- sendGoogleMeetGatewayError(options.respond, err);
133
+ sendGoogleMeetGatewayError(options.respond, err, err instanceof InvalidGoogleMeetRequest ? "INVALID_REQUEST" : "UNAVAILABLE");
128
134
  }
129
135
  });
130
136
  };
@@ -179,131 +185,106 @@ var google_meet_default = definePluginEntry({
179
185
  return helpers.fetchResolvedGoogleMeetAttendance(await helpers.resolveArtifactQueryFromParams(config, raw));
180
186
  }
181
187
  };
182
- const transcriptSourceRuntime = async () => (await ensureRuntime()).transcriptSourceRuntime();
183
188
  api.registerTranscriptSourceProvider({
184
189
  id: "google-meet",
185
190
  aliases: ["googlemeet", "meet"],
186
191
  name: "Google Meet",
187
192
  sourceKinds: ["live-caption"],
188
- start: async (request) => await (await transcriptSourceRuntime()).startTranscriptSource(request),
189
- stop: async (request) => await (await transcriptSourceRuntime()).stopTranscriptSource(request)
193
+ start: async (request) => await (await ensureRuntime()).startTranscriptSource(request),
194
+ stop: async (request) => await (await ensureRuntime()).stopTranscriptSource(request)
190
195
  });
191
196
  registerGatewayMethod("googlemeet.join", async (options) => {
192
- const runtime = await ensureRuntime();
193
- options.respond(true, await runtime.join(resolveTrustedJoinParams(options)));
197
+ return (await ensureRuntime()).join(resolveTrustedJoinParams(options));
194
198
  });
195
- registerGatewayMethod("googlemeet.create", async ({ params, client, respond }) => {
199
+ registerGatewayMethod("googlemeet.create", async ({ params, client }) => {
196
200
  const raw = keepTrustedToolAgentId(asNonArrayRecord(params), client);
197
201
  const create = await loadGoogleMeetCreateModule();
198
- respond(true, shouldJoinCreatedMeet(raw) ? await create.createAndJoinMeetFromParams({
202
+ return shouldJoinCreatedMeet(raw) ? create.createAndJoinMeetFromParams({
199
203
  config,
200
204
  runtime: api.runtime,
201
205
  raw,
202
206
  ensureRuntime
203
- }) : await create.createMeetFromParams({
207
+ }) : create.createMeetFromParams({
204
208
  config,
205
209
  runtime: api.runtime,
206
210
  raw
207
- }));
211
+ });
208
212
  });
209
- registerGatewayMethod("googlemeet.status", async ({ params, respond }) => {
210
- respond(true, await (await ensureRuntime()).status(normalizeOptionalString(params?.sessionId)));
213
+ registerGatewayMethod("googlemeet.status", async ({ params }) => {
214
+ return (await ensureRuntime()).status(normalizeOptionalString(params?.sessionId));
211
215
  });
212
- registerGatewayMethod("googlemeet.transcript", async ({ params, respond }) => {
213
- const sessionId = normalizeOptionalString(params?.sessionId);
214
- if (!sessionId) {
215
- sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
216
- return;
217
- }
216
+ registerGatewayMethod("googlemeet.transcript", async ({ params }) => {
217
+ const sessionId = requireSessionId(params);
218
218
  const sinceIndex = params?.sinceIndex;
219
- if (sinceIndex !== void 0 && (typeof sinceIndex !== "number" || !Number.isSafeInteger(sinceIndex) || sinceIndex < 0)) {
220
- sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sinceIndex must be a non-negative safe integer"), "INVALID_REQUEST");
221
- return;
222
- }
223
- respond(true, await (await ensureRuntime()).transcript(sessionId, sinceIndex === void 0 ? {} : { sinceIndex }));
219
+ if (sinceIndex !== void 0 && (typeof sinceIndex !== "number" || !Number.isSafeInteger(sinceIndex) || sinceIndex < 0)) throw new InvalidGoogleMeetRequest("sinceIndex must be a non-negative safe integer");
220
+ return (await ensureRuntime()).transcript(sessionId, sinceIndex === void 0 ? {} : { sinceIndex });
224
221
  });
225
- registerGatewayMethod("googlemeet.participationContext", async ({ params, respond }) => {
226
- const sessionId = normalizeOptionalString(params?.sessionId);
227
- if (!sessionId) {
228
- sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
229
- return;
230
- }
231
- respond(true, (await ensureRuntime()).participationContext(sessionId));
222
+ registerGatewayMethod("googlemeet.participationContext", async ({ params }) => {
223
+ const sessionId = requireSessionId(params);
224
+ return (await ensureRuntime()).participationContext(sessionId);
232
225
  });
233
- registerGatewayMethod("googlemeet.participate", async ({ params, respond }) => {
226
+ registerGatewayMethod("googlemeet.participate", async ({ params }) => {
234
227
  let parsed;
235
228
  try {
236
229
  parsed = readGoogleMeetParticipationParams(asNonArrayRecord(params));
237
230
  } catch (err) {
238
- sendGoogleMeetGatewayError(respond, err, "INVALID_REQUEST");
239
- return;
231
+ throw new InvalidGoogleMeetRequest(formatGoogleMeetGatewayError(err).error);
240
232
  }
241
- respond(true, await (await ensureRuntime()).participate(parsed.sessionId, parsed.request));
233
+ return (await ensureRuntime()).participate(parsed.sessionId, parsed.request);
242
234
  });
243
- registerGatewayMethod("googlemeet.recoverCurrentTab", async ({ params, respond }) => {
244
- respond(true, await (await ensureRuntime()).recoverCurrentTab({
235
+ registerGatewayMethod("googlemeet.recoverCurrentTab", async ({ params }) => {
236
+ return (await ensureRuntime()).recoverCurrentTab({
245
237
  url: normalizeOptionalString(params?.url),
246
238
  transport: normalizeTransport(params?.transport)
247
- }));
239
+ });
248
240
  });
249
- registerGatewayMethod("googlemeet.setup", async ({ params, respond }) => {
250
- respond(true, await (await ensureRuntime()).setupStatus({
241
+ registerGatewayMethod("googlemeet.setup", async ({ params }) => {
242
+ return (await ensureRuntime()).setupStatus({
251
243
  transport: normalizeTransport(params?.transport),
252
244
  mode: normalizeMode(params?.mode),
253
245
  dialInNumber: normalizeOptionalString(params?.dialInNumber)
254
- }));
246
+ });
255
247
  });
256
248
  for (const [method, action] of [
257
249
  ["googlemeet.latest", "latest"],
258
250
  ["googlemeet.calendarEvents", "calendar_events"],
259
251
  ["googlemeet.artifacts", "artifacts"],
260
252
  ["googlemeet.attendance", "attendance"]
261
- ]) registerGatewayMethod(method, async ({ params, respond }) => {
262
- respond(true, await queryActions[action](asNonArrayRecord(params)));
263
- });
264
- registerGatewayMethod("googlemeet.export", async ({ params, respond }) => {
265
- respond(true, await (await loadGoogleMeetPluginHelpers()).exportGoogleMeetBundleFromParams(config, asNonArrayRecord(params)));
253
+ ]) registerGatewayMethod(method, ({ params }) => queryActions[action](asNonArrayRecord(params)));
254
+ registerGatewayMethod("googlemeet.export", async ({ params }) => {
255
+ return (await loadGoogleMeetPluginHelpers()).exportGoogleMeetBundleFromParams(config, asNonArrayRecord(params));
266
256
  });
267
- registerGatewayMethod("googlemeet.leave", async ({ params, respond }) => {
268
- const sessionId = normalizeOptionalString(params?.sessionId);
269
- if (!sessionId) {
270
- sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
271
- return;
272
- }
273
- respond(true, await (await ensureRuntime()).leave(sessionId));
257
+ registerGatewayMethod("googlemeet.leave", async ({ params }) => {
258
+ const sessionId = requireSessionId(params);
259
+ return (await ensureRuntime()).leave(sessionId);
274
260
  });
275
- registerGatewayMethod("googlemeet.endActiveConference", async ({ params, respond }) => {
261
+ registerGatewayMethod("googlemeet.endActiveConference", async ({ params }) => {
276
262
  const raw = asNonArrayRecord(params);
277
263
  const helpers = await loadGoogleMeetPluginHelpers();
278
264
  const token = await helpers.resolveGoogleMeetTokenFromParams(config, raw);
279
- respond(true, await helpers.endGoogleMeetActiveConference({
265
+ return helpers.endGoogleMeetActiveConference({
280
266
  accessToken: token.accessToken,
281
267
  meeting: resolveMeetingInput(config, raw.meeting)
282
- }));
268
+ });
283
269
  });
284
- registerGatewayMethod("googlemeet.speak", async ({ params, respond }) => {
285
- const sessionId = normalizeOptionalString(params?.sessionId);
286
- if (!sessionId) {
287
- sendGoogleMeetGatewayError(respond, /* @__PURE__ */ new Error("sessionId required"), "INVALID_REQUEST");
288
- return;
289
- }
290
- respond(true, await (await ensureRuntime()).speak(sessionId, normalizeOptionalString(params?.message)));
270
+ registerGatewayMethod("googlemeet.speak", async ({ params }) => {
271
+ const sessionId = requireSessionId(params);
272
+ return (await ensureRuntime()).speak(sessionId, normalizeOptionalString(params?.message));
291
273
  });
292
274
  registerGatewayMethod("googlemeet.testSpeech", async (options) => {
293
- const runtime = await ensureRuntime();
294
- options.respond(true, await runtime.testSpeech(resolveTrustedJoinParams(options)));
275
+ return (await ensureRuntime()).testSpeech(resolveTrustedJoinParams(options));
295
276
  });
296
- registerGatewayMethod("googlemeet.testListen", async ({ params, client, respond }) => {
277
+ registerGatewayMethod("googlemeet.testListen", async ({ params, client }) => {
297
278
  const trustedParams = keepTrustedToolAgentId(asNonArrayRecord(params), client);
298
279
  const runtime = await ensureRuntime();
299
280
  const { readPositiveIntegerParam } = await import("openclaw/plugin-sdk/param-readers");
300
- respond(true, await runtime.testListen({
281
+ return runtime.testListen({
301
282
  url: resolveMeetingInput(config, trustedParams.url),
302
283
  transport: normalizeTransport(trustedParams.transport),
303
284
  mode: normalizeMode(trustedParams.mode),
304
285
  agentId: normalizeOptionalString(trustedParams.agentId),
305
286
  timeoutMs: readPositiveIntegerParam(trustedParams, "timeoutMs")
306
- }));
287
+ });
307
288
  });
308
289
  api.registerTool((toolContext) => ({
309
290
  name: "google_meet",
@@ -329,25 +310,19 @@ var google_meet_default = definePluginEntry({
329
310
  config,
330
311
  raw
331
312
  });
313
+ let routeRequester = false;
332
314
  switch (raw.action) {
333
315
  case "join":
334
316
  case "create":
335
317
  case "test_speech":
336
- case "test_listen": return jsonResult(await callGoogleMeetGatewayFromTool({
337
- config,
338
- action: raw.action,
339
- raw: rawWithRequester,
340
- runtime: useTrustedRuntime ? api.runtime : void 0
341
- }));
318
+ case "test_listen":
319
+ routeRequester = true;
320
+ break;
342
321
  case "status":
343
322
  case "transcript":
344
323
  case "recover_current_tab":
345
324
  case "setup_status":
346
- case "end_active_conference": return jsonResult(await callGoogleMeetGatewayFromTool({
347
- config,
348
- action: raw.action,
349
- raw
350
- }));
325
+ case "end_active_conference": break;
351
326
  case "resolve_space": {
352
327
  const { token: _token, ...result } = await (await loadGoogleMeetPluginHelpers()).resolveSpaceFromParams(config, raw);
353
328
  return jsonResult(result);
@@ -372,22 +347,20 @@ var google_meet_default = definePluginEntry({
372
347
  }
373
348
  case "participate":
374
349
  readGoogleMeetParticipationParams(raw);
375
- return jsonResult(await callGoogleMeetGatewayFromTool({
376
- config,
377
- action: raw.action,
378
- raw
379
- }));
350
+ break;
380
351
  case "participation_context":
381
352
  case "leave":
382
353
  case "speak":
383
354
  if (!normalizeOptionalString(raw.sessionId)) throw new Error("sessionId required");
384
- return jsonResult(await callGoogleMeetGatewayFromTool({
385
- config,
386
- action: raw.action,
387
- raw
388
- }));
355
+ break;
389
356
  default: throw new Error("unknown google_meet action");
390
357
  }
358
+ return jsonResult(await callGoogleMeetGatewayFromTool({
359
+ config,
360
+ action: raw.action,
361
+ raw: routeRequester ? rawWithRequester : raw,
362
+ runtime: routeRequester && useTrustedRuntime ? api.runtime : void 0
363
+ }));
391
364
  } catch (err) {
392
365
  return jsonResult(formatGoogleMeetGatewayError(err));
393
366
  }