@openclaw/zalo 2026.7.2-beta.1 → 2026.7.2-beta.3

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.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { n as zaloDmPolicy, r as zaloSetupAdapter, t as createZaloSetupWizardProxy } from "./setup-core-fwCh0QUi.js";
2
- import { t as zaloPlugin } from "./channel-C_73K8pR.js";
2
+ import { t as zaloPlugin } from "./channel-DikWJ2TC.js";
3
3
  import { n as resolveZaloRuntimeGroupPolicy } from "./group-access-8qHRzDHx.js";
4
4
  import { zaloSetupWizard } from "./setup-api.js";
5
5
  export { createZaloSetupWizardProxy, resolveZaloRuntimeGroupPolicy, zaloDmPolicy, zaloPlugin, zaloSetupAdapter, zaloSetupWizard };
@@ -13,19 +13,20 @@ import { createStaticReplyToModeResolver } from "openclaw/plugin-sdk/conversatio
13
13
  import { createChannelDirectoryAdapter, listResolvedDirectoryUserEntriesFromAllowFrom } from "openclaw/plugin-sdk/directory-runtime";
14
14
  import { createLazyRuntimeModule, createLazyRuntimeNamedExport } from "openclaw/plugin-sdk/lazy-runtime";
15
15
  import { sendPayloadWithChunkedTextAndMedia } from "openclaw/plugin-sdk/reply-payload";
16
- import { createComputedAccountStatusAdapter, createDefaultChannelRuntimeState } from "openclaw/plugin-sdk/status-helpers";
16
+ import { createComputedAccountStatusAdapter, createDefaultChannelRuntimeState, standardDmPolicyOpenIssue } from "openclaw/plugin-sdk/status-helpers";
17
17
  import { chunkTextForOutbound } from "openclaw/plugin-sdk/text-chunking";
18
18
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
19
19
  import { buildChannelOutboundSessionRoute, stripChannelTargetPrefix, stripTargetKindPrefix } from "openclaw/plugin-sdk/core";
20
20
  import { jsonResult, readStringParam } from "openclaw/plugin-sdk/channel-actions";
21
21
  import { extractToolSend } from "openclaw/plugin-sdk/tool-send";
22
22
  import { createChannelApprovalAuth } from "openclaw/plugin-sdk/approval-auth-runtime";
23
- import { AllowFromListSchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, buildCatchallMultiAccountChannelSchema } from "openclaw/plugin-sdk/channel-config-schema";
23
+ import { AllowFromListSchema, DmPolicySchema, GroupPolicySchema, MarkdownConfigSchema, buildMultiAccountChannelSchema } from "openclaw/plugin-sdk/channel-config-schema";
24
24
  import { z } from "zod";
25
25
  import { coerceStatusIssueAccountId, readStatusIssueFields } from "openclaw/plugin-sdk/extension-shared";
26
26
  //#region extensions/zalo/src/actions.ts
27
27
  const loadZaloActionsRuntime = createLazyRuntimeNamedExport(() => import("./actions.runtime-OmfJFYZn.js"), "zaloActionsRuntime");
28
28
  const providerId = "zalo";
29
+ const ZALO_ACTIONS = /* @__PURE__ */ new Set(["send"]);
29
30
  function listEnabledAccounts(cfg, accountId) {
30
31
  return (accountId ? [resolveZaloAccount({
31
32
  cfg,
@@ -35,12 +36,12 @@ function listEnabledAccounts(cfg, accountId) {
35
36
  const zaloMessageActions = {
36
37
  describeMessageTool: ({ cfg, accountId }) => {
37
38
  if (listEnabledAccounts(cfg, accountId).length === 0) return null;
38
- const actions = /* @__PURE__ */ new Set(["send"]);
39
39
  return {
40
- actions: Array.from(actions),
40
+ actions: Array.from(ZALO_ACTIONS),
41
41
  capabilities: []
42
42
  };
43
43
  },
44
+ supportsAction: ({ action }) => ZALO_ACTIONS.has(action),
44
45
  extractToolSend: ({ args }) => extractToolSend(args, "sendMessage"),
45
46
  handleAction: async ({ action, params, cfg, accountId }) => {
46
47
  if (action === "send") {
@@ -85,7 +86,7 @@ const zaloApprovalAuth = createChannelApprovalAuth({
85
86
  },
86
87
  normalizeApprover: normalizeZaloApproverId
87
88
  }).approvalAuth;
88
- const ZaloConfigSchema = buildCatchallMultiAccountChannelSchema(z.object({
89
+ const ZaloConfigSchema = buildMultiAccountChannelSchema(z.object({
89
90
  name: z.string().optional(),
90
91
  enabled: z.boolean().optional(),
91
92
  markdown: MarkdownConfigSchema,
@@ -101,7 +102,7 @@ const ZaloConfigSchema = buildCatchallMultiAccountChannelSchema(z.object({
101
102
  mediaMaxMb: z.number().optional(),
102
103
  proxy: z.string().optional(),
103
104
  responsePrefix: z.string().optional()
104
- }));
105
+ }), { accountsMode: "catchall" });
105
106
  //#endregion
106
107
  //#region extensions/zalo/src/session-route.ts
107
108
  function resolveZaloOutboundSessionRoute(params) {
@@ -144,13 +145,12 @@ function collectZaloStatusIssues(accounts) {
144
145
  const enabled = account.enabled !== false;
145
146
  const configured = account.configured === true;
146
147
  if (!enabled || !configured) continue;
147
- if (account.dmPolicy === "open") issues.push({
148
+ if (account.dmPolicy === "open") issues.push(standardDmPolicyOpenIssue({
148
149
  channel: "zalo",
149
150
  accountId,
150
- kind: "config",
151
- message: "Zalo dmPolicy is \"open\", allowing any user to message the bot without pairing.",
152
- fix: "Set channels.zalo.dmPolicy to \"pairing\" or \"allowlist\" to restrict access."
153
- });
151
+ channelLabel: "Zalo",
152
+ configPath: "channels.zalo"
153
+ }));
154
154
  }
155
155
  return issues;
156
156
  }
@@ -176,7 +176,7 @@ function looksLikeZaloChatId(raw, normalized) {
176
176
  const target = normalizeZaloMessagingTarget(normalized ?? raw);
177
177
  return Boolean(target);
178
178
  }
179
- const loadZaloChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-DiilvQ99.js"));
179
+ const loadZaloChannelRuntime = createLazyRuntimeModule(() => import("./channel.runtime-DrCGqgEo.js"));
180
180
  const zaloSetupWizard = createZaloSetupWizardProxy(async () => (await import("./setup-surface-8eRimod9.js")).zaloSetupWizard);
181
181
  const zaloTextChunkLimit = 2e3;
182
182
  async function sendZaloDelivery(ctx) {
@@ -1,2 +1,2 @@
1
- import { t as zaloPlugin } from "./channel-C_73K8pR.js";
1
+ import { t as zaloPlugin } from "./channel-DikWJ2TC.js";
2
2
  export { zaloPlugin };
@@ -1,5 +1,5 @@
1
1
  import { p as normalizeSecretInputString } from "./setup-core-fwCh0QUi.js";
2
- import { i as PAIRING_APPROVED_MESSAGE } from "./runtime-api-CAA4ZtqF.js";
2
+ import { i as PAIRING_APPROVED_MESSAGE } from "./runtime-api-B53PGWBW.js";
3
3
  import { a as getMe, n as resolveZaloProxyFetch, r as ZaloApiError, t as sendMessageZalo } from "./send-9sVVxyap.js";
4
4
  import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-outbound";
5
5
  //#region extensions/zalo/src/probe.ts
@@ -86,7 +86,7 @@ async function startZaloGatewayAccount(ctx) {
86
86
  setStatus: ctx.setStatus
87
87
  });
88
88
  ctx.log?.info(`[${account.accountId}] starting provider${zaloBotLabel} mode=${mode}`);
89
- const { monitorZaloProvider } = await import("./monitor-alx9kzIY.js");
89
+ const { monitorZaloProvider } = await import("./monitor-oEpn3pC7.js");
90
90
  return monitorZaloProvider({
91
91
  token,
92
92
  account,
@@ -1,5 +1,5 @@
1
1
  import { n as resolveZaloRuntimeGroupPolicy, t as normalizeZaloAllowEntry } from "./group-access-8qHRzDHx.js";
2
- import { t as getZaloRuntime } from "./runtime-api-CAA4ZtqF.js";
2
+ import { t as getZaloRuntime } from "./runtime-api-B53PGWBW.js";
3
3
  import { c as sendChatAction, d as setWebhook, i as deleteWebhook, l as sendMessage, n as resolveZaloProxyFetch, o as getUpdates, r as ZaloApiError, s as getWebhookInfo, u as sendPhoto } from "./send-9sVVxyap.js";
4
4
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
5
5
  import { deliverTextOrMediaReply, resolveSendableOutboundReplyParts } from "openclaw/plugin-sdk/reply-payload";
@@ -7,13 +7,13 @@ import { normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtim
7
7
  import { resolveDefaultGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce } from "openclaw/plugin-sdk/runtime-group-policy";
8
8
  import { createChannelPairingController } from "openclaw/plugin-sdk/channel-pairing";
9
9
  import { logTypingFailure } from "openclaw/plugin-sdk/channel-feedback";
10
- import { resolveInboundRouteEnvelopeBuilderWithRuntime } from "openclaw/plugin-sdk/inbound-envelope";
11
10
  import { registerPluginHttpRoute, resolveWebhookPath } from "openclaw/plugin-sdk/webhook-ingress";
12
11
  import { asDateTimestampMs, resolveExpiresAtMsFromDurationMs } from "openclaw/plugin-sdk/number-runtime";
13
- import { formatInboundMediaUnavailableText } from "openclaw/plugin-sdk/channel-inbound";
12
+ import { formatInboundMediaUnavailableText, resolveChannelInboundRouteEnvelope } from "openclaw/plugin-sdk/channel-inbound";
14
13
  import { resolveStableChannelMessageIngress } from "openclaw/plugin-sdk/channel-ingress-runtime";
15
14
  import { sleepWithAbort, waitForAbortSignal } from "openclaw/plugin-sdk/runtime-env";
16
15
  import { createHostedOutboundMediaStore } from "openclaw/plugin-sdk/outbound-media";
16
+ import { safeEqualSecret } from "openclaw/plugin-sdk/security-runtime";
17
17
  //#region extensions/zalo/src/monitor-durable.ts
18
18
  function prepareZaloDurableReplyPayload(params) {
19
19
  if (!params.payload.text) return params.payload;
@@ -129,7 +129,7 @@ async function tryHandleHostedZaloMediaRequest(req, res) {
129
129
  res.end("Expired");
130
130
  return true;
131
131
  }
132
- if (url.searchParams.get("token") !== entry.metadata.token) {
132
+ if (!safeEqualSecret(url.searchParams.get("token"), entry.metadata.token)) {
133
133
  res.statusCode = 401;
134
134
  res.end("Unauthorized");
135
135
  return true;
@@ -164,7 +164,7 @@ function resolveZaloTimestampMs(date) {
164
164
  if (!date) return;
165
165
  return date >= UNIX_MILLISECONDS_THRESHOLD ? date : date * 1e3;
166
166
  }
167
- const loadZaloWebhookModule = createLazyRuntimeModule(() => import("./monitor.webhook-AYcIUBBP.js"));
167
+ const loadZaloWebhookModule = createLazyRuntimeModule(() => import("./monitor.webhook-CiT0mp4W.js"));
168
168
  function releaseSharedHostedMediaRouteRef(routePath) {
169
169
  const current = hostedMediaRouteRefs.get(routePath);
170
170
  if (!current) return;
@@ -478,16 +478,14 @@ async function processMessageWithPipeline(params) {
478
478
  if (!authorization) return;
479
479
  const { isGroup, chatId, senderId, senderName, rawBody, commandAuthorized } = authorization;
480
480
  const agentBody = agentBodyOverride ?? rawBody;
481
- const { route, buildEnvelope } = resolveInboundRouteEnvelopeBuilderWithRuntime({
481
+ const { route, buildEnvelope } = resolveChannelInboundRouteEnvelope({
482
482
  cfg: config,
483
483
  channel: "zalo",
484
484
  accountId: account.accountId,
485
485
  peer: {
486
486
  kind: isGroup ? "group" : "direct",
487
487
  id: chatId
488
- },
489
- runtime: core.channel,
490
- sessionStore: config.session?.store
488
+ }
491
489
  });
492
490
  if (isGroup && core.channel.commands.isControlCommandMessage(rawBody, config) && commandAuthorized !== true) {
493
491
  logVerbose(core, runtime, `zalo: drop control command from unauthorized sender ${senderId}`);
@@ -495,7 +493,7 @@ async function processMessageWithPipeline(params) {
495
493
  }
496
494
  const fromLabel = isGroup ? `group:${chatId}` : senderName || `user:${senderId}`;
497
495
  const timestamp = resolveZaloTimestampMs(date);
498
- const { storePath, body } = buildEnvelope({
496
+ const body = buildEnvelope({
499
497
  channel: "Zalo",
500
498
  from: fromLabel,
501
499
  timestamp,
@@ -518,6 +516,7 @@ async function processMessageWithPipeline(params) {
518
516
  },
519
517
  route: {
520
518
  agentId: route.agentId,
519
+ dmScope: route.dmScope,
521
520
  accountId: route.accountId,
522
521
  routeSessionKey: route.sessionKey
523
522
  },
@@ -543,16 +542,16 @@ async function processMessageWithPipeline(params) {
543
542
  channel: "zalo",
544
543
  accountId: account.accountId
545
544
  });
546
- await core.channel.inbound.dispatchReply({
545
+ await core.channel.inbound.dispatch({
547
546
  cfg: config,
548
547
  channel: "zalo",
549
548
  accountId: account.accountId,
550
- agentId: route.agentId,
551
- routeSessionKey: route.sessionKey,
552
- storePath,
549
+ route: {
550
+ agentId: route.agentId,
551
+ dmScope: route.dmScope,
552
+ sessionKey: route.sessionKey
553
+ },
553
554
  ctxPayload,
554
- recordInboundSession: core.channel.session.recordInboundSession,
555
- dispatchReplyWithBufferedBlockDispatcher: core.channel.reply.dispatchReplyWithBufferedBlockDispatcher,
556
555
  delivery: {
557
556
  preparePayload: (payload) => prepareZaloDurableReplyPayload({
558
557
  payload,
@@ -1,6 +1,7 @@
1
- import { B as registerWebhookTargetWithPluginRoute, I as readJsonWebhookBodyOrReject, K as resolveWebhookTargetWithAuthOrRejectSync, Q as withResolvedWebhookRequestPipeline, V as resolveClientIp, a as WEBHOOK_ANOMALY_COUNTER_DEFAULTS, b as createFixedWindowRateLimiter, l as applyBasicWebhookRequestGuards, o as WEBHOOK_RATE_LIMIT_DEFAULTS, x as createWebhookAnomalyTracker, z as registerWebhookTarget } from "./runtime-api-CAA4ZtqF.js";
2
- import { createClaimableDedupe } from "openclaw/plugin-sdk/persistent-dedupe";
1
+ import { B as registerWebhookTargetWithPluginRoute, G as resolveWebhookTargetWithAuthOrRejectSync, I as readJsonWebhookBodyOrReject, V as resolveClientIp, Z as withResolvedWebhookRequestPipeline, a as WEBHOOK_ANOMALY_COUNTER_DEFAULTS, b as createFixedWindowRateLimiter, l as applyBasicWebhookRequestGuards, o as WEBHOOK_RATE_LIMIT_DEFAULTS, x as createWebhookAnomalyTracker, z as registerWebhookTarget } from "./runtime-api-B53PGWBW.js";
3
2
  import { safeEqualSecret } from "openclaw/plugin-sdk/security-runtime";
3
+ import { createChannelReplayGuard } from "openclaw/plugin-sdk/persistent-dedupe";
4
+ import { runDetachedWebhookWork } from "openclaw/plugin-sdk/webhook-request-guards";
4
5
  //#region extensions/zalo/src/monitor.webhook.ts
5
6
  const ZALO_WEBHOOK_REPLAY_WINDOW_MS = 5 * 6e4;
6
7
  const webhookTargets = /* @__PURE__ */ new Map();
@@ -9,10 +10,6 @@ const webhookRateLimiter = createFixedWindowRateLimiter({
9
10
  maxRequests: WEBHOOK_RATE_LIMIT_DEFAULTS.maxRequests,
10
11
  maxTrackedKeys: WEBHOOK_RATE_LIMIT_DEFAULTS.maxTrackedKeys
11
12
  });
12
- const recentWebhookEvents = createClaimableDedupe({
13
- ttlMs: ZALO_WEBHOOK_REPLAY_WINDOW_MS,
14
- memoryMaxSize: 5e3
15
- });
16
13
  const webhookAnomalyTracker = createWebhookAnomalyTracker({
17
14
  maxTrackedKeys: WEBHOOK_ANOMALY_COUNTER_DEFAULTS.maxTrackedKeys,
18
15
  ttlMs: WEBHOOK_ANOMALY_COUNTER_DEFAULTS.ttlMs,
@@ -43,6 +40,13 @@ function buildReplayEventCacheKey(target, update) {
43
40
  messageId
44
41
  ]);
45
42
  }
43
+ const recentWebhookEvents = createChannelReplayGuard({
44
+ dedupe: {
45
+ ttlMs: ZALO_WEBHOOK_REPLAY_WINDOW_MS,
46
+ memoryMaxSize: 5e3
47
+ },
48
+ buildReplayKey: ({ target, update }) => buildReplayEventCacheKey(target, update)
49
+ });
46
50
  var ZaloRetryableWebhookError = class extends Error {
47
51
  constructor(message, options) {
48
52
  super(message, options);
@@ -50,23 +54,17 @@ var ZaloRetryableWebhookError = class extends Error {
50
54
  }
51
55
  };
52
56
  async function processZaloReplayGuardedUpdate(params) {
53
- const replayEventKey = buildReplayEventCacheKey(params.target, params.update);
54
- if (replayEventKey) {
55
- if ((await recentWebhookEvents.claim(replayEventKey, { now: params.nowMs })).kind !== "claimed") return "duplicate";
56
- }
57
- params.target.statusSink?.({ lastInboundAt: Date.now() });
58
- try {
59
- await params.processUpdate({
60
- update: params.update,
61
- target: params.target
62
- });
63
- if (replayEventKey) await recentWebhookEvents.commit(replayEventKey);
64
- return "processed";
65
- } catch (error) {
66
- if (replayEventKey) if (error instanceof ZaloRetryableWebhookError) recentWebhookEvents.release(replayEventKey, { error });
67
- else await recentWebhookEvents.commit(replayEventKey);
68
- throw error;
69
- }
57
+ const event = {
58
+ target: params.target,
59
+ update: params.update
60
+ };
61
+ return (await recentWebhookEvents.processGuarded(event, async () => {
62
+ params.target.statusSink?.({ lastInboundAt: Date.now() });
63
+ await params.processUpdate(event);
64
+ }, {
65
+ dedupe: { now: params.nowMs },
66
+ onError: (error) => error instanceof ZaloRetryableWebhookError ? "release" : "commit"
67
+ })).kind === "processed" ? "processed" : "duplicate";
70
68
  }
71
69
  function recordWebhookStatus(runtime, path, statusCode) {
72
70
  webhookAnomalyTracker.record({
@@ -154,12 +152,12 @@ async function handleZaloWebhookRequest(req, res, processUpdate) {
154
152
  recordWebhookStatus(target.runtime, path, res.statusCode);
155
153
  return true;
156
154
  }
157
- processZaloReplayGuardedUpdate({
155
+ runDetachedWebhookWork(() => processZaloReplayGuardedUpdate({
158
156
  target,
159
157
  update,
160
158
  processUpdate,
161
159
  nowMs
162
- }).catch((err) => {
160
+ })).catch((err) => {
163
161
  target.runtime.error?.(`[${target.account.accountId}] Zalo webhook failed: ${String(err)}`);
164
162
  });
165
163
  res.statusCode = 200;
@@ -10,7 +10,6 @@ import { addWildcardAllowFrom as addWildcardAllowFrom$1, applyAccountNameToChann
10
10
  import { resolveDefaultGroupPolicy as resolveDefaultGroupPolicy$1, resolveOpenProviderRuntimeGroupPolicy as resolveOpenProviderRuntimeGroupPolicy$1, warnMissingProviderGroupPolicyFallbackOnce as warnMissingProviderGroupPolicyFallbackOnce$1 } from "openclaw/plugin-sdk/runtime-group-policy";
11
11
  import { createChannelPairingController as createChannelPairingController$1 } from "openclaw/plugin-sdk/channel-pairing";
12
12
  import { logTypingFailure as logTypingFailure$1 } from "openclaw/plugin-sdk/channel-feedback";
13
- import { resolveInboundRouteEnvelopeBuilderWithRuntime as resolveInboundRouteEnvelopeBuilderWithRuntime$1 } from "openclaw/plugin-sdk/inbound-envelope";
14
13
  import { waitForAbortSignal } from "openclaw/plugin-sdk/runtime";
15
14
  import { WEBHOOK_ANOMALY_COUNTER_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, applyBasicWebhookRequestGuards, createFixedWindowRateLimiter, createWebhookAnomalyTracker, readJsonWebhookBodyOrReject, registerPluginHttpRoute as registerPluginHttpRoute$1, registerWebhookTarget, registerWebhookTargetWithPluginRoute, resolveWebhookPath as resolveWebhookPath$1, resolveWebhookTargetWithAuthOrRejectSync, withResolvedWebhookRequestPipeline } from "openclaw/plugin-sdk/webhook-ingress";
16
15
  import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
@@ -20,4 +19,4 @@ const { setRuntime: setZaloRuntime, getRuntime: getZaloRuntime } = createPluginR
20
19
  errorMessage: "Zalo runtime not initialized"
21
20
  });
22
21
  //#endregion
23
- export { mergeAllowFromEntries$1 as A, registerWebhookTargetWithPluginRoute as B, formatAllowFromLowercase$1 as C, isNumericTargetId as D, isNormalizedSenderAllowed as E, promptSingleChannelSecretInput$1 as F, resolveWebhookPath$1 as G, resolveDefaultGroupPolicy$1 as H, readJsonWebhookBodyOrReject as I, sendPayloadWithChunkedTextAndMedia$1 as J, resolveWebhookTargetWithAuthOrRejectSync as K, readStringParam as L, normalizeAccountId$1 as M, normalizeResolvedSecretInputString as N, jsonResult as O, normalizeSecretInputString as P, withResolvedWebhookRequestPipeline as Q, registerPluginHttpRoute$1 as R, deliverTextOrMediaReply$1 as S, hasConfiguredSecretInput$1 as T, resolveInboundRouteEnvelopeBuilderWithRuntime$1 as U, resolveClientIp as V, resolveOpenProviderRuntimeGroupPolicy$1 as W, waitForAbortSignal as X, setTopLevelChannelDmPolicyWithAllowFrom as Y, warnMissingProviderGroupPolicyFallbackOnce$1 as Z, createChannelMessageReplyPipeline as _, WEBHOOK_ANOMALY_COUNTER_DEFAULTS as a, createFixedWindowRateLimiter as b, applyAccountNameToChannelSection as c, buildBaseAccountStatusSnapshot as d, buildChannelConfigSchema as f, chunkTextForOutbound$1 as g, buildTokenChannelStatusSummary$1 as h, PAIRING_APPROVED_MESSAGE as i, migrateBaseNameToDefaultAccount as j, logTypingFailure$1 as k, applyBasicWebhookRequestGuards as l, buildSingleChannelSecretPromptState$1 as m, setZaloRuntime as n, WEBHOOK_RATE_LIMIT_DEFAULTS as o, buildSecretInputSchema as p, runSingleChannelSecretStep$1 as q, DEFAULT_ACCOUNT_ID$1 as r, addWildcardAllowFrom$1 as s, getZaloRuntime as t, applySetupAccountConfigPatch as u, createChannelPairingController$1 as v, formatPairingApproveHint as w, createWebhookAnomalyTracker as x, createDedupeCache as y, registerWebhookTarget as z };
22
+ export { mergeAllowFromEntries$1 as A, registerWebhookTargetWithPluginRoute as B, formatAllowFromLowercase$1 as C, isNumericTargetId as D, isNormalizedSenderAllowed as E, promptSingleChannelSecretInput$1 as F, resolveWebhookTargetWithAuthOrRejectSync as G, resolveDefaultGroupPolicy$1 as H, readJsonWebhookBodyOrReject as I, setTopLevelChannelDmPolicyWithAllowFrom as J, runSingleChannelSecretStep$1 as K, readStringParam as L, normalizeAccountId$1 as M, normalizeResolvedSecretInputString as N, jsonResult as O, normalizeSecretInputString as P, registerPluginHttpRoute$1 as R, deliverTextOrMediaReply$1 as S, hasConfiguredSecretInput$1 as T, resolveOpenProviderRuntimeGroupPolicy$1 as U, resolveClientIp as V, resolveWebhookPath$1 as W, warnMissingProviderGroupPolicyFallbackOnce$1 as X, waitForAbortSignal as Y, withResolvedWebhookRequestPipeline as Z, createChannelMessageReplyPipeline as _, WEBHOOK_ANOMALY_COUNTER_DEFAULTS as a, createFixedWindowRateLimiter as b, applyAccountNameToChannelSection as c, buildBaseAccountStatusSnapshot as d, buildChannelConfigSchema as f, chunkTextForOutbound$1 as g, buildTokenChannelStatusSummary$1 as h, PAIRING_APPROVED_MESSAGE as i, migrateBaseNameToDefaultAccount as j, logTypingFailure$1 as k, applyBasicWebhookRequestGuards as l, buildSingleChannelSecretPromptState$1 as m, setZaloRuntime as n, WEBHOOK_RATE_LIMIT_DEFAULTS as o, buildSecretInputSchema as p, sendPayloadWithChunkedTextAndMedia$1 as q, DEFAULT_ACCOUNT_ID$1 as r, addWildcardAllowFrom$1 as s, getZaloRuntime as t, applySetupAccountConfigPatch as u, createChannelPairingController$1 as v, formatPairingApproveHint as w, createWebhookAnomalyTracker as x, createDedupeCache as y, registerWebhookTarget as z };
@@ -1,2 +1,2 @@
1
- import { A as mergeAllowFromEntries, B as registerWebhookTargetWithPluginRoute, C as formatAllowFromLowercase, D as isNumericTargetId, E as isNormalizedSenderAllowed, F as promptSingleChannelSecretInput, G as resolveWebhookPath, H as resolveDefaultGroupPolicy, I as readJsonWebhookBodyOrReject, J as sendPayloadWithChunkedTextAndMedia, K as resolveWebhookTargetWithAuthOrRejectSync, L as readStringParam, M as normalizeAccountId, N as normalizeResolvedSecretInputString, O as jsonResult, P as normalizeSecretInputString, Q as withResolvedWebhookRequestPipeline, R as registerPluginHttpRoute, S as deliverTextOrMediaReply, T as hasConfiguredSecretInput, U as resolveInboundRouteEnvelopeBuilderWithRuntime, V as resolveClientIp, W as resolveOpenProviderRuntimeGroupPolicy, X as waitForAbortSignal, Y as setTopLevelChannelDmPolicyWithAllowFrom, Z as warnMissingProviderGroupPolicyFallbackOnce, _ as createChannelMessageReplyPipeline, a as WEBHOOK_ANOMALY_COUNTER_DEFAULTS, b as createFixedWindowRateLimiter, c as applyAccountNameToChannelSection, d as buildBaseAccountStatusSnapshot, f as buildChannelConfigSchema, g as chunkTextForOutbound, h as buildTokenChannelStatusSummary, i as PAIRING_APPROVED_MESSAGE, j as migrateBaseNameToDefaultAccount, k as logTypingFailure, l as applyBasicWebhookRequestGuards, m as buildSingleChannelSecretPromptState, n as setZaloRuntime, o as WEBHOOK_RATE_LIMIT_DEFAULTS, p as buildSecretInputSchema, q as runSingleChannelSecretStep, r as DEFAULT_ACCOUNT_ID, s as addWildcardAllowFrom, u as applySetupAccountConfigPatch, v as createChannelPairingController, w as formatPairingApproveHint, x as createWebhookAnomalyTracker, y as createDedupeCache, z as registerWebhookTarget } from "./runtime-api-CAA4ZtqF.js";
2
- export { DEFAULT_ACCOUNT_ID, PAIRING_APPROVED_MESSAGE, WEBHOOK_ANOMALY_COUNTER_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, addWildcardAllowFrom, applyAccountNameToChannelSection, applyBasicWebhookRequestGuards, applySetupAccountConfigPatch, buildBaseAccountStatusSnapshot, buildChannelConfigSchema, buildSecretInputSchema, buildSingleChannelSecretPromptState, buildTokenChannelStatusSummary, chunkTextForOutbound, createChannelMessageReplyPipeline, createChannelPairingController, createDedupeCache, createFixedWindowRateLimiter, createWebhookAnomalyTracker, deliverTextOrMediaReply, formatAllowFromLowercase, formatPairingApproveHint, hasConfiguredSecretInput, isNormalizedSenderAllowed, isNumericTargetId, jsonResult, logTypingFailure, mergeAllowFromEntries, migrateBaseNameToDefaultAccount, normalizeAccountId, normalizeResolvedSecretInputString, normalizeSecretInputString, promptSingleChannelSecretInput, readJsonWebhookBodyOrReject, readStringParam, registerPluginHttpRoute, registerWebhookTarget, registerWebhookTargetWithPluginRoute, resolveClientIp, resolveDefaultGroupPolicy, resolveInboundRouteEnvelopeBuilderWithRuntime, resolveOpenProviderRuntimeGroupPolicy, resolveWebhookPath, resolveWebhookTargetWithAuthOrRejectSync, runSingleChannelSecretStep, sendPayloadWithChunkedTextAndMedia, setTopLevelChannelDmPolicyWithAllowFrom, setZaloRuntime, waitForAbortSignal, warnMissingProviderGroupPolicyFallbackOnce, withResolvedWebhookRequestPipeline };
1
+ import { A as mergeAllowFromEntries, B as registerWebhookTargetWithPluginRoute, C as formatAllowFromLowercase, D as isNumericTargetId, E as isNormalizedSenderAllowed, F as promptSingleChannelSecretInput, G as resolveWebhookTargetWithAuthOrRejectSync, H as resolveDefaultGroupPolicy, I as readJsonWebhookBodyOrReject, J as setTopLevelChannelDmPolicyWithAllowFrom, K as runSingleChannelSecretStep, L as readStringParam, M as normalizeAccountId, N as normalizeResolvedSecretInputString, O as jsonResult, P as normalizeSecretInputString, R as registerPluginHttpRoute, S as deliverTextOrMediaReply, T as hasConfiguredSecretInput, U as resolveOpenProviderRuntimeGroupPolicy, V as resolveClientIp, W as resolveWebhookPath, X as warnMissingProviderGroupPolicyFallbackOnce, Y as waitForAbortSignal, Z as withResolvedWebhookRequestPipeline, _ as createChannelMessageReplyPipeline, a as WEBHOOK_ANOMALY_COUNTER_DEFAULTS, b as createFixedWindowRateLimiter, c as applyAccountNameToChannelSection, d as buildBaseAccountStatusSnapshot, f as buildChannelConfigSchema, g as chunkTextForOutbound, h as buildTokenChannelStatusSummary, i as PAIRING_APPROVED_MESSAGE, j as migrateBaseNameToDefaultAccount, k as logTypingFailure, l as applyBasicWebhookRequestGuards, m as buildSingleChannelSecretPromptState, n as setZaloRuntime, o as WEBHOOK_RATE_LIMIT_DEFAULTS, p as buildSecretInputSchema, q as sendPayloadWithChunkedTextAndMedia, r as DEFAULT_ACCOUNT_ID, s as addWildcardAllowFrom, u as applySetupAccountConfigPatch, v as createChannelPairingController, w as formatPairingApproveHint, x as createWebhookAnomalyTracker, y as createDedupeCache, z as registerWebhookTarget } from "./runtime-api-B53PGWBW.js";
2
+ export { DEFAULT_ACCOUNT_ID, PAIRING_APPROVED_MESSAGE, WEBHOOK_ANOMALY_COUNTER_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, addWildcardAllowFrom, applyAccountNameToChannelSection, applyBasicWebhookRequestGuards, applySetupAccountConfigPatch, buildBaseAccountStatusSnapshot, buildChannelConfigSchema, buildSecretInputSchema, buildSingleChannelSecretPromptState, buildTokenChannelStatusSummary, chunkTextForOutbound, createChannelMessageReplyPipeline, createChannelPairingController, createDedupeCache, createFixedWindowRateLimiter, createWebhookAnomalyTracker, deliverTextOrMediaReply, formatAllowFromLowercase, formatPairingApproveHint, hasConfiguredSecretInput, isNormalizedSenderAllowed, isNumericTargetId, jsonResult, logTypingFailure, mergeAllowFromEntries, migrateBaseNameToDefaultAccount, normalizeAccountId, normalizeResolvedSecretInputString, normalizeSecretInputString, promptSingleChannelSecretInput, readJsonWebhookBodyOrReject, readStringParam, registerPluginHttpRoute, registerWebhookTarget, registerWebhookTargetWithPluginRoute, resolveClientIp, resolveDefaultGroupPolicy, resolveOpenProviderRuntimeGroupPolicy, resolveWebhookPath, resolveWebhookTargetWithAuthOrRejectSync, runSingleChannelSecretStep, sendPayloadWithChunkedTextAndMedia, setTopLevelChannelDmPolicyWithAllowFrom, setZaloRuntime, waitForAbortSignal, warnMissingProviderGroupPolicyFallbackOnce, withResolvedWebhookRequestPipeline };
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@openclaw/zalo",
3
- "version": "2026.7.2-beta.1",
3
+ "version": "2026.7.2-beta.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/zalo",
9
- "version": "2026.7.2-beta.1",
9
+ "version": "2026.7.2-beta.3",
10
10
  "dependencies": {
11
11
  "zod": "4.4.3"
12
12
  },
13
13
  "peerDependencies": {
14
- "openclaw": ">=2026.7.2-beta.1"
14
+ "openclaw": ">=2026.7.2-beta.3"
15
15
  },
16
16
  "peerDependenciesMeta": {
17
17
  "openclaw": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/zalo",
3
- "version": "2026.7.2-beta.1",
3
+ "version": "2026.7.2-beta.3",
4
4
  "description": "OpenClaw Zalo channel plugin for bot and webhook chats.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "type": "module",
10
10
  "peerDependencies": {
11
- "openclaw": ">=2026.7.2-beta.1"
11
+ "openclaw": ">=2026.7.2-beta.3"
12
12
  },
13
13
  "peerDependenciesMeta": {
14
14
  "openclaw": {
@@ -39,10 +39,10 @@
39
39
  "minHostVersion": ">=2026.4.10"
40
40
  },
41
41
  "compat": {
42
- "pluginApi": ">=2026.7.2-beta.1"
42
+ "pluginApi": ">=2026.7.2-beta.3"
43
43
  },
44
44
  "build": {
45
- "openclawVersion": "2026.7.2-beta.1"
45
+ "openclawVersion": "2026.7.2-beta.3"
46
46
  },
47
47
  "release": {
48
48
  "publishToClawHub": true,