@openclaw/zalouser 2026.5.9-beta.1 → 2026.5.10-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.
@@ -1,7 +1,7 @@
1
1
  import "./setup-surface-6MmoBuUf.js";
2
2
  import "./setup-core-CqipqY98.js";
3
3
  import { r as parseZalouserOutboundTarget } from "./session-route-C0-Xr8bt.js";
4
- import "./channel-_NSq5FwQ.js";
4
+ import "./channel-BaznOdZe.js";
5
5
  import "./security-audit-BZLhil-V.js";
6
6
  import { i as listZaloFriendsMatching, n as getZaloUserInfo, s as listZaloGroupsMatching, t as checkZaloAuthenticated } from "./zalo-js-QGi0H5K7.js";
7
7
  import "./channel.setup-Tevqgs6C.js";
package/dist/api.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as zalouserSetupWizard } from "./setup-surface-6MmoBuUf.js";
2
2
  import { n as zalouserSetupAdapter, t as createZalouserSetupWizardProxy } from "./setup-core-CqipqY98.js";
3
- import { t as zalouserPlugin } from "./channel-_NSq5FwQ.js";
3
+ import { t as zalouserPlugin } from "./channel-BaznOdZe.js";
4
4
  import { n as isZalouserMutableGroupEntry, t as collectZalouserSecurityAuditFindings } from "./security-audit-BZLhil-V.js";
5
5
  import { t as zalouserSetupPlugin } from "./channel.setup-Tevqgs6C.js";
6
- import { t as createZalouserTool } from "./api-BR8DCvu2.js";
6
+ import { t as createZalouserTool } from "./api-Dl_YURKB.js";
7
7
  export { collectZalouserSecurityAuditFindings, createZalouserSetupWizardProxy, createZalouserTool, isZalouserMutableGroupEntry, zalouserPlugin, zalouserSetupAdapter, zalouserSetupPlugin, zalouserSetupWizard };
@@ -464,7 +464,7 @@ const zalouserPlugin = createChatChannelPlugin({
464
464
  setStatus: ctx.setStatus
465
465
  });
466
466
  ctx.log?.info(`[${account.accountId}] starting zalouser provider${userLabel}`);
467
- const { monitorZalouserProvider } = await import("./monitor-DvZ0E6nW.js");
467
+ const { monitorZalouserProvider } = await import("./monitor-BfclyB4b.js");
468
468
  return monitorZalouserProvider({
469
469
  account,
470
470
  config: ctx.cfg,
@@ -1,2 +1,2 @@
1
- import { t as zalouserPlugin } from "./channel-_NSq5FwQ.js";
1
+ import { t as zalouserPlugin } from "./channel-BaznOdZe.js";
2
2
  export { zalouserPlugin };
@@ -2,23 +2,18 @@ import { c as isZalouserGroupEntryAllowed, i as resolveZalouserMessageSid, o as
2
2
  import { o as listZaloGroups, r as listZaloFriends, u as resolveZaloGroupContext, v as startZaloListener } from "./zalo-js-QGi0H5K7.js";
3
3
  import { i as sendMessageZalouser, o as sendSeenZalouser, s as sendTypingZalouser, t as sendDeliveredZalouser } from "./send-CeCQ8UZF.js";
4
4
  import { createDeferred } from "openclaw/plugin-sdk/extension-shared";
5
- import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
5
+ import { normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeStringEntries } from "openclaw/plugin-sdk/text-runtime";
6
6
  import { mergeAllowlist, summarizeMapping } from "openclaw/plugin-sdk/allow-from";
7
7
  import { KeyedAsyncQueue } from "openclaw/plugin-sdk/core";
8
8
  import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/dangerous-name-runtime";
9
9
  import { deliverTextOrMediaReply, resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
10
10
  import { createChannelPairingController } from "openclaw/plugin-sdk/channel-pairing";
11
- import { DM_GROUP_ACCESS_REASON, resolveDmGroupAccessWithLists } from "openclaw/plugin-sdk/channel-policy";
12
11
  import { resolveDefaultGroupPolicy, resolveOpenProviderRuntimeGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
13
12
  import { implicitMentionKindWhen, resolveInboundMentionDecision } from "openclaw/plugin-sdk/channel-inbound";
14
- import { resolveSenderCommandAuthorization } from "openclaw/plugin-sdk/command-auth";
15
- import { evaluateGroupRouteAccessForPolicy, resolveSenderScopedGroupPolicy } from "openclaw/plugin-sdk/group-access";
13
+ import { resolveStableChannelMessageIngress } from "openclaw/plugin-sdk/channel-ingress-runtime";
16
14
  import { DEFAULT_GROUP_HISTORY_LIMIT, buildPendingHistoryContextFromMap, clearHistoryEntriesIfEnabled, recordPendingHistoryEntryIfEnabled } from "openclaw/plugin-sdk/reply-history";
17
15
  //#region extensions/zalouser/src/monitor.ts
18
16
  const ZALOUSER_TEXT_LIMIT = 2e3;
19
- function normalizeZalouserEntry(entry) {
20
- return entry.replace(/^(zalouser|zlu):/i, "").trim();
21
- }
22
17
  function buildNameIndex(items, nameFn) {
23
18
  const index = /* @__PURE__ */ new Map();
24
19
  for (const item of items) {
@@ -51,6 +46,12 @@ function resolveUserAllowlistEntries(entries, byName) {
51
46
  unresolved
52
47
  };
53
48
  }
49
+ function normalizeZalouserAllowEntry(entry) {
50
+ return entry.replace(/^(zalouser|zlu):/i, "").trim();
51
+ }
52
+ function normalizeZalouserSender(value) {
53
+ return normalizeOptionalLowercaseString(normalizeZalouserAllowEntry(value)) || null;
54
+ }
54
55
  function resolveInboundQueueKey(message) {
55
56
  const threadId = message.threadId?.trim() || "unknown";
56
57
  if (message.isGroup) return `group:${threadId}`;
@@ -60,6 +61,29 @@ function resolveZalouserDmSessionScope(config) {
60
61
  const configured = config.session?.dmScope;
61
62
  return configured === "main" || !configured ? "per-channel-peer" : configured;
62
63
  }
64
+ function resolveZalouserRouteAccess(params) {
65
+ if (params.groupPolicy === "disabled") return {
66
+ allowed: false,
67
+ reason: "disabled"
68
+ };
69
+ if (params.matched && params.enabled === false) return {
70
+ allowed: false,
71
+ reason: "route_disabled"
72
+ };
73
+ if (params.groupPolicy !== "allowlist") return { allowed: true };
74
+ if (!params.configured) return {
75
+ allowed: false,
76
+ reason: "empty_allowlist"
77
+ };
78
+ return params.matched ? { allowed: true } : {
79
+ allowed: false,
80
+ reason: "route_not_allowlisted"
81
+ };
82
+ }
83
+ function senderScopedZalouserGroupPolicy(params) {
84
+ if (params.groupPolicy === "disabled") return "disabled";
85
+ return params.groupAllowFrom.length > 0 ? "allowlist" : "open";
86
+ }
63
87
  function resolveZalouserInboundSessionKey(params) {
64
88
  if (params.isGroup) return params.route.sessionKey;
65
89
  const directSessionKey = normalizeLowercaseStringOrEmpty(params.core.channel.routing.buildAgentSessionKey({
@@ -94,14 +118,6 @@ function resolveZalouserInboundSessionKey(params) {
94
118
  function logVerbose(core, runtime, message) {
95
119
  if (core.logging.shouldLogVerbose()) runtime.log(`[zalouser] ${message}`);
96
120
  }
97
- function isSenderAllowed(senderId, allowFrom) {
98
- if (allowFrom.includes("*")) return true;
99
- const normalizedSenderId = normalizeOptionalLowercaseString(senderId);
100
- if (!normalizedSenderId) return false;
101
- return allowFrom.some((entry) => {
102
- return normalizeLowercaseStringOrEmpty(entry).replace(/^(zalouser|zlu):/i, "") === normalizedSenderId;
103
- });
104
- }
105
121
  function resolveGroupRequireMention(params) {
106
122
  const entry = findZalouserGroupEntry(params.groups ?? {}, buildZalouserGroupCandidates({
107
123
  groupId: params.groupId,
@@ -182,11 +198,11 @@ async function processMessage(message, account, config, core, runtime, historySt
182
198
  includeWildcard: true,
183
199
  allowNameMatching
184
200
  }));
185
- const routeAccess = evaluateGroupRouteAccessForPolicy({
201
+ const routeAccess = resolveZalouserRouteAccess({
186
202
  groupPolicy,
187
- routeAllowlistConfigured,
188
- routeMatched: Boolean(groupEntry),
189
- routeEnabled: isZalouserGroupEntryAllowed(groupEntry)
203
+ configured: routeAllowlistConfigured,
204
+ matched: Boolean(groupEntry),
205
+ enabled: isZalouserGroupEntryAllowed(groupEntry)
190
206
  });
191
207
  if (!routeAccess.allowed) {
192
208
  if (routeAccess.reason === "disabled") logVerbose(core, runtime, `zalouser: drop group ${chatId} (groupPolicy=disabled)`);
@@ -197,30 +213,45 @@ async function processMessage(message, account, config, core, runtime, historySt
197
213
  }
198
214
  }
199
215
  const dmPolicy = account.config.dmPolicy ?? "pairing";
200
- const configAllowFrom = (account.config.allowFrom ?? []).map((v) => String(v));
201
- const configGroupAllowFrom = (account.config.groupAllowFrom ?? []).map((v) => String(v));
202
- const senderGroupPolicy = routeAllowlistConfigured && configGroupAllowFrom.length === 0 ? groupPolicy : resolveSenderScopedGroupPolicy({
216
+ const configAllowFrom = normalizeStringEntries(account.config.allowFrom);
217
+ const configGroupAllowFrom = normalizeStringEntries(account.config.groupAllowFrom);
218
+ const senderGroupPolicy = routeAllowlistConfigured && configGroupAllowFrom.length === 0 ? groupPolicy : senderScopedZalouserGroupPolicy({
203
219
  groupPolicy,
204
220
  groupAllowFrom: configGroupAllowFrom
205
221
  });
206
- const storeAllowFrom = !isGroup && dmPolicy !== "allowlist" && dmPolicy !== "open" ? await pairing.readAllowFromStore().catch(() => []) : [];
207
- const accessDecision = resolveDmGroupAccessWithLists({
208
- isGroup,
222
+ const shouldComputeCommandAuth = core.channel.commands.shouldComputeCommandAuthorized(commandBody, config);
223
+ const accessDecision = await resolveStableChannelMessageIngress({
224
+ channelId: "zalouser",
225
+ accountId: account.accountId,
226
+ identity: {
227
+ normalize: normalizeZalouserSender,
228
+ sensitivity: "pii",
229
+ entryIdPrefix: "zalouser-entry"
230
+ },
231
+ cfg: config,
232
+ readStoreAllowFrom: async () => await pairing.readAllowFromStore(),
233
+ subject: { stableId: senderId },
234
+ conversation: {
235
+ kind: isGroup ? "group" : "direct",
236
+ id: isGroup ? "group" : senderId
237
+ },
209
238
  dmPolicy,
210
239
  groupPolicy: senderGroupPolicy,
240
+ policy: { groupAllowFromFallbackToAllowFrom: false },
211
241
  allowFrom: configAllowFrom,
212
242
  groupAllowFrom: configGroupAllowFrom,
213
- storeAllowFrom,
214
- groupAllowFromFallbackToAllowFrom: false,
215
- isSenderAllowed: (allowFrom) => isSenderAllowed(senderId, allowFrom)
243
+ command: shouldComputeCommandAuth ? {
244
+ directGroupAllowFrom: "effective",
245
+ commandGroupAllowFromFallbackToAllowFrom: true
246
+ } : void 0
216
247
  });
217
- if (isGroup && accessDecision.decision !== "allow") {
218
- if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.GROUP_POLICY_EMPTY_ALLOWLIST) logVerbose(core, runtime, "Blocked zalouser group message (no group allowlist)");
219
- else if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.GROUP_POLICY_NOT_ALLOWLISTED) logVerbose(core, runtime, `Blocked zalouser sender ${senderId} (not in groupAllowFrom/allowFrom)`);
248
+ if (isGroup && accessDecision.senderAccess.decision !== "allow") {
249
+ if (accessDecision.senderAccess.reasonCode === "group_policy_empty_allowlist") logVerbose(core, runtime, "Blocked zalouser group message (no group allowlist)");
250
+ else if (accessDecision.senderAccess.reasonCode === "group_policy_not_allowlisted") logVerbose(core, runtime, `Blocked zalouser sender ${senderId} (not in groupAllowFrom/allowFrom)`);
220
251
  return;
221
252
  }
222
- if (!isGroup && accessDecision.decision !== "allow") {
223
- if (accessDecision.decision === "pairing") {
253
+ if (!isGroup && accessDecision.senderAccess.decision !== "allow") {
254
+ if (accessDecision.senderAccess.decision === "pairing") {
224
255
  await pairing.issueChallenge({
225
256
  senderId,
226
257
  senderIdLine: `Your Zalo user id: ${senderId}`,
@@ -238,25 +269,11 @@ async function processMessage(message, account, config, core, runtime, historySt
238
269
  });
239
270
  return;
240
271
  }
241
- if (accessDecision.reasonCode === DM_GROUP_ACCESS_REASON.DM_POLICY_DISABLED) logVerbose(core, runtime, `Blocked zalouser DM from ${senderId} (dmPolicy=disabled)`);
272
+ if (accessDecision.senderAccess.reasonCode === "dm_policy_disabled") logVerbose(core, runtime, `Blocked zalouser DM from ${senderId} (dmPolicy=disabled)`);
242
273
  else logVerbose(core, runtime, `Blocked unauthorized zalouser sender ${senderId} (dmPolicy=${dmPolicy})`);
243
274
  return;
244
275
  }
245
- const { commandAuthorized } = await resolveSenderCommandAuthorization({
246
- cfg: config,
247
- rawBody: commandBody,
248
- isGroup,
249
- dmPolicy,
250
- configuredAllowFrom: configAllowFrom,
251
- configuredGroupAllowFrom: configGroupAllowFrom,
252
- senderId,
253
- isSenderAllowed,
254
- channel: "zalouser",
255
- accountId: account.accountId,
256
- readAllowFromStore: async () => storeAllowFrom,
257
- shouldComputeCommandAuthorized: (body, cfg) => core.channel.commands.shouldComputeCommandAuthorized(body, cfg),
258
- resolveCommandAuthorizedFromAuthorizers: (params) => core.channel.commands.resolveCommandAuthorizedFromAuthorizers(params)
259
- });
276
+ const commandAuthorized = accessDecision.commandAccess.requested ? accessDecision.commandAccess.authorized : void 0;
260
277
  const hasControlCommand = core.channel.commands.isControlCommandMessage(commandBody, config);
261
278
  if (isGroup && hasControlCommand && commandAuthorized !== true) {
262
279
  logVerbose(core, runtime, `zalouser: drop control command from unauthorized sender ${senderId}`);
@@ -436,80 +453,64 @@ async function processMessage(message, account, config, core, runtime, historySt
436
453
  CommandAuthorized: commandAuthorized
437
454
  }
438
455
  });
439
- const replyPipeline = { typing: {
440
- start: async () => {
441
- await sendTypingZalouser(chatId, {
442
- profile: account.profile,
443
- isGroup
444
- });
445
- },
446
- onStartError: (err) => {
447
- runtime.error?.(`[${account.accountId}] zalouser typing start failed for ${chatId}: ${String(err)}`);
448
- logVerbose(core, runtime, `zalouser typing failed for ${chatId}: ${String(err)}`);
449
- }
450
- } };
451
- await core.channel.turn.run({
456
+ await core.channel.turn.runAssembled({
452
457
  channel: "zalouser",
453
458
  accountId: account.accountId,
454
- raw: message,
455
- adapter: {
456
- ingest: () => ({
457
- id: messageSid ?? `${message.timestampMs}`,
458
- timestamp: message.timestampMs,
459
- rawText: rawBody,
460
- textForAgent: rawBody,
461
- textForCommands: commandBody,
462
- raw: message
463
- }),
464
- resolveTurn: () => ({
465
- cfg: config,
466
- channel: "zalouser",
467
- accountId: account.accountId,
468
- agentId: route.agentId,
469
- routeSessionKey: route.sessionKey,
470
- storePath,
471
- ctxPayload,
472
- recordInboundSession: core.channel.session.recordInboundSession,
473
- dispatchReplyWithBufferedBlockDispatcher: core.channel.reply.dispatchReplyWithBufferedBlockDispatcher,
474
- delivery: {
475
- preparePayload: (payload) => {
476
- if (payload.text === void 0) return payload;
477
- return {
478
- ...payload,
479
- text: core.channel.text.convertMarkdownTables(payload.text, core.channel.text.resolveMarkdownTableMode({
480
- cfg: config,
481
- channel: "zalouser",
482
- accountId: account.accountId
483
- }))
484
- };
485
- },
486
- durable: () => ({ to: normalizedTo }),
487
- deliver: async (payload) => {
488
- return await deliverZalouserReply({
489
- payload,
490
- profile: account.profile,
491
- chatId,
492
- isGroup,
493
- runtime,
494
- core,
495
- config,
496
- accountId: account.accountId,
497
- tableMode: "off"
498
- });
499
- },
500
- onDelivered: (_payload, _info, result) => {
501
- if (result?.visibleReplySent !== false) statusSink?.({ lastOutboundAt: Date.now() });
502
- },
503
- onError: (err, info) => {
504
- runtime.error(`[${account.accountId}] Zalouser ${info.kind} reply failed: ${String(err)}`);
505
- }
506
- },
507
- replyPipeline,
508
- record: { onRecordError: (err) => {
509
- runtime.error?.(`zalouser: failed updating session meta: ${String(err)}`);
510
- } }
511
- })
512
- }
459
+ cfg: config,
460
+ agentId: route.agentId,
461
+ routeSessionKey: route.sessionKey,
462
+ storePath,
463
+ ctxPayload,
464
+ recordInboundSession: core.channel.session.recordInboundSession,
465
+ dispatchReplyWithBufferedBlockDispatcher: core.channel.reply.dispatchReplyWithBufferedBlockDispatcher,
466
+ delivery: {
467
+ preparePayload: (payload) => {
468
+ if (payload.text === void 0) return payload;
469
+ return {
470
+ ...payload,
471
+ text: core.channel.text.convertMarkdownTables(payload.text, core.channel.text.resolveMarkdownTableMode({
472
+ cfg: config,
473
+ channel: "zalouser",
474
+ accountId: account.accountId
475
+ }))
476
+ };
477
+ },
478
+ durable: () => ({ to: normalizedTo }),
479
+ deliver: async (payload) => {
480
+ return await deliverZalouserReply({
481
+ payload,
482
+ profile: account.profile,
483
+ chatId,
484
+ isGroup,
485
+ runtime,
486
+ core,
487
+ config,
488
+ accountId: account.accountId,
489
+ tableMode: "off"
490
+ });
491
+ },
492
+ onDelivered: (_payload, _info, result) => {
493
+ if (result?.visibleReplySent !== false) statusSink?.({ lastOutboundAt: Date.now() });
494
+ },
495
+ onError: (err, info) => {
496
+ runtime.error(`[${account.accountId}] Zalouser ${info.kind} reply failed: ${String(err)}`);
497
+ }
498
+ },
499
+ replyPipeline: { typing: {
500
+ start: async () => {
501
+ await sendTypingZalouser(chatId, {
502
+ profile: account.profile,
503
+ isGroup
504
+ });
505
+ },
506
+ onStartError: (err) => {
507
+ runtime.error?.(`[${account.accountId}] zalouser typing start failed for ${chatId}: ${String(err)}`);
508
+ logVerbose(core, runtime, `zalouser typing failed for ${chatId}: ${String(err)}`);
509
+ }
510
+ } },
511
+ record: { onRecordError: (err) => {
512
+ runtime.error?.(`zalouser: failed updating session meta: ${String(err)}`);
513
+ } }
513
514
  });
514
515
  if (isGroup && historyKey) clearHistoryEntriesIfEnabled({
515
516
  historyMap: historyState.groupHistories,
@@ -568,8 +569,8 @@ async function monitorZalouserProvider(options) {
568
569
  const groupHistories = /* @__PURE__ */ new Map();
569
570
  try {
570
571
  const profile = account.profile;
571
- const allowFromEntries = (account.config.allowFrom ?? []).map((entry) => normalizeZalouserEntry(String(entry))).filter((entry) => entry && entry !== "*");
572
- const groupAllowFromEntries = (account.config.groupAllowFrom ?? []).map((entry) => normalizeZalouserEntry(String(entry))).filter((entry) => entry && entry !== "*");
572
+ const allowFromEntries = (account.config.allowFrom ?? []).map((entry) => normalizeZalouserAllowEntry(String(entry))).filter((entry) => entry && entry !== "*");
573
+ const groupAllowFromEntries = (account.config.groupAllowFrom ?? []).map((entry) => normalizeZalouserAllowEntry(String(entry))).filter((entry) => entry && entry !== "*");
573
574
  const allowNameMatching = isDangerousNameMatchingEnabled(account.config);
574
575
  if (allowNameMatching && (allowFromEntries.length > 0 || groupAllowFromEntries.length > 0)) {
575
576
  const byName = buildNameIndex(await listZaloFriends(profile), (friend) => friend.displayName);
@@ -612,7 +613,7 @@ async function monitorZalouserProvider(options) {
612
613
  const unresolved = [];
613
614
  const nextGroups = { ...groupsConfig };
614
615
  for (const entry of groupKeys) {
615
- const cleaned = normalizeZalouserEntry(entry);
616
+ const cleaned = normalizeZalouserAllowEntry(entry);
616
617
  if (/^\d+$/.test(cleaned)) {
617
618
  if (!nextGroups[cleaned]) nextGroups[cleaned] = groupsConfig[entry];
618
619
  mapping.push(`${entry}→${cleaned}`);
@@ -1,10 +1,10 @@
1
1
  import { n as zalouserSetupWizard } from "./setup-surface-6MmoBuUf.js";
2
2
  import { n as setZalouserRuntime } from "./runtime-QNU7vLgI.js";
3
3
  import { n as zalouserSetupAdapter, t as createZalouserSetupWizardProxy } from "./setup-core-CqipqY98.js";
4
- import { t as zalouserPlugin } from "./channel-_NSq5FwQ.js";
4
+ import { t as zalouserPlugin } from "./channel-BaznOdZe.js";
5
5
  import { n as isZalouserMutableGroupEntry, t as collectZalouserSecurityAuditFindings } from "./security-audit-BZLhil-V.js";
6
6
  import { t as zalouserSetupPlugin } from "./channel.setup-Tevqgs6C.js";
7
- import { t as createZalouserTool } from "./api-BR8DCvu2.js";
7
+ import { t as createZalouserTool } from "./api-Dl_YURKB.js";
8
8
  import { buildBaseAccountStatusSnapshot } from "openclaw/plugin-sdk/status-helpers";
9
9
  import { formatAllowFromLowercase, mergeAllowlist, summarizeMapping } from "openclaw/plugin-sdk/allow-from";
10
10
  import { DEFAULT_ACCOUNT_ID, buildChannelConfigSchema, normalizeAccountId } from "openclaw/plugin-sdk/core";
@@ -17,6 +17,4 @@ import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path";
17
17
  import { loadOutboundMediaFromUrl } from "openclaw/plugin-sdk/outbound-media";
18
18
  import { resolveDefaultGroupPolicy, resolveOpenProviderRuntimeGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
19
19
  import { resolveInboundMentionDecision } from "openclaw/plugin-sdk/channel-inbound";
20
- import { resolveSenderCommandAuthorization } from "openclaw/plugin-sdk/command-auth";
21
- import { evaluateGroupRouteAccessForPolicy, resolveSenderScopedGroupPolicy } from "openclaw/plugin-sdk/group-access";
22
- export { DEFAULT_ACCOUNT_ID, buildBaseAccountStatusSnapshot, buildChannelConfigSchema, chunkTextForOutbound, collectZalouserSecurityAuditFindings, createChannelMessageReplyPipeline, createChannelPairingController, createZalouserSetupWizardProxy, createZalouserTool, deliverTextOrMediaReply, evaluateGroupRouteAccessForPolicy, formatAllowFromLowercase, isDangerousNameMatchingEnabled, isNumericTargetId, isZalouserMutableGroupEntry, loadOutboundMediaFromUrl, mergeAllowlist, normalizeAccountId, resolveDefaultGroupPolicy, resolveInboundMentionDecision, resolveOpenProviderRuntimeGroupPolicy, resolvePreferredOpenClawTmpDir, resolveSendableOutboundReplyParts, resolveSenderCommandAuthorization, resolveSenderScopedGroupPolicy, sendPayloadWithChunkedTextAndMedia, setZalouserRuntime, summarizeMapping, warnMissingProviderGroupPolicyFallbackOnce, zalouserPlugin, zalouserSetupAdapter, zalouserSetupPlugin, zalouserSetupWizard };
20
+ export { DEFAULT_ACCOUNT_ID, buildBaseAccountStatusSnapshot, buildChannelConfigSchema, chunkTextForOutbound, collectZalouserSecurityAuditFindings, createChannelMessageReplyPipeline, createChannelPairingController, createZalouserSetupWizardProxy, createZalouserTool, deliverTextOrMediaReply, formatAllowFromLowercase, isDangerousNameMatchingEnabled, isNumericTargetId, isZalouserMutableGroupEntry, loadOutboundMediaFromUrl, mergeAllowlist, normalizeAccountId, resolveDefaultGroupPolicy, resolveInboundMentionDecision, resolveOpenProviderRuntimeGroupPolicy, resolvePreferredOpenClawTmpDir, resolveSendableOutboundReplyParts, sendPayloadWithChunkedTextAndMedia, setZalouserRuntime, summarizeMapping, warnMissingProviderGroupPolicyFallbackOnce, zalouserPlugin, zalouserSetupAdapter, zalouserSetupPlugin, zalouserSetupWizard };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/zalouser",
3
- "version": "2026.5.9-beta.1",
3
+ "version": "2026.5.10-beta.2",
4
4
  "description": "OpenClaw Zalo Personal Account plugin via native zca-js integration",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,7 +16,7 @@
16
16
  "openclaw": "workspace:*"
17
17
  },
18
18
  "peerDependencies": {
19
- "openclaw": ">=2026.5.9-beta.1"
19
+ "openclaw": ">=2026.5.10-beta.2"
20
20
  },
21
21
  "peerDependenciesMeta": {
22
22
  "openclaw": {
@@ -53,10 +53,10 @@
53
53
  "minHostVersion": ">=2026.4.10"
54
54
  },
55
55
  "compat": {
56
- "pluginApi": ">=2026.5.9-beta.1"
56
+ "pluginApi": ">=2026.5.10-beta.2"
57
57
  },
58
58
  "build": {
59
- "openclawVersion": "2026.5.9-beta.1"
59
+ "openclawVersion": "2026.5.10-beta.2"
60
60
  },
61
61
  "release": {
62
62
  "publishToClawHub": true,