@openclaw/google-meet 2026.10.5-beta.4 → 2026.10.10-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,8 +1,8 @@
1
- import { a as resolveArtifactQueryFromParams, c as resolveSpaceFromParams, d as endGoogleMeetActiveConference, f as fetchGoogleMeetSpace, h as listGoogleMeetCalendarEvents, l as buildGoogleMeetPreflightReport, m as buildGoogleMeetCalendarDayWindow, n as fetchResolvedGoogleMeetArtifacts, o as resolveGoogleMeetTokenFromParams, p as fetchLatestGoogleMeetConferenceRecord, r as fetchResolvedGoogleMeetAttendance, s as resolveMeetingFromParams, t as buildGoogleMeetExportRequest, u as createGoogleMeetSpace } from "./plugin-helpers-BhofFtQ0.mjs";
1
+ import { a as resolveArtifactQueryFromParams, c as resolveSpaceFromParams, d as endGoogleMeetActiveConference, f as fetchGoogleMeetSpace, h as listGoogleMeetCalendarEvents, l as buildGoogleMeetPreflightReport, m as buildGoogleMeetCalendarDayWindow, n as fetchResolvedGoogleMeetArtifacts, o as resolveGoogleMeetTokenFromParams, p as fetchLatestGoogleMeetConferenceRecord, r as fetchResolvedGoogleMeetAttendance, s as resolveMeetingFromParams, t as buildGoogleMeetExportRequest, u as createGoogleMeetSpace } from "./plugin-helpers-D3VKNUTD.mjs";
2
2
  import { i as resolveGoogleMeetGatewayOperationTimeoutMs } from "./config-BXGAMntj.mjs";
3
- import { C as writeStdoutJson, S as writeSetupStatus, _ as resolveGoogleMeetOAuthCallbackTimeoutMs, a as renderAttendanceCsv, b as writeLeaveResult, c as callGoogleMeetGateway, d as parseGoogleMeetTransport, f as parseOptionalNumber, g as resolveCliJoinRequest, h as promptInput, i as renderAttendance, l as parseGoogleMeetBrowserTransport, m as parsePositiveNumber, n as exportGoogleMeetBundle, o as writeCalendarEventsSummary, p as parsePositiveIntegerOption, r as renderArtifacts, s as writeLatestConferenceRecordSummary, u as parseGoogleMeetMode, v as writeCliOutput, w as writeStdoutLine, x as writeRecoverCurrentTabResult, y as writeDoctorStatus } from "./cli-export-DDUSzhh0.mjs";
3
+ import { C as writeStdoutJson, S as writeSetupStatus, _ as resolveGoogleMeetOAuthCallbackTimeoutMs, a as renderAttendanceCsv, b as writeLeaveResult, c as callGoogleMeetGateway, d as parseGoogleMeetTransport, f as parseOptionalNumber, g as resolveCliJoinRequest, h as promptInput, i as renderAttendance, l as parseGoogleMeetBrowserTransport, m as parsePositiveNumber, n as exportGoogleMeetBundle, o as writeCalendarEventsSummary, p as parsePositiveIntegerOption, r as renderArtifacts, s as writeLatestConferenceRecordSummary, u as parseGoogleMeetMode, v as writeCliOutput, w as writeStdoutLine, x as writeRecoverCurrentTabResult, y as writeDoctorStatus } from "./cli-export-3ijBYTqg.mjs";
4
4
  import { buildGoogleMeetAuthUrl, exchangeGoogleMeetAuthCode, resolveGoogleMeetAccessToken, waitForGoogleMeetAuthCode } from "./oauth-pXa-YQ9H.mjs";
5
- import { i as hasGoogleMeetOAuth, r as hasCreateSpaceConfigInput, t as createSpaceFromParams } from "./create-0pfsnISA.mjs";
5
+ import { i as hasGoogleMeetOAuth, r as hasCreateSpaceConfigInput, t as createSpaceFromParams } from "./create-DMUmVyQg.mjs";
6
6
  import { parseStrictNonNegativeInteger } from "openclaw/plugin-sdk/number-runtime";
7
7
  import { generateHexPkceVerifierChallenge } from "openclaw/plugin-sdk/provider-auth";
8
8
  import { generateOAuthState } from "openclaw/plugin-sdk/provider-auth-runtime";
@@ -248,18 +248,8 @@ function registerGoogleMeetProbeCommands(context) {
248
248
  const { root, operationTimeoutMs } = context;
249
249
  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) => {
250
250
  const payload = resolveCliJoinRequest(resolveCliMeetingInput(context.config, url), options);
251
- const delegated = await callGoogleMeetGateway({
252
- method: "googlemeet.join",
253
- payload,
254
- timeoutMs: operationTimeoutMs
255
- });
256
- if (delegated.ok) {
257
- const result = delegated.payload;
258
- writeStdoutJson(result.session ?? delegated.payload);
259
- return;
260
- }
261
- const result = await (await context.ensureRuntime()).join(payload);
262
- writeStdoutJson(result.session);
251
+ const result = await callGoogleMeetRuntime(context, "googlemeet.join", payload, (rt) => rt.join(payload), operationTimeoutMs);
252
+ writeStdoutJson(result.session ?? result);
263
253
  });
264
254
  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) => {
265
255
  const payload = {
@@ -422,7 +412,7 @@ function registerGoogleMeetCreateCommands(context) {
422
412
  }
423
413
  function registerGoogleMeetApiCommands(context) {
424
414
  const { root } = context;
425
- 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) => {
415
+ addGoogleMeetOAuthOptions(addGoogleMeetMeetingOption(root.command("resolve-space").description("Resolve a Meet URL, meeting code, or spaces/{id} to the matching space"))).option("--json", "Print JSON output", false).action(async (options) => {
426
416
  const meeting = resolveCliMeetingInput(context.config, options.meeting);
427
417
  const { space, token } = await resolveSpaceFromParams(context.config, {
428
418
  ...resolveCliParams(options),
@@ -1,4 +1,4 @@
1
- import { g as __exportAll } from "./plugin-helpers-BhofFtQ0.mjs";
1
+ import { g as __exportAll } from "./plugin-helpers-D3VKNUTD.mjs";
2
2
  import { clampTimerTimeoutMs, parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
3
3
  import fsp, { stat } from "node:fs/promises";
4
4
  import path from "node:path";
@@ -1,5 +1,5 @@
1
- import { g as __exportAll, o as resolveGoogleMeetTokenFromParams, u as createGoogleMeetSpace } from "./plugin-helpers-BhofFtQ0.mjs";
2
- import { d as normalizeMode, f as normalizeTransport } from "./plugin-registration-B_Ohay99.mjs";
1
+ import { g as __exportAll, o as resolveGoogleMeetTokenFromParams, u as createGoogleMeetSpace } from "./plugin-helpers-D3VKNUTD.mjs";
2
+ import { d as normalizeMode, f as normalizeTransport } from "./plugin-registration-1Oc4T1Bj.mjs";
3
3
  import { t as createMeetWithBrowserProxyOnNode } from "./chrome-create-CW_QQzuj.mjs";
4
4
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/google-meet/src/create.ts
@@ -1,4 +1,4 @@
1
- import { m as resolveMeetingInput } from "./plugin-registration-B_Ohay99.mjs";
1
+ import { m as resolveMeetingInput } from "./plugin-registration-1Oc4T1Bj.mjs";
2
2
  import { n as requestGoogleApi } from "./google-api-KAOF1Wn5.mjs";
3
3
  import { t as normalizeMeetUrl } from "./meet-url-i_QvIxnP.mjs";
4
4
  import { normalizeOptionalString, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -598,7 +598,7 @@ var plugin_helpers_exports = /* @__PURE__ */ __exportAll({
598
598
  resolveMeetingFromParams: () => resolveMeetingFromParams,
599
599
  resolveSpaceFromParams: () => resolveSpaceFromParams
600
600
  });
601
- const loadGoogleMeetExportModule = createLazyRuntimeModule(() => import("./cli-export-DDUSzhh0.mjs").then((n) => n.t));
601
+ const loadGoogleMeetExportModule = createLazyRuntimeModule(() => import("./cli-export-3ijBYTqg.mjs").then((n) => n.t));
602
602
  async function resolveGoogleMeetTokenFromParams(config, raw) {
603
603
  const { resolveGoogleMeetAccessToken } = await import("./oauth-pXa-YQ9H.mjs");
604
604
  return resolveGoogleMeetAccessToken({
@@ -4,11 +4,11 @@ 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-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));
7
+ const loadGoogleMeetPluginHelpers = createLazyRuntimeModule(() => import("./plugin-helpers-D3VKNUTD.mjs").then((n) => n.i));
8
+ const loadGoogleMeetCliModule = createLazyRuntimeModule(() => import("./cli-CBLj67Qo.mjs"));
9
+ const loadGoogleMeetCreateModule = createLazyRuntimeModule(() => import("./create-DMUmVyQg.mjs").then((n) => n.n));
10
10
  const loadGoogleMeetNodeHostModule = createLazyRuntimeModule(() => import("./node-host-BP4g4zw3.mjs"));
11
- const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-B9xiaF9M.mjs"));
11
+ const loadGoogleMeetRuntimeModule = createLazyRuntimeModule(() => import("./runtime-2_R9PsRx.mjs"));
12
12
  const loadGoogleMeetNodeInvokePolicyModule = createLazyRuntimeModule(() => import("./node-invoke-policy-67WaZNPN.mjs"));
13
13
  const loadGoogleMeetGatewayRuntimeModule = createLazyRuntimeModule(() => import("openclaw/plugin-sdk/gateway-runtime"));
14
14
  function normalizeTransport(value) {
@@ -35,29 +35,6 @@ const probes = MeetingPlatformAdapter.createRuntimeProbes({
35
35
  const testGoogleMeetListening = probes.testListening;
36
36
  const testGoogleMeetSpeech = probes.testSpeech;
37
37
  //#endregion
38
- //#region extensions/google-meet/src/runtime-session.ts
39
- function resolveTransport(input, config) {
40
- return input ?? config.defaultTransport;
41
- }
42
- function resolveMode(input, config) {
43
- return input === "realtime" ? "agent" : input ?? config.defaultMode;
44
- }
45
- function withSessionAgentConfig(config, agentId) {
46
- return config.realtime.agentId === agentId ? config : {
47
- ...config,
48
- realtime: {
49
- ...config.realtime,
50
- agentId
51
- }
52
- };
53
- }
54
- function isBrowserTransport(transport) {
55
- return transport === "chrome" || transport === "chrome-node";
56
- }
57
- function noteSession(session, note) {
58
- session.notes = [...session.notes.filter((item) => item !== note), note];
59
- }
60
- //#endregion
61
38
  //#region extensions/google-meet/src/setup.ts
62
39
  function resolveUserPath(input) {
63
40
  if (input === "~") return os.homedir();
@@ -211,21 +188,30 @@ const launchChromeMeet = chromeTransport.launchInChrome;
211
188
  function shouldCaptureCaptions(mode, fullConfig) {
212
189
  return mode === "transcribe" || !fullConfig || resolveTranscriptsConfig(fullConfig.transcripts).enabled;
213
190
  }
214
- function chromeNodeBrowserRequest(runtime, nodeId) {
215
- return (request) => callBrowserProxyOnNode({
216
- ...request,
217
- runtime,
218
- nodeId
191
+ async function resolveChromeBrowserRoute(params) {
192
+ if (params.transport !== "chrome-node") return {
193
+ transport: "chrome",
194
+ callBrowser: await resolveLocalMeetingBrowserRequest(params.runtime)
195
+ };
196
+ const nodeId = params.nodeId ?? await resolveChromeNode({
197
+ runtime: params.runtime,
198
+ requestedNode: params.config.chromeNode.node
219
199
  });
200
+ return {
201
+ transport: "chrome-node",
202
+ nodeId,
203
+ callBrowser: (request) => callBrowserProxyOnNode({
204
+ ...request,
205
+ runtime: params.runtime,
206
+ nodeId
207
+ })
208
+ };
220
209
  }
221
210
  async function leaveChromeMeet(params) {
222
- const node = params.transport === "chrome-node" ? { nodeId: params.nodeId ?? await resolveChromeNode({
223
- runtime: params.runtime,
224
- requestedNode: params.config.chromeNode.node
225
- }) } : void 0;
226
- return await leaveMeetingWithBrowser({
211
+ const { callBrowser } = await resolveChromeBrowserRoute(params);
212
+ return leaveMeetingWithBrowser({
227
213
  adapter: GOOGLE_MEET_PLATFORM_ADAPTER,
228
- callBrowser: node ? chromeNodeBrowserRequest(params.runtime, node.nodeId) : await resolveLocalMeetingBrowserRequest(params.runtime),
214
+ callBrowser,
229
215
  launch: params.config.chrome.launch,
230
216
  meetingSessionId: params.meetingSessionId,
231
217
  meetingUrl: params.meetingUrl,
@@ -234,13 +220,10 @@ async function leaveChromeMeet(params) {
234
220
  });
235
221
  }
236
222
  async function readChromeMeetTranscript(params) {
237
- const node = params.transport === "chrome-node" ? { nodeId: params.nodeId ?? await resolveChromeNode({
238
- runtime: params.runtime,
239
- requestedNode: params.config.chromeNode.node
240
- }) } : void 0;
241
- return await readMeetingTranscriptWithBrowser({
223
+ const { callBrowser } = await resolveChromeBrowserRoute(params);
224
+ return readMeetingTranscriptWithBrowser({
242
225
  adapter: GOOGLE_MEET_PLATFORM_ADAPTER,
243
- callBrowser: node ? chromeNodeBrowserRequest(params.runtime, node.nodeId) : await resolveLocalMeetingBrowserRequest(params.runtime),
226
+ callBrowser,
244
227
  finalize: params.finalize === true,
245
228
  meetingUrl: params.meetingUrl,
246
229
  meetingSessionId: params.meetingSessionId,
@@ -249,21 +232,18 @@ async function readChromeMeetTranscript(params) {
249
232
  });
250
233
  }
251
234
  async function recoverCurrentMeetTab(params) {
252
- const node = params.transport === "chrome-node" ? { nodeId: await resolveChromeNode({
253
- runtime: params.runtime,
254
- requestedNode: params.config.chromeNode.node
255
- }) } : void 0;
235
+ const { callBrowser, ...route } = await resolveChromeBrowserRoute({
236
+ ...params,
237
+ nodeId: void 0
238
+ });
256
239
  return {
257
- ...node ? {
258
- transport: "chrome-node",
259
- nodeId: node.nodeId
260
- } : { transport: "chrome" },
240
+ ...route,
261
241
  ...await recoverMeetingBrowserTab({
262
242
  adapter: GOOGLE_MEET_PLATFORM_ADAPTER,
263
- callBrowser: node ? chromeNodeBrowserRequest(params.runtime, node.nodeId) : await resolveLocalMeetingBrowserRequest(params.runtime),
243
+ callBrowser,
264
244
  captureCaptions: shouldCaptureCaptions(params.mode ?? "bidi", params.fullConfig),
265
245
  config: params.config.chrome,
266
- locationLabel: node ? "on the selected Chrome node" : "in local Chrome",
246
+ locationLabel: route.transport === "chrome-node" ? "on the selected Chrome node" : "in local Chrome",
267
247
  mode: params.mode ?? "bidi",
268
248
  readOnly: params.readOnly,
269
249
  requestedMeetingUrl: params.url,
@@ -437,6 +417,21 @@ async function joinMeetViaVoiceCallGateway(params) {
437
417
  //#endregion
438
418
  //#region extensions/google-meet/src/runtime.ts
439
419
  const nowIso = () => (/* @__PURE__ */ new Date()).toISOString();
420
+ function isBrowserTransport(transport) {
421
+ return transport === "chrome" || transport === "chrome-node";
422
+ }
423
+ function noteSession(session, note) {
424
+ session.notes = [...session.notes.filter((item) => item !== note), note];
425
+ }
426
+ function withSessionAgentConfig(config, agentId) {
427
+ return config.realtime.agentId === agentId ? config : {
428
+ ...config,
429
+ realtime: {
430
+ ...config.realtime,
431
+ agentId
432
+ }
433
+ };
434
+ }
440
435
  var GoogleMeetRuntime = class extends MeetingSessionRuntime {
441
436
  #createdBrowserTabs = /* @__PURE__ */ new Map();
442
437
  #voiceCallGateway;
@@ -496,8 +491,8 @@ var GoogleMeetRuntime = class extends MeetingSessionRuntime {
496
491
  },
497
492
  resolveJoin: (request) => ({
498
493
  url: adapter.urls.validateAndNormalize(request.url),
499
- transport: resolveTransport(request.transport, params.config),
500
- mode: resolveMode(request.mode, params.config),
494
+ transport: request.transport ?? params.config.defaultTransport,
495
+ mode: request.mode === "realtime" ? "agent" : request.mode ?? params.config.defaultMode,
501
496
  agentId: this.#resolveAgentId(request.agentId)
502
497
  }),
503
498
  createSession: ({ resolved, createdAt }) => createMeetingSession({
@@ -562,7 +557,7 @@ var GoogleMeetRuntime = class extends MeetingSessionRuntime {
562
557
  return result;
563
558
  }
564
559
  async recoverCurrentTab(request = {}) {
565
- const transport = resolveTransport(request.transport, this.params.config);
560
+ const transport = request.transport ?? this.params.config.defaultTransport;
566
561
  if (transport === "twilio") throw new Error("recover_current_tab only supports chrome or chrome-node transports");
567
562
  const url = request.url ? GOOGLE_MEET_PLATFORM_ADAPTER.urls.validateAndNormalize(request.url) : void 0;
568
563
  return await recoverCurrentMeetTab({
@@ -752,8 +747,7 @@ var GoogleMeetRuntime = class extends MeetingSessionRuntime {
752
747
  force: true,
753
748
  readOnly: true
754
749
  });
755
- else if (session.transport === "twilio") await this.#refreshTwilioVoiceCallStatus(session);
756
- else this.refreshSpeechReadiness(session);
750
+ else await this.#refreshTwilioVoiceCallStatus(session);
757
751
  }
758
752
  async #refreshTwilioVoiceCallStatus(session) {
759
753
  const callId = session.twilio?.voiceCallId;
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-B_Ohay99.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-1Oc4T1Bj.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";
@@ -12,7 +12,7 @@ export function FromObject(context, type, value) {
12
12
  return value;
13
13
  const additionalProperties = GetAdditionalProperties(type);
14
14
  for (const key of Guard.Keys(value)) {
15
- if (Guard.HasPropertyKey(type.properties, key)) {
15
+ if (Guard.HasPropertyKey(type.properties, key) && IsSchema(type.properties[key])) {
16
16
  value[key] = FromType(context, type.properties[key], value[key]);
17
17
  continue;
18
18
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.3.34",
4
+ "version": "1.3.35",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/google-meet",
3
- "version": "2026.10.5-beta.4",
3
+ "version": "2026.10.10-beta.1",
4
4
  "description": "OpenClaw Google Meet participant plugin for joining calls through Chrome or Twilio transports.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,10 +9,10 @@
9
9
  "type": "module",
10
10
  "dependencies": {
11
11
  "jszip": "3.10.2",
12
- "typebox": "1.3.34"
12
+ "typebox": "1.3.35"
13
13
  },
14
14
  "peerDependencies": {
15
- "openclaw": ">=2026.10.5-beta.4"
15
+ "openclaw": ">=2026.10.10-beta.1"
16
16
  },
17
17
  "peerDependenciesMeta": {
18
18
  "openclaw": {
@@ -30,10 +30,10 @@
30
30
  "minHostVersion": ">=2026.4.20"
31
31
  },
32
32
  "compat": {
33
- "pluginApi": ">=2026.10.5-beta.4"
33
+ "pluginApi": ">=2026.10.10-beta.1"
34
34
  },
35
35
  "build": {
36
- "openclawVersion": "2026.10.5-beta.4"
36
+ "openclawVersion": "2026.10.10-beta.1"
37
37
  },
38
38
  "release": {
39
39
  "publishToClawHub": true,