diff --git a/extensions/zalo/src/channel.ts b/extensions/zalo/src/channel.ts index 3828664e2f0..db34bb25400 100644 --- a/extensions/zalo/src/channel.ts +++ b/extensions/zalo/src/channel.ts @@ -35,6 +35,7 @@ import { } from "./accounts.js"; import { zaloMessageActions } from "./actions.js"; import { ZaloConfigSchema } from "./config-schema.js"; +import { resolveZaloOutboundSessionRoute } from "./session-route.js"; import { zaloSetupAdapter } from "./setup-core.js"; import { zaloSetupWizard } from "./setup-surface.js"; import { collectZaloStatusIssues } from "./status-issues.js"; @@ -159,6 +160,7 @@ export const zaloPlugin: ChannelPlugin = { actions: zaloMessageActions, messaging: { normalizeTarget: normalizeZaloMessagingTarget, + resolveOutboundSessionRoute: (params) => resolveZaloOutboundSessionRoute(params), targetResolver: { looksLikeId: isNumericTargetId, hint: "", diff --git a/extensions/zalo/src/session-route.ts b/extensions/zalo/src/session-route.ts new file mode 100644 index 00000000000..fe297c8691f --- /dev/null +++ b/extensions/zalo/src/session-route.ts @@ -0,0 +1,31 @@ +import { + buildChannelOutboundSessionRoute, + stripChannelTargetPrefix, + stripTargetKindPrefix, + type ChannelOutboundSessionRouteParams, +} from "openclaw/plugin-sdk/core"; + +export function resolveZaloOutboundSessionRoute(params: ChannelOutboundSessionRouteParams) { + const trimmed = stripChannelTargetPrefix(params.target, "zalo", "zl"); + if (!trimmed) { + return null; + } + const isGroup = trimmed.toLowerCase().startsWith("group:"); + const peerId = stripTargetKindPrefix(trimmed); + if (!peerId) { + return null; + } + return buildChannelOutboundSessionRoute({ + cfg: params.cfg, + agentId: params.agentId, + channel: "zalo", + accountId: params.accountId, + peer: { + kind: isGroup ? "group" : "direct", + id: peerId, + }, + chatType: isGroup ? "group" : "direct", + from: isGroup ? `zalo:group:${peerId}` : `zalo:${peerId}`, + to: `zalo:${peerId}`, + }); +}