@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.
- package/dist/{api-BR8DCvu2.js → api-Dl_YURKB.js} +1 -1
- package/dist/api.js +2 -2
- package/dist/{channel-_NSq5FwQ.js → channel-BaznOdZe.js} +1 -1
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{monitor-DvZ0E6nW.js → monitor-BfclyB4b.js} +125 -124
- package/dist/runtime-api.js +3 -5
- package/package.json +4 -4
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 {
|
|
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 =
|
|
201
|
+
const routeAccess = resolveZalouserRouteAccess({
|
|
186
202
|
groupPolicy,
|
|
187
|
-
routeAllowlistConfigured,
|
|
188
|
-
|
|
189
|
-
|
|
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
|
|
201
|
-
const configGroupAllowFrom = (account.config.groupAllowFrom
|
|
202
|
-
const senderGroupPolicy = routeAllowlistConfigured && configGroupAllowFrom.length === 0 ? groupPolicy :
|
|
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
|
|
207
|
-
const accessDecision =
|
|
208
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
243
|
+
command: shouldComputeCommandAuth ? {
|
|
244
|
+
directGroupAllowFrom: "effective",
|
|
245
|
+
commandGroupAllowFromFallbackToAllowFrom: true
|
|
246
|
+
} : void 0
|
|
216
247
|
});
|
|
217
|
-
if (isGroup && accessDecision.decision !== "allow") {
|
|
218
|
-
if (accessDecision.reasonCode ===
|
|
219
|
-
else if (accessDecision.reasonCode ===
|
|
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 ===
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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) =>
|
|
572
|
-
const groupAllowFromEntries = (account.config.groupAllowFrom ?? []).map((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 =
|
|
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}`);
|
package/dist/runtime-api.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
56
|
+
"pluginApi": ">=2026.5.10-beta.2"
|
|
57
57
|
},
|
|
58
58
|
"build": {
|
|
59
|
-
"openclawVersion": "2026.5.
|
|
59
|
+
"openclawVersion": "2026.5.10-beta.2"
|
|
60
60
|
},
|
|
61
61
|
"release": {
|
|
62
62
|
"publishToClawHub": true,
|