@openclaw/mattermost 2026.6.11 → 2026.7.1-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.
@@ -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-CbFQSpwf.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-CnE1CD40.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-CbFQSpwf.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";
@@ -103,7 +105,7 @@ async function listMattermostDirectoryGroups(params) {
103
105
  * user list (unlike channels where membership varies). Uses the first team
104
106
  * returned — multi-team setups will only see members from that team.
105
107
  *
106
- * NOTE: per_page=200 for member listing; same pagination caveat as groups.
108
+ * Uses paginated member listing with per_page=200, the Mattermost API maximum.
107
109
  */
108
110
  async function listMattermostDirectoryPeers(params) {
109
111
  const clients = buildClients(params);
@@ -124,12 +126,22 @@ async function listMattermostDirectoryPeers(params) {
124
126
  })
125
127
  });
126
128
  else {
127
- const userIds = (await client.request(`/teams/${teamId}/members?per_page=200`)).map((m) => m.user_id).filter((id) => id !== me.id);
129
+ const pageSize = 200;
130
+ const userIds = [];
131
+ for (let page = 0;; page += 1) {
132
+ const pageMembers = await client.request(`/teams/${teamId}/members?page=${page}&per_page=${pageSize}`);
133
+ for (const member of pageMembers) if (member.user_id !== me.id) userIds.push(member.user_id);
134
+ if (pageMembers.length < pageSize) break;
135
+ }
128
136
  if (!userIds.length) return [];
129
- users = await client.request("/users/ids", {
130
- method: "POST",
131
- body: JSON.stringify(userIds)
132
- });
137
+ users = [];
138
+ for (let index = 0; index < userIds.length; index += pageSize) {
139
+ const userIdBatch = userIds.slice(index, index + pageSize);
140
+ users.push(...await client.request("/users/ids", {
141
+ method: "POST",
142
+ body: JSON.stringify(userIdBatch)
143
+ }));
144
+ }
133
145
  }
134
146
  const entries = users.filter((u) => u.id !== me.id).map((u) => ({
135
147
  kind: "user",
@@ -151,7 +163,7 @@ function normalizeMattermostDraftText(text, maxChars) {
151
163
  const trimmed = text.trim();
152
164
  if (!trimmed) return "";
153
165
  if (trimmed.length <= maxChars) return trimmed;
154
- return `${trimmed.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`;
166
+ return `${sliceUtf16Safe(trimmed, 0, Math.max(0, maxChars - 3)).trimEnd()}...`;
155
167
  }
156
168
  function createMattermostDraftStream(params) {
157
169
  const maxChars = Math.min(params.maxChars ?? MATTERMOST_STREAM_MAX_CHARS, MATTERMOST_STREAM_MAX_CHARS);
@@ -1776,7 +1788,7 @@ async function monitorMattermostProvider(opts = {}) {
1776
1788
  cfg,
1777
1789
  route: modelSessionRoute,
1778
1790
  data,
1779
- skipCache: true
1791
+ readConsistency: "latest"
1780
1792
  });
1781
1793
  const view = renderMattermostModelsPickerView({
1782
1794
  ownerUserId: pickerState.ownerUserId,
@@ -2563,7 +2575,7 @@ async function probeMattermost(baseUrl, botToken, timeoutMs = 2500, allowPrivate
2563
2575
  elapsedMs
2564
2576
  };
2565
2577
  }
2566
- const bot = await res.json();
2578
+ const bot = await readProviderJsonResponse(res, "Mattermost probe /users/me");
2567
2579
  return {
2568
2580
  ok: true,
2569
2581
  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",
3
+ "version": "2026.7.1-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/mattermost",
9
- "version": "2026.6.11",
9
+ "version": "2026.7.1-beta.2",
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"
15
+ "openclaw": ">=2026.7.1-beta.2"
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",
3
+ "version": "2026.7.1-beta.2",
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"
15
+ "openclaw": ">=2026.7.1-beta.2"
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"
44
+ "pluginApi": ">=2026.7.1-beta.2"
45
45
  },
46
46
  "build": {
47
- "openclawVersion": "2026.6.11",
47
+ "openclawVersion": "2026.7.1-beta.2",
48
48
  "bundledDist": false
49
49
  },
50
50
  "release": {