@openclaw/mattermost 2026.6.11-beta.2 → 2026.7.1-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.
@@ -6,11 +6,13 @@ import { createAccountListHelpers, hasConfiguredAccountValue } from "openclaw/pl
6
6
  import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk/account-id";
7
7
  import { resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution";
8
8
  import { buildSecretInputSchema, hasConfiguredSecretInput, normalizeResolvedSecretInputString, normalizeSecretInputString } from "openclaw/plugin-sdk/secret-input";
9
- import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
9
+ import { readProviderJsonResponse, readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
10
+ import { readResponseWithLimit } from "openclaw/plugin-sdk/response-limit-runtime";
10
11
  import { sleep } from "openclaw/plugin-sdk/runtime-env";
11
12
  import { z } from "zod";
12
13
  //#region extensions/mattermost/src/mattermost/client.ts
13
14
  const MATTERMOST_ERROR_BODY_LIMIT_BYTES = 8 * 1024;
15
+ const MATTERMOST_TEXT_RESPONSE_LIMIT_BYTES = 64 * 1024;
14
16
  const NULL_BODY_STATUSES = new Set([
15
17
  101,
16
18
  204,
@@ -38,16 +40,12 @@ function buildMattermostApiUrl(baseUrl, path) {
38
40
  if (!normalized) throw new Error("Mattermost baseUrl is required");
39
41
  return `${normalized}/api/v4${path.startsWith("/") ? path : `/${path}`}`;
40
42
  }
43
+ async function readMattermostSuccessText(res, path) {
44
+ const bytes = await readResponseWithLimit(res, MATTERMOST_TEXT_RESPONSE_LIMIT_BYTES, { onOverflow: ({ maxBytes }) => /* @__PURE__ */ new Error(`Mattermost API ${path}: text response exceeds ${maxBytes} bytes`) });
45
+ return new TextDecoder().decode(bytes);
46
+ }
41
47
  async function readMattermostError(res) {
42
48
  const contentType = res.headers.get("content-type") ?? "";
43
- if (!res.body) {
44
- if (contentType.includes("application/json")) {
45
- const data = await res.json();
46
- if (data?.message) return data.message;
47
- return JSON.stringify(data);
48
- }
49
- return await res.text();
50
- }
51
49
  const text = await readResponseTextLimited(res, MATTERMOST_ERROR_BODY_LIMIT_BYTES);
52
50
  if (contentType.includes("application/json")) try {
53
51
  const data = JSON.parse(text);
@@ -130,8 +128,8 @@ function createMattermostClient(params) {
130
128
  throw new Error(`Mattermost API ${res.status} ${res.statusText}: ${detail || "unknown error"}`);
131
129
  }
132
130
  if (res.status === 204) return;
133
- if ((res.headers.get("content-type") ?? "").includes("application/json")) return await res.json();
134
- return await res.text();
131
+ if ((res.headers.get("content-type") ?? "").includes("application/json")) return await readProviderJsonResponse(res, `Mattermost API ${path}`);
132
+ return await readMattermostSuccessText(res, path);
135
133
  };
136
134
  return {
137
135
  baseUrl,
@@ -357,7 +355,7 @@ async function uploadMattermostFile(client, params) {
357
355
  const detail = await readMattermostError(res);
358
356
  throw new Error(`Mattermost API ${res.status} ${res.statusText}: ${detail || "unknown error"}`);
359
357
  }
360
- const info = (await res.json()).file_infos?.[0];
358
+ const info = (await readProviderJsonResponse(res, "Mattermost API /files")).file_infos?.[0];
361
359
  if (!info?.id) throw new Error("Mattermost file upload failed");
362
360
  return info;
363
361
  }
@@ -1,4 +1,4 @@
1
- import { a as describeMattermostAccount, c as mattermostMeta, i as MattermostChannelConfigSchema, n as mattermostSetupWizard, o as isMattermostConfigured, r as mattermostSetupAdapter, s as mattermostConfigAdapter, t as mattermostPlugin } from "./channel-plugin-runtime-MXClEU4F.js";
1
+ import { a as describeMattermostAccount, c as mattermostMeta, i as MattermostChannelConfigSchema, n as mattermostSetupWizard, o as isMattermostConfigured, r as mattermostSetupAdapter, s as mattermostConfigAdapter, t as mattermostPlugin } from "./channel-plugin-runtime-C7gpYyYd.js";
2
2
  import { t as resolveMattermostGatewayAuthBypassPaths } from "./gateway-auth-bypass-BHgOAkk8.js";
3
3
  //#region extensions/mattermost/src/channel.setup.ts
4
4
  const mattermostSetupPlugin = {
@@ -1,4 +1,4 @@
1
- import { C as hasConfiguredSecretInput, S as buildSecretInputSchema, g as normalizeMattermostBaseUrl, i as resolveMattermostReplyToMode, n as resolveDefaultMattermostAccountId, r as resolveMattermostAccount, t as listMattermostAccountIds } from "./accounts-DnAHfb5f.js";
1
+ import { C as hasConfiguredSecretInput, S as buildSecretInputSchema, g as normalizeMattermostBaseUrl, i as resolveMattermostReplyToMode, n as resolveDefaultMattermostAccountId, r as resolveMattermostAccount, t as listMattermostAccountIds } from "./accounts-Bt60MyHp.js";
2
2
  import { t as resolveMattermostGatewayAuthBypassPaths } from "./gateway-auth-bypass-BHgOAkk8.js";
3
3
  import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-ttH0DCuq.js";
4
4
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Cx0LUNXy.js";
@@ -565,7 +565,7 @@ const mattermostSetupWizard = {
565
565
  };
566
566
  //#endregion
567
567
  //#region extensions/mattermost/src/channel.ts
568
- const loadMattermostChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-W-pjr9zL.js"));
568
+ const loadMattermostChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-BfOTGtEU.js"));
569
569
  function buildMattermostPresentationButtons(presentation) {
570
570
  return presentation.blocks.filter((block) => block.type === "buttons").map((block) => block.buttons.flatMap((button) => {
571
571
  if (button.action) return [];
@@ -1,2 +1,2 @@
1
- import { t as mattermostPlugin } from "./channel-plugin-runtime-MXClEU4F.js";
1
+ import { t as mattermostPlugin } from "./channel-plugin-runtime-C7gpYyYd.js";
2
2
  export { mattermostPlugin };
@@ -1,7 +1,7 @@
1
1
  import { C as resolveChannelMediaMaxBytes, E as warnMissingProviderGroupPolicyFallbackOnce, S as resolveAllowlistProviderRuntimeGroupPolicy, T as resolveDefaultGroupPolicy, _ as logInboundDrop, c as buildAgentMediaPayload, d as createChannelMessageReplyPipeline, f as createChannelPairingController, h as listSkillCommandsForAgents, i as normalizeMattermostAllowEntry, l as buildModelsProviderData, n as formatMattermostDirectMessageDropLog, o as resolveMattermostMonitorInboundAccess, s as DEFAULT_GROUP_HISTORY_LIMIT, t as authorizeMattermostCommandInvocation, u as createChannelHistoryWindow, v as logTypingFailure, x as registerPluginHttpRoute, y as parseTcpPort } from "./monitor-auth-BiDuyvOc.js";
2
- import { _ as readMattermostError, a as MattermostPostSchema, b as updateMattermostPost, c as createMattermostPost, f as fetchMattermostMe, g as normalizeMattermostBaseUrl, h as fetchMattermostUserTeams, i as resolveMattermostReplyToMode, l as deleteMattermostPost, o as createMattermostClient, p as fetchMattermostUser, r as resolveMattermostAccount, t as listMattermostAccountIds, u as fetchMattermostChannel, y as sendMattermostTyping } from "./accounts-DnAHfb5f.js";
2
+ import { _ as readMattermostError, a as MattermostPostSchema, b as updateMattermostPost, c as createMattermostPost, f as fetchMattermostMe, g as normalizeMattermostBaseUrl, h as fetchMattermostUserTeams, i as resolveMattermostReplyToMode, l as deleteMattermostPost, o as createMattermostClient, p as fetchMattermostUser, r as resolveMattermostAccount, t as listMattermostAccountIds, u as fetchMattermostChannel, y as sendMattermostTyping } from "./accounts-Bt60MyHp.js";
3
3
  import { n as getOptionalMattermostRuntime, t as getMattermostRuntime } from "./runtime-CNB4YGqJ.js";
4
- import { C as registerSlashCommands, S as isSlashCommandsEnabled, T as resolveSlashCommandConfig, _ as renderMattermostModelsPickerView, a as sendMessageMattermost, b as DEFAULT_COMMAND_SPECS, c as computeInteractionCallbackUrl, d as setInteractionCallbackUrl, f as setInteractionSecret, g as parseMattermostModelPickerContext, h as buildMattermostAllowedModelRefs, l as createMattermostInteractionHandler, m as deliverMattermostReplyPayload, n as deactivateSlashCommands, o as resolveMattermostOpaqueTarget, p as createMattermostReplyDeliveryBarrier, r as getSlashCommandState, s as buildButtonProps, t as activateSlashCommands, u as resolveInteractionCallbackPath, v as renderMattermostProviderPickerView, w as resolveCallbackUrl, x as cleanupSlashCommands, y as resolveMattermostModelPickerCurrentModel } from "./slash-state-I1qleAHM.js";
4
+ import { C as registerSlashCommands, S as isSlashCommandsEnabled, T as resolveSlashCommandConfig, _ as renderMattermostModelsPickerView, a as sendMessageMattermost, b as DEFAULT_COMMAND_SPECS, c as computeInteractionCallbackUrl, d as setInteractionCallbackUrl, f as setInteractionSecret, g as parseMattermostModelPickerContext, h as buildMattermostAllowedModelRefs, l as createMattermostInteractionHandler, m as deliverMattermostReplyPayload, n as deactivateSlashCommands, o as resolveMattermostOpaqueTarget, p as createMattermostReplyDeliveryBarrier, r as getSlashCommandState, s as buildButtonProps, t as activateSlashCommands, u as resolveInteractionCallbackPath, v as renderMattermostProviderPickerView, w as resolveCallbackUrl, x as cleanupSlashCommands, y as resolveMattermostModelPickerCurrentModel } from "./slash-state-D1lza2ZZ.js";
5
5
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringEntries, normalizeTrimmedStringList, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
6
6
  import { formatInboundFromLabel } from "openclaw/plugin-sdk/channel-inbound";
7
7
  import { buildChannelProgressDraftLineForEntry, createChannelProgressDraftCompositor, createFinalizableDraftLifecycle, defineFinalizableLivePreviewAdapter, deliverWithFinalizableLivePreviewAdapter, resolveChannelStreamingPreviewToolProgress } from "openclaw/plugin-sdk/channel-outbound";
@@ -10,12 +10,14 @@ import { asDateTimestampMs, resolveExpiresAtMsFromDurationMs, resolveTimerTimeou
10
10
  import { safeParseJsonWithSchema, safeParseWithSchema } from "openclaw/plugin-sdk/extension-shared";
11
11
  import { buildTtsSupplementMediaPayload, countOutboundMedia, getReplyPayloadTtsSupplement, isReasoningReplyPayload } from "openclaw/plugin-sdk/reply-payload";
12
12
  import { fetchWithSsrFGuard, isPrivateNetworkOptInEnabled, ssrfPolicyFromPrivateNetworkOptIn } from "openclaw/plugin-sdk/ssrf-runtime";
13
+ import { readProviderJsonResponse } from "openclaw/plugin-sdk/provider-http";
13
14
  import { z } from "zod";
14
15
  import { resolveInboundLastRouteSessionKey, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
15
16
  import { resolvePinnedMainDmOwnerFromAllowlist } from "openclaw/plugin-sdk/security-runtime";
16
17
  import { randomUUID } from "node:crypto";
17
18
  import { isLoopbackHost } from "openclaw/plugin-sdk/gateway-runtime";
18
19
  import { createClaimableDedupe } from "openclaw/plugin-sdk/persistent-dedupe";
20
+ import { sliceUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
19
21
  import { captureWsEvent, createDebugProxyWebSocketAgent, resolveDebugProxySettings } from "openclaw/plugin-sdk/proxy-capture";
20
22
  import WebSocket from "ws";
21
23
  import { resolveGlobalDedupeCache } from "openclaw/plugin-sdk/dedupe-runtime";
@@ -151,7 +153,7 @@ function normalizeMattermostDraftText(text, maxChars) {
151
153
  const trimmed = text.trim();
152
154
  if (!trimmed) return "";
153
155
  if (trimmed.length <= maxChars) return trimmed;
154
- return `${trimmed.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`;
156
+ return `${sliceUtf16Safe(trimmed, 0, Math.max(0, maxChars - 3)).trimEnd()}...`;
155
157
  }
156
158
  function createMattermostDraftStream(params) {
157
159
  const maxChars = Math.min(params.maxChars ?? MATTERMOST_STREAM_MAX_CHARS, MATTERMOST_STREAM_MAX_CHARS);
@@ -1776,7 +1778,7 @@ async function monitorMattermostProvider(opts = {}) {
1776
1778
  cfg,
1777
1779
  route: modelSessionRoute,
1778
1780
  data,
1779
- skipCache: true
1781
+ readConsistency: "latest"
1780
1782
  });
1781
1783
  const view = renderMattermostModelsPickerView({
1782
1784
  ownerUserId: pickerState.ownerUserId,
@@ -2563,7 +2565,7 @@ async function probeMattermost(baseUrl, botToken, timeoutMs = 2500, allowPrivate
2563
2565
  elapsedMs
2564
2566
  };
2565
2567
  }
2566
- const bot = await res.json();
2568
+ const bot = await readProviderJsonResponse(res, "Mattermost probe /users/me");
2567
2569
  return {
2568
2570
  ok: true,
2569
2571
  status: res.status,
@@ -18,7 +18,7 @@ import { DEFAULT_ACCOUNT_ID, buildChannelConfigSchema, createDedupeCache, isTrus
18
18
  import { chunkTextForOutbound } from "openclaw/plugin-sdk/text-chunking";
19
19
  import { applyAccountNameToChannelSection, applySetupAccountConfigPatch, migrateBaseNameToDefaultAccount } from "openclaw/plugin-sdk/setup";
20
20
  import { buildComputedAccountStatusSnapshot } from "openclaw/plugin-sdk/channel-status";
21
- import { loadSessionStore, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
21
+ import { resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
22
22
  import { normalizeAccountId, resolveThreadSessionKeys } from "openclaw/plugin-sdk/routing";
23
23
  import { normalizeProviderId } from "openclaw/plugin-sdk/provider-model-shared";
24
- export { DEFAULT_ACCOUNT_ID, DEFAULT_GROUP_HISTORY_LIMIT, GROUP_POLICY_BLOCKED_LABEL, applyAccountNameToChannelSection, applySetupAccountConfigPatch, buildAgentMediaPayload, buildChannelConfigSchema, buildComputedAccountStatusSnapshot, buildModelsProviderData, buildPendingHistoryContextFromMap, chunkTextForOutbound, clearHistoryEntriesIfEnabled, createAccountStatusSink, createChannelHistoryWindow, createChannelMessageReplyPipeline, createChannelPairingController, createDedupeCache, formatInboundFromLabel, getAgentScopedMediaLocalRoots, isDangerousNameMatchingEnabled, isRequestBodyLimitError, isTrustedProxyAddress, listSkillCommandsForAgents, loadOutboundMediaFromUrl, loadSessionStore, logInboundDrop, logTypingFailure, migrateBaseNameToDefaultAccount, normalizeAccountId, normalizeProviderId, parseStrictPositiveInteger, rawDataToString, readRequestBodyWithLimit, recordPendingHistoryEntryIfEnabled, registerPluginHttpRoute, resolveAllowlistMatchSimple, resolveAllowlistProviderRuntimeGroupPolicy, resolveChannelMediaMaxBytes, resolveClientIp, resolveControlCommandGate, resolveDefaultGroupPolicy, resolveStorePath, resolveStoredModelOverride, resolveThreadSessionKeys, setMattermostRuntime, warnMissingProviderGroupPolicyFallbackOnce };
24
+ export { DEFAULT_ACCOUNT_ID, DEFAULT_GROUP_HISTORY_LIMIT, GROUP_POLICY_BLOCKED_LABEL, applyAccountNameToChannelSection, applySetupAccountConfigPatch, buildAgentMediaPayload, buildChannelConfigSchema, buildComputedAccountStatusSnapshot, buildModelsProviderData, buildPendingHistoryContextFromMap, chunkTextForOutbound, clearHistoryEntriesIfEnabled, createAccountStatusSink, createChannelHistoryWindow, createChannelMessageReplyPipeline, createChannelPairingController, createDedupeCache, formatInboundFromLabel, getAgentScopedMediaLocalRoots, isDangerousNameMatchingEnabled, isRequestBodyLimitError, isTrustedProxyAddress, listSkillCommandsForAgents, loadOutboundMediaFromUrl, logInboundDrop, logTypingFailure, migrateBaseNameToDefaultAccount, normalizeAccountId, normalizeProviderId, parseStrictPositiveInteger, rawDataToString, readRequestBodyWithLimit, recordPendingHistoryEntryIfEnabled, registerPluginHttpRoute, resolveAllowlistMatchSimple, resolveAllowlistProviderRuntimeGroupPolicy, resolveChannelMediaMaxBytes, resolveClientIp, resolveControlCommandGate, resolveDefaultGroupPolicy, resolveStorePath, resolveStoredModelOverride, resolveThreadSessionKeys, setMattermostRuntime, warnMissingProviderGroupPolicyFallbackOnce };
@@ -1,2 +1,2 @@
1
- import { i as registerSlashCommandRoute } from "./slash-state-I1qleAHM.js";
1
+ import { i as registerSlashCommandRoute } from "./slash-state-D1lza2ZZ.js";
2
2
  export { registerSlashCommandRoute };
@@ -1,5 +1,5 @@
1
1
  import { a as normalizeMattermostAllowList, b as readRequestBodyWithLimit, d as createChannelMessageReplyPipeline, g as loadOutboundMediaFromUrl, l as buildModelsProviderData, m as isTrustedProxyAddress, p as isRequestBodyLimitError, t as authorizeMattermostCommandInvocation, v as logTypingFailure, w as resolveClientIp } from "./monitor-auth-BiDuyvOc.js";
2
- import { b as updateMattermostPost, c as createMattermostPost, d as fetchMattermostChannelByName, f as fetchMattermostMe, g as normalizeMattermostBaseUrl, h as fetchMattermostUserTeams, m as fetchMattermostUserByUsername, o as createMattermostClient, p as fetchMattermostUser, r as resolveMattermostAccount, s as createMattermostDirectChannelWithRetry, u as fetchMattermostChannel, v as resolveMattermostReplyDeliveryBarrierTimeoutMs, x as uploadMattermostFile, y as sendMattermostTyping } from "./accounts-DnAHfb5f.js";
2
+ import { b as updateMattermostPost, c as createMattermostPost, d as fetchMattermostChannelByName, f as fetchMattermostMe, g as normalizeMattermostBaseUrl, h as fetchMattermostUserTeams, m as fetchMattermostUserByUsername, o as createMattermostClient, p as fetchMattermostUser, r as resolveMattermostAccount, s as createMattermostDirectChannelWithRetry, u as fetchMattermostChannel, v as resolveMattermostReplyDeliveryBarrierTimeoutMs, x as uploadMattermostFile, y as sendMattermostTyping } from "./accounts-Bt60MyHp.js";
3
3
  import { t as getMattermostRuntime } from "./runtime-CNB4YGqJ.js";
4
4
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, normalizeStringifiedOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
@@ -9,7 +9,7 @@ import { asDateTimestampMs, parseStrictInteger, resolveExpiresAtMsFromDurationMs
9
9
  import { deliverTextOrMediaReply, isReasoningReplyPayload, resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
10
10
  import { isPrivateNetworkOptInEnabled } from "openclaw/plugin-sdk/ssrf-runtime";
11
11
  import { convertMarkdownTables } from "openclaw/plugin-sdk/text-chunking";
12
- import { loadSessionStore, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
12
+ import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
13
13
  import { normalizeProviderId } from "openclaw/plugin-sdk/provider-model-shared";
14
14
  import { Readable } from "node:stream";
15
15
  import { safeEqualSecret } from "openclaw/plugin-sdk/security-runtime";
@@ -481,12 +481,20 @@ function resolveMattermostModelPickerCurrentModel(params) {
481
481
  const fallback = `${params.data.resolvedDefault.provider}/${params.data.resolvedDefault.model}`;
482
482
  try {
483
483
  const storePath = resolveStorePath(params.cfg.session?.store, { agentId: params.route.agentId });
484
- const sessionStore = params.skipCache ? loadSessionStore(storePath, { skipCache: true }) : loadSessionStore(storePath);
485
- const sessionEntry = sessionStore[params.route.sessionKey];
484
+ const sessionEntry = getSessionEntry({
485
+ storePath,
486
+ sessionKey: params.route.sessionKey,
487
+ ...params.readConsistency === "latest" ? { readConsistency: "latest" } : {}
488
+ });
486
489
  const override = resolveStoredModelOverride({
487
490
  sessionEntry,
488
- sessionStore,
491
+ loadSessionEntry: (sessionKey) => getSessionEntry({
492
+ storePath,
493
+ sessionKey,
494
+ ...params.readConsistency === "latest" ? { readConsistency: "latest" } : {}
495
+ }),
489
496
  sessionKey: params.route.sessionKey,
497
+ parentSessionKey: sessionEntry?.parentSessionKey,
490
498
  defaultProvider: params.data.resolvedDefault.provider
491
499
  });
492
500
  if (!override?.model) return fallback;
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@openclaw/mattermost",
3
- "version": "2026.6.11-beta.2",
3
+ "version": "2026.7.1-beta.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/mattermost",
9
- "version": "2026.6.11-beta.2",
9
+ "version": "2026.7.1-beta.1",
10
10
  "dependencies": {
11
11
  "ws": "8.21.0",
12
12
  "zod": "4.4.3"
13
13
  },
14
14
  "peerDependencies": {
15
- "openclaw": ">=2026.6.11-beta.2"
15
+ "openclaw": ">=2026.7.1-beta.1"
16
16
  },
17
17
  "peerDependenciesMeta": {
18
18
  "openclaw": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/mattermost",
3
- "version": "2026.6.11-beta.2",
3
+ "version": "2026.7.1-beta.1",
4
4
  "description": "OpenClaw Mattermost channel plugin",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,7 +12,7 @@
12
12
  "zod": "4.4.3"
13
13
  },
14
14
  "peerDependencies": {
15
- "openclaw": ">=2026.6.11-beta.2"
15
+ "openclaw": ">=2026.7.1-beta.1"
16
16
  },
17
17
  "peerDependenciesMeta": {
18
18
  "openclaw": {
@@ -41,10 +41,10 @@
41
41
  "allowInvalidConfigRecovery": true
42
42
  },
43
43
  "compat": {
44
- "pluginApi": ">=2026.6.11-beta.2"
44
+ "pluginApi": ">=2026.7.1-beta.1"
45
45
  },
46
46
  "build": {
47
- "openclawVersion": "2026.6.11-beta.2",
47
+ "openclawVersion": "2026.7.1-beta.1",
48
48
  "bundledDist": false
49
49
  },
50
50
  "release": {