Skip to content

Commit d6c13d9

Browse files
committed
Mattermost: move outbound session routing behind plugin boundary
1 parent 028f3c4 commit d6c13d9

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

extensions/mattermost/src/channel.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
type ChannelPlugin,
4040
} from "./runtime-api.js";
4141
import { getMattermostRuntime } from "./runtime.js";
42+
import { resolveMattermostOutboundSessionRoute } from "./session-route.js";
4243
import { mattermostSetupAdapter } from "./setup-core.js";
4344
import { mattermostSetupWizard } from "./setup-surface.js";
4445

@@ -348,6 +349,7 @@ export const mattermostPlugin: ChannelPlugin<ResolvedMattermostAccount> = {
348349
},
349350
messaging: {
350351
normalizeTarget: normalizeMattermostMessagingTarget,
352+
resolveOutboundSessionRoute: (params) => resolveMattermostOutboundSessionRoute(params),
351353
targetResolver: {
352354
looksLikeId: looksLikeMattermostTargetId,
353355
hint: "<channelId|user:ID|channel:ID>",
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {
2+
buildChannelOutboundSessionRoute,
3+
normalizeOutboundThreadId,
4+
resolveThreadSessionKeys,
5+
stripChannelTargetPrefix,
6+
stripTargetKindPrefix,
7+
type ChannelOutboundSessionRouteParams,
8+
} from "openclaw/plugin-sdk/core";
9+
10+
export function resolveMattermostOutboundSessionRoute(params: ChannelOutboundSessionRouteParams) {
11+
let trimmed = stripChannelTargetPrefix(params.target, "mattermost");
12+
if (!trimmed) {
13+
return null;
14+
}
15+
const lower = trimmed.toLowerCase();
16+
const resolvedKind = params.resolvedTarget?.kind;
17+
const isUser =
18+
resolvedKind === "user" ||
19+
(resolvedKind !== "channel" &&
20+
resolvedKind !== "group" &&
21+
(lower.startsWith("user:") || trimmed.startsWith("@")));
22+
if (trimmed.startsWith("@")) {
23+
trimmed = trimmed.slice(1).trim();
24+
}
25+
const rawId = stripTargetKindPrefix(trimmed);
26+
if (!rawId) {
27+
return null;
28+
}
29+
const baseRoute = buildChannelOutboundSessionRoute({
30+
cfg: params.cfg,
31+
agentId: params.agentId,
32+
channel: "mattermost",
33+
accountId: params.accountId,
34+
peer: {
35+
kind: isUser ? "direct" : "channel",
36+
id: rawId,
37+
},
38+
chatType: isUser ? "direct" : "channel",
39+
from: isUser ? `mattermost:${rawId}` : `mattermost:channel:${rawId}`,
40+
to: isUser ? `user:${rawId}` : `channel:${rawId}`,
41+
});
42+
const threadId = normalizeOutboundThreadId(params.replyToId ?? params.threadId);
43+
const threadKeys = resolveThreadSessionKeys({
44+
baseSessionKey: baseRoute.baseSessionKey,
45+
threadId,
46+
});
47+
return {
48+
...baseRoute,
49+
sessionKey: threadKeys.sessionKey,
50+
...(threadId !== undefined ? { threadId } : {}),
51+
};
52+
}

0 commit comments

Comments
 (0)