@openclaw/msteams 2026.8.1-beta.2 → 2026.8.1-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/{adapter.runtime-DEYjslFX.cjs → adapter.runtime-8g-MOPfb.cjs} +4 -2
- package/dist/api.cjs +6 -6
- package/dist/{channel-DfCbi0d_.cjs → channel-KpWENcgK.cjs} +21 -64
- package/dist/channel-plugin-api.cjs +1 -1
- package/dist/{channel.runtime-BJmueA4q.cjs → channel.runtime-Bkzj8jZ0.cjs} +45 -32
- package/dist/{setup-surface-DAhGL2h8.cjs → channel.setup-mOFtsfYz.cjs} +88 -42
- package/dist/directory-contract-api.cjs +1 -1
- package/dist/{messenger-BqA8G3pY.cjs → messenger-IISPSOvj.cjs} +46 -40
- package/dist/{oauth-DktsbN22.cjs → oauth-C9So7uld.cjs} +2 -2
- package/dist/qa-runner-api.cjs +1 -1
- package/dist/{resolve-allowlist-C6YcNC9a.cjs → resolve-allowlist-CIfWUwuc.cjs} +70 -68
- package/dist/runtime-api.cjs +1 -1
- package/dist/setup-plugin-api.cjs +2 -36
- package/dist/{src-Bz9wY0Mr.cjs → src-C127-DcQ.cjs} +102 -96
- package/package.json +4 -4
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-D6vf50IK.cjs");
|
|
2
2
|
const require_runtime = require("./runtime-gZTAuFux.cjs");
|
|
3
3
|
require("./runtime-api.cjs");
|
|
4
|
-
const require_resolve_allowlist = require("./resolve-allowlist-
|
|
5
|
-
const require_channel = require("./channel-
|
|
6
|
-
const
|
|
4
|
+
const require_resolve_allowlist = require("./resolve-allowlist-CIfWUwuc.cjs");
|
|
5
|
+
const require_channel = require("./channel-KpWENcgK.cjs");
|
|
6
|
+
const require_channel_setup = require("./channel.setup-mOFtsfYz.cjs");
|
|
7
7
|
const require_polls = require("./polls-DvuJvaDG.cjs");
|
|
8
8
|
const require_sso_token_store = require("./sso-token-store-ChhO1f4i.cjs");
|
|
9
|
-
const require_messenger = require("./messenger-
|
|
9
|
+
const require_messenger = require("./messenger-IISPSOvj.cjs");
|
|
10
10
|
let openclaw_plugin_sdk_channel_outbound = require("openclaw/plugin-sdk/channel-outbound");
|
|
11
11
|
let openclaw_plugin_sdk_string_coerce_runtime = require("openclaw/plugin-sdk/string-coerce-runtime");
|
|
12
12
|
let openclaw_plugin_sdk_allow_from = require("openclaw/plugin-sdk/allow-from");
|
|
13
|
+
let openclaw_plugin_sdk_provider_http = require("openclaw/plugin-sdk/provider-http");
|
|
13
14
|
let openclaw_plugin_sdk_media_runtime = require("openclaw/plugin-sdk/media-runtime");
|
|
14
15
|
let openclaw_plugin_sdk_ssrf_runtime = require("openclaw/plugin-sdk/ssrf-runtime");
|
|
15
|
-
let openclaw_plugin_sdk_provider_http = require("openclaw/plugin-sdk/provider-http");
|
|
16
16
|
let openclaw_plugin_sdk_number_runtime = require("openclaw/plugin-sdk/number-runtime");
|
|
17
17
|
let openclaw_plugin_sdk_text_utility_runtime = require("openclaw/plugin-sdk/text-utility-runtime");
|
|
18
|
-
let openclaw_plugin_sdk_error_runtime = require("openclaw/plugin-sdk/error-runtime");
|
|
19
18
|
let openclaw_plugin_sdk_routing = require("openclaw/plugin-sdk/routing");
|
|
20
19
|
let node_crypto = require("node:crypto");
|
|
21
20
|
node_crypto = require_rolldown_runtime.__toESM(node_crypto, 1);
|
|
21
|
+
let openclaw_plugin_sdk_error_runtime = require("openclaw/plugin-sdk/error-runtime");
|
|
22
22
|
let openclaw_plugin_sdk_channel_inbound = require("openclaw/plugin-sdk/channel-inbound");
|
|
23
23
|
let openclaw_plugin_sdk_channel_ingress_runtime = require("openclaw/plugin-sdk/channel-ingress-runtime");
|
|
24
24
|
let openclaw_plugin_sdk_context_visibility_runtime = require("openclaw/plugin-sdk/context-visibility-runtime");
|
|
@@ -89,11 +89,11 @@ async function runFeedbackReflection(params) {
|
|
|
89
89
|
thumbedDownResponse: params.thumbedDownResponse,
|
|
90
90
|
userComment: params.userComment,
|
|
91
91
|
cooldownMs,
|
|
92
|
-
onRecordError: (err) => log.debug?.("reflection session record failed", { error:
|
|
93
|
-
onDispatchError: (err) => log.debug?.("reflection reply error", { error:
|
|
92
|
+
onRecordError: (err) => log.debug?.("reflection session record failed", { error: require_channel_setup.formatUnknownError(err) }),
|
|
93
|
+
onDispatchError: (err) => log.debug?.("reflection reply error", { error: require_channel_setup.formatUnknownError(err) })
|
|
94
94
|
});
|
|
95
95
|
} catch (err) {
|
|
96
|
-
log.error("reflection dispatch failed", { error:
|
|
96
|
+
log.error("reflection dispatch failed", { error: require_channel_setup.formatUnknownError(err) });
|
|
97
97
|
return;
|
|
98
98
|
}
|
|
99
99
|
if (reflection.status === "cooldown") {
|
|
@@ -116,7 +116,7 @@ async function runFeedbackReflection(params) {
|
|
|
116
116
|
learning: reflection.learning
|
|
117
117
|
});
|
|
118
118
|
} catch (err) {
|
|
119
|
-
log.debug?.("failed to store reflection learning", { error:
|
|
119
|
+
log.debug?.("failed to store reflection learning", { error: require_channel_setup.formatUnknownError(err) });
|
|
120
120
|
}
|
|
121
121
|
const conversationType = (0, openclaw_plugin_sdk_string_coerce_runtime.normalizeOptionalLowercaseString)(params.conversationRef.conversation?.conversationType);
|
|
122
122
|
if (!(conversationType === "personal" && reflection.followUp && Boolean(reflection.userMessage))) {
|
|
@@ -133,7 +133,7 @@ async function runFeedbackReflection(params) {
|
|
|
133
133
|
}, { serviceUrlBoundary: require_resolve_allowlist.resolveMSTeamsSdkCloudOptions(cfg.channels?.msteams) });
|
|
134
134
|
log.info("sent reflection follow-up", { sessionKey });
|
|
135
135
|
} catch (err) {
|
|
136
|
-
log.debug?.("failed to send reflection follow-up", { error:
|
|
136
|
+
log.debug?.("failed to send reflection follow-up", { error: require_channel_setup.formatUnknownError(err) });
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
//#endregion
|
|
@@ -331,7 +331,7 @@ async function admitMSTeamsMessage(params) {
|
|
|
331
331
|
});
|
|
332
332
|
if (senderAccess.decision === "pairing") {
|
|
333
333
|
params.conversationStore.upsert(params.conversationId, params.conversationRef).catch((err) => {
|
|
334
|
-
params.log.debug?.("failed to save conversation reference", { error:
|
|
334
|
+
params.log.debug?.("failed to save conversation reference", { error: require_channel_setup.formatUnknownError(err) });
|
|
335
335
|
});
|
|
336
336
|
if (await pairing.upsertPairingRequest({
|
|
337
337
|
id: senderId,
|
|
@@ -417,7 +417,7 @@ async function admitMSTeamsMessage(params) {
|
|
|
417
417
|
return null;
|
|
418
418
|
}
|
|
419
419
|
params.conversationStore.upsert(params.conversationId, params.conversationRef).catch((err) => {
|
|
420
|
-
params.log.debug?.("failed to save conversation reference", { error:
|
|
420
|
+
params.log.debug?.("failed to save conversation reference", { error: require_channel_setup.formatUnknownError(err) });
|
|
421
421
|
});
|
|
422
422
|
return {
|
|
423
423
|
...access,
|
|
@@ -1593,7 +1593,7 @@ async function prepareMSTeamsInboundContent(params) {
|
|
|
1593
1593
|
})
|
|
1594
1594
|
});
|
|
1595
1595
|
} catch (err) {
|
|
1596
|
-
params.log.debug?.("failed to resolve inbound Teams media", { error:
|
|
1596
|
+
params.log.debug?.("failed to resolve inbound Teams media", { error: require_channel_setup.formatUnknownError(err) });
|
|
1597
1597
|
}
|
|
1598
1598
|
const inboundMedia = mergeMSTeamsMediaFacts(params.advertisedMedia, mediaList);
|
|
1599
1599
|
const nativeMediaForComparison = [...params.advertisedMedia, ...mediaList.slice(params.advertisedMedia.length).map((media) => ({
|
|
@@ -2135,15 +2135,16 @@ function createMSTeamsReplyDispatcher(params) {
|
|
|
2135
2135
|
});
|
|
2136
2136
|
};
|
|
2137
2137
|
const queueDeliveryFailureSystemEvent = (failure) => {
|
|
2138
|
-
const classification =
|
|
2139
|
-
const errorText =
|
|
2138
|
+
const classification = require_channel_setup.classifyMSTeamsSendError(failure.error);
|
|
2139
|
+
const errorText = require_channel_setup.formatUnknownError(failure.error);
|
|
2140
2140
|
const failedAll = failure.failed >= failure.total;
|
|
2141
|
+
const ambiguous = classification.kind === "ambiguous";
|
|
2141
2142
|
const sentences = [
|
|
2142
|
-
`Microsoft Teams delivery failed: ${failedAll ? "the previous reply was not delivered" : `${failure.failed} of ${failure.total} message blocks were not delivered`}.`,
|
|
2143
|
-
`The user may not have received ${failedAll ? "that reply" : "the full reply"}.`,
|
|
2143
|
+
`Microsoft Teams delivery failed: ${ambiguous ? failedAll ? "the delivery outcome is unknown for the previous reply" : `the delivery outcome is unknown for ${failure.failed} of ${failure.total} message blocks` : failedAll ? "the previous reply was not delivered" : `${failure.failed} of ${failure.total} message blocks were not delivered`}.`,
|
|
2144
|
+
ambiguous ? void 0 : `The user may not have received ${failedAll ? "that reply" : "the full reply"}.`,
|
|
2144
2145
|
`Error: ${errorText}.`,
|
|
2145
2146
|
classification.statusCode != null ? `Status: ${classification.statusCode}.` : void 0,
|
|
2146
|
-
|
|
2147
|
+
require_channel_setup.formatMSTeamsDeliveryFailureGuidance(classification)
|
|
2147
2148
|
].filter(Boolean);
|
|
2148
2149
|
core.system.enqueueSystemEvent(sentences.join(" "), {
|
|
2149
2150
|
sessionKey: params.sessionKey,
|
|
@@ -2236,7 +2237,7 @@ function createMSTeamsReplyDispatcher(params) {
|
|
|
2236
2237
|
if (sentIds.length > 0) try {
|
|
2237
2238
|
params.onSentMessageIds?.(sentIds);
|
|
2238
2239
|
} catch (error) {
|
|
2239
|
-
params.log.warn?.("failed to record sent Teams message ids", { error:
|
|
2240
|
+
params.log.warn?.("failed to record sent Teams message ids", { error: require_channel_setup.formatUnknownError(error) });
|
|
2240
2241
|
}
|
|
2241
2242
|
}
|
|
2242
2243
|
};
|
|
@@ -2268,9 +2269,9 @@ function createMSTeamsReplyDispatcher(params) {
|
|
|
2268
2269
|
};
|
|
2269
2270
|
},
|
|
2270
2271
|
onError: (err, info) => {
|
|
2271
|
-
const errMsg =
|
|
2272
|
-
const classification =
|
|
2273
|
-
const hint =
|
|
2272
|
+
const errMsg = require_channel_setup.formatUnknownError(err);
|
|
2273
|
+
const classification = require_channel_setup.classifyMSTeamsSendError(err);
|
|
2274
|
+
const hint = require_channel_setup.formatMSTeamsSendErrorHint(classification);
|
|
2274
2275
|
params.runtime.error?.(`msteams ${info.kind} reply failed: ${errMsg}${hint ? ` (${hint})` : ""}`);
|
|
2275
2276
|
params.log.error("reply failed", {
|
|
2276
2277
|
kind: info.kind,
|
|
@@ -2314,7 +2315,7 @@ function createMSTeamsReplyDispatcher(params) {
|
|
|
2314
2315
|
if (nativeResult.messageId) try {
|
|
2315
2316
|
params.onSentMessageIds?.([nativeResult.messageId]);
|
|
2316
2317
|
} catch (error) {
|
|
2317
|
-
params.log.warn?.("failed to record sent Teams message id", { error:
|
|
2318
|
+
params.log.warn?.("failed to record sent Teams message id", { error: require_channel_setup.formatUnknownError(error) });
|
|
2318
2319
|
}
|
|
2319
2320
|
};
|
|
2320
2321
|
const previewToolProgressEnabled = (0, openclaw_plugin_sdk_channel_outbound.resolveChannelStreamingPreviewToolProgress)(msteamsCfg, true, teamsStreamMode);
|
|
@@ -2643,7 +2644,7 @@ async function dispatchMSTeamsInboundTurn(params) {
|
|
|
2643
2644
|
},
|
|
2644
2645
|
ctxPayload,
|
|
2645
2646
|
record: { onRecordError: (err) => {
|
|
2646
|
-
logVerboseMessage(`msteams: failed updating session meta: ${
|
|
2647
|
+
logVerboseMessage(`msteams: failed updating session meta: ${require_channel_setup.formatUnknownError(err)}`);
|
|
2647
2648
|
} },
|
|
2648
2649
|
history: {
|
|
2649
2650
|
isGroup: isRoomish,
|
|
@@ -2662,18 +2663,15 @@ async function dispatchMSTeamsInboundTurn(params) {
|
|
|
2662
2663
|
});
|
|
2663
2664
|
const dispatchResult = turnResult.dispatched ? turnResult.dispatchResult : void 0;
|
|
2664
2665
|
const counts = (0, openclaw_plugin_sdk_channel_inbound.resolveInboundReplyDispatchCounts)(dispatchResult);
|
|
2665
|
-
log.info("dispatch complete", {
|
|
2666
|
-
queuedFinal: dispatchResult?.queuedFinal ?? false,
|
|
2667
|
-
counts
|
|
2668
|
-
});
|
|
2666
|
+
log.info("dispatch complete", { counts });
|
|
2669
2667
|
if ((0, openclaw_plugin_sdk_channel_inbound.hasFinalInboundReplyDispatch)(dispatchResult)) logVerboseMessage(`msteams: delivered ${counts.final} repl${counts.final === 1 ? "y" : "ies"} to ${teamsTo}`);
|
|
2670
2668
|
return {
|
|
2671
2669
|
kind: "completed",
|
|
2672
2670
|
finalResponses: counts.final
|
|
2673
2671
|
};
|
|
2674
2672
|
} catch (err) {
|
|
2675
|
-
log.error("dispatch failed", { error:
|
|
2676
|
-
runtime.error(`msteams dispatch failed: ${
|
|
2673
|
+
log.error("dispatch failed", { error: require_channel_setup.formatUnknownError(err) });
|
|
2674
|
+
runtime.error(`msteams dispatch failed: ${require_channel_setup.formatUnknownError(err)}`);
|
|
2677
2675
|
if (facts.turnAdoptionLifecycle) throw err;
|
|
2678
2676
|
try {
|
|
2679
2677
|
await context.sendActivity("⚠️ Something went wrong. Please try again.");
|
|
@@ -2938,7 +2936,7 @@ function prepareMSTeamsThreadRouting(params) {
|
|
|
2938
2936
|
}).catch((err) => {
|
|
2939
2937
|
params.log.debug?.("failed to resolve Teams AAD group ID", {
|
|
2940
2938
|
teamId: conversationTeamId,
|
|
2941
|
-
error:
|
|
2939
|
+
error: require_channel_setup.formatUnknownError(err)
|
|
2942
2940
|
});
|
|
2943
2941
|
});
|
|
2944
2942
|
teamAadGroupId = await teamGroupIdPromise;
|
|
@@ -2972,7 +2970,7 @@ async function resolveMSTeamsThreadContext(params) {
|
|
|
2972
2970
|
work: () => require_messenger.fetchChatMessageText(graphToken, params.conversationId, quoteMessageId, deadline)
|
|
2973
2971
|
});
|
|
2974
2972
|
} catch (err) {
|
|
2975
|
-
params.log.debug?.("failed to fetch full quoted message text", { error:
|
|
2973
|
+
params.log.debug?.("failed to fetch full quoted message text", { error: require_channel_setup.formatUnknownError(err) });
|
|
2976
2974
|
}
|
|
2977
2975
|
let threadContext;
|
|
2978
2976
|
const threadParentId = activity.replyToId;
|
|
@@ -2989,8 +2987,8 @@ async function resolveMSTeamsThreadContext(params) {
|
|
|
2989
2987
|
});
|
|
2990
2988
|
const parentMsg = parentResult.status === "fulfilled" ? parentResult.value : void 0;
|
|
2991
2989
|
const replies = repliesResult.status === "fulfilled" ? repliesResult.value : [];
|
|
2992
|
-
if (parentResult.status === "rejected") params.log.debug?.("failed to fetch parent message", { error:
|
|
2993
|
-
if (repliesResult.status === "rejected") params.log.debug?.("failed to fetch thread replies", { error:
|
|
2990
|
+
if (parentResult.status === "rejected") params.log.debug?.("failed to fetch parent message", { error: require_channel_setup.formatUnknownError(parentResult.reason) });
|
|
2991
|
+
if (repliesResult.status === "rejected") params.log.debug?.("failed to fetch thread replies", { error: require_channel_setup.formatUnknownError(repliesResult.reason) });
|
|
2994
2992
|
const isThreadSenderAllowed = (message) => (0, openclaw_plugin_sdk_channel_inbound.resolveInboundSupplementalSenderAllowed)({
|
|
2995
2993
|
isGroup: params.isChannel,
|
|
2996
2994
|
groupPolicy: params.groupPolicy,
|
|
@@ -3027,7 +3025,7 @@ async function resolveMSTeamsThreadContext(params) {
|
|
|
3027
3025
|
});
|
|
3028
3026
|
threadContext = require_messenger.formatThreadContext(threadMessages, activity.id) || void 0;
|
|
3029
3027
|
} catch (err) {
|
|
3030
|
-
params.log.debug?.("failed to fetch thread history", { error:
|
|
3028
|
+
params.log.debug?.("failed to fetch thread history", { error: require_channel_setup.formatUnknownError(err) });
|
|
3031
3029
|
}
|
|
3032
3030
|
quoteSenderName ??= params.quoteInfo?.sender;
|
|
3033
3031
|
return {
|
|
@@ -3106,7 +3104,7 @@ function createMSTeamsMessageHandler(deps) {
|
|
|
3106
3104
|
} catch (err) {
|
|
3107
3105
|
log.error("failed to record poll vote", {
|
|
3108
3106
|
pollId: pollVote.pollId,
|
|
3109
|
-
error:
|
|
3107
|
+
error: require_channel_setup.formatUnknownError(err)
|
|
3110
3108
|
});
|
|
3111
3109
|
}
|
|
3112
3110
|
return;
|
|
@@ -3283,7 +3281,7 @@ function createMSTeamsMessageHandler(deps) {
|
|
|
3283
3281
|
});
|
|
3284
3282
|
},
|
|
3285
3283
|
onError: (err) => {
|
|
3286
|
-
runtime.error(`msteams debounce flush failed: ${
|
|
3284
|
+
runtime.error(`msteams debounce flush failed: ${require_channel_setup.formatUnknownError(err)}`);
|
|
3287
3285
|
}
|
|
3288
3286
|
});
|
|
3289
3287
|
return async function handleTeamsMessage(context, turnAdoptionLifecycle) {
|
|
@@ -3307,7 +3305,8 @@ function createMSTeamsReactionHandler(deps) {
|
|
|
3307
3305
|
const msteamsCfg = cfg.channels?.msteams;
|
|
3308
3306
|
return async function handleReaction(context, direction) {
|
|
3309
3307
|
const activity = context.activity;
|
|
3310
|
-
const
|
|
3308
|
+
const rawReactions = direction === "added" ? activity.reactionsAdded : activity.reactionsRemoved;
|
|
3309
|
+
const reactions = Array.isArray(rawReactions) ? rawReactions : [];
|
|
3311
3310
|
if (reactions.length === 0) {
|
|
3312
3311
|
log.debug?.("reaction activity has no reactions; skipping");
|
|
3313
3312
|
return;
|
|
@@ -3517,7 +3516,7 @@ function registerMSTeamsHandlers(handler, deps) {
|
|
|
3517
3516
|
return result;
|
|
3518
3517
|
} catch (err) {
|
|
3519
3518
|
if (turnAdoptionLifecycle) throw err;
|
|
3520
|
-
deps.runtime.error(`msteams handler failed: ${
|
|
3519
|
+
deps.runtime.error(`msteams handler failed: ${require_channel_setup.formatUnknownError(err)}`);
|
|
3521
3520
|
}
|
|
3522
3521
|
if (!nextRan) await runNext();
|
|
3523
3522
|
});
|
|
@@ -3543,7 +3542,7 @@ function registerMSTeamsHandlers(handler, deps) {
|
|
|
3543
3542
|
});
|
|
3544
3543
|
deps.log.info("sent welcome card");
|
|
3545
3544
|
} catch (err) {
|
|
3546
|
-
deps.log.debug?.("failed to send welcome card", { error:
|
|
3545
|
+
deps.log.debug?.("failed to send welcome card", { error: require_channel_setup.formatUnknownError(err) });
|
|
3547
3546
|
}
|
|
3548
3547
|
} else if (!isPersonal && msteamsCfg?.groupWelcomeCard === true) {
|
|
3549
3548
|
const botName = ctx.activity?.recipient?.name ?? void 0;
|
|
@@ -3551,7 +3550,7 @@ function registerMSTeamsHandlers(handler, deps) {
|
|
|
3551
3550
|
await ctx.sendActivity(buildGroupWelcomeText(botName));
|
|
3552
3551
|
deps.log.info("sent group welcome message");
|
|
3553
3552
|
} catch (err) {
|
|
3554
|
-
deps.log.debug?.("failed to send group welcome", { error:
|
|
3553
|
+
deps.log.debug?.("failed to send group welcome", { error: require_channel_setup.formatUnknownError(err) });
|
|
3555
3554
|
}
|
|
3556
3555
|
} else deps.log.debug?.("skipping welcome (disabled by config or conversation type)");
|
|
3557
3556
|
} else deps.log.debug?.("member added", { member: member.id });
|
|
@@ -3687,7 +3686,7 @@ async function runMSTeamsFeedbackInvokeHandler(context, deps) {
|
|
|
3687
3686
|
userComment,
|
|
3688
3687
|
log: deps.log
|
|
3689
3688
|
}).catch((err) => {
|
|
3690
|
-
deps.log.error("feedback reflection failed", { error:
|
|
3689
|
+
deps.log.error("feedback reflection failed", { error: require_channel_setup.formatUnknownError(err) });
|
|
3691
3690
|
});
|
|
3692
3691
|
return true;
|
|
3693
3692
|
}
|
|
@@ -3764,7 +3763,7 @@ async function handleMSTeamsFileConsentInvoke(context, log) {
|
|
|
3764
3763
|
} catch (err) {
|
|
3765
3764
|
log.error("file upload failed", {
|
|
3766
3765
|
uploadId,
|
|
3767
|
-
error:
|
|
3766
|
+
error: require_channel_setup.formatUnknownError(err)
|
|
3768
3767
|
});
|
|
3769
3768
|
await context.sendActivity("File upload failed. Please try again.");
|
|
3770
3769
|
} finally {
|
|
@@ -3797,7 +3796,7 @@ async function runMSTeamsFileConsentInvokeHandler(context, log) {
|
|
|
3797
3796
|
}
|
|
3798
3797
|
});
|
|
3799
3798
|
} catch (err) {
|
|
3800
|
-
log.debug?.("file consent handler error", { error:
|
|
3799
|
+
log.debug?.("file consent handler error", { error: require_channel_setup.formatUnknownError(err) });
|
|
3801
3800
|
}
|
|
3802
3801
|
}
|
|
3803
3802
|
//#endregion
|
|
@@ -3902,7 +3901,7 @@ function createMSTeamsIngress(options) {
|
|
|
3902
3901
|
reason: error.reason,
|
|
3903
3902
|
message: error.message
|
|
3904
3903
|
};
|
|
3905
|
-
return
|
|
3904
|
+
return require_channel_setup.classifyMSTeamsSendError(error).kind === "auth" ? {
|
|
3906
3905
|
reason: "authentication-failed",
|
|
3907
3906
|
message: (0, openclaw_plugin_sdk_error_runtime.formatErrorMessage)(error)
|
|
3908
3907
|
} : null;
|
|
@@ -3955,6 +3954,54 @@ function createMSTeamsIngress(options) {
|
|
|
3955
3954
|
};
|
|
3956
3955
|
}
|
|
3957
3956
|
//#endregion
|
|
3957
|
+
//#region extensions/msteams/src/replay-context.ts
|
|
3958
|
+
function createMSTeamsReplayContext(activity, app, serviceUrlBoundary) {
|
|
3959
|
+
const rawConversationId = activity.conversation?.id ?? "";
|
|
3960
|
+
const conversationId = require_resolve_allowlist.normalizeMSTeamsConversationId(rawConversationId);
|
|
3961
|
+
const conversationType = activity.conversation?.conversationType ?? "personal";
|
|
3962
|
+
const normalizedConversationType = conversationType.toLowerCase();
|
|
3963
|
+
const threadActivityId = normalizedConversationType === "channel" ? require_resolve_allowlist.extractMSTeamsConversationMessageId(rawConversationId) ?? activity.replyToId : void 0;
|
|
3964
|
+
const quoteActivityId = normalizedConversationType === "channel" || normalizedConversationType === "groupchat" ? activity.id : void 0;
|
|
3965
|
+
const tenantId = activity.channelData?.tenant?.id ?? activity.conversation?.tenantId;
|
|
3966
|
+
const reference = {
|
|
3967
|
+
activityId: activity.id,
|
|
3968
|
+
user: activity.from,
|
|
3969
|
+
agent: activity.recipient,
|
|
3970
|
+
conversation: {
|
|
3971
|
+
id: conversationId,
|
|
3972
|
+
conversationType,
|
|
3973
|
+
...tenantId ? { tenantId } : {}
|
|
3974
|
+
},
|
|
3975
|
+
channelId: activity.channelId,
|
|
3976
|
+
serviceUrl: activity.serviceUrl,
|
|
3977
|
+
locale: activity.locale,
|
|
3978
|
+
...tenantId ? { tenantId } : {},
|
|
3979
|
+
...activity.from?.aadObjectId ? { aadObjectId: activity.from.aadObjectId } : {}
|
|
3980
|
+
};
|
|
3981
|
+
const proactiveOptions = {
|
|
3982
|
+
...quoteActivityId ? { quoteActivityId } : {},
|
|
3983
|
+
...threadActivityId ? { threadActivityId } : {},
|
|
3984
|
+
serviceUrlBoundary
|
|
3985
|
+
};
|
|
3986
|
+
const sendActivity = (outbound) => require_messenger.sendMSTeamsActivityWithReference(app, reference, outbound, proactiveOptions);
|
|
3987
|
+
return {
|
|
3988
|
+
activity,
|
|
3989
|
+
sendActivity,
|
|
3990
|
+
sendActivities: async (activities) => {
|
|
3991
|
+
const results = [];
|
|
3992
|
+
for (const outbound of activities) results.push(await sendActivity(outbound));
|
|
3993
|
+
return results;
|
|
3994
|
+
},
|
|
3995
|
+
updateActivity: async (outbound) => {
|
|
3996
|
+
return await require_messenger.updateMSTeamsActivityWithReference(app, reference, typeof outbound.id === "string" ? outbound.id : "", outbound, proactiveOptions);
|
|
3997
|
+
},
|
|
3998
|
+
deleteActivity: async (activityId) => {
|
|
3999
|
+
await require_messenger.deleteMSTeamsActivityWithReference(app, reference, activityId, proactiveOptions);
|
|
4000
|
+
},
|
|
4001
|
+
getTeamDetails: (teamId) => app.api.teams.getById(teamId)
|
|
4002
|
+
};
|
|
4003
|
+
}
|
|
4004
|
+
//#endregion
|
|
3958
4005
|
//#region extensions/msteams/src/webhook-timeouts.ts
|
|
3959
4006
|
const MSTEAMS_WEBHOOK_INACTIVITY_TIMEOUT_MS = 3e4;
|
|
3960
4007
|
const MSTEAMS_WEBHOOK_REQUEST_TIMEOUT_MS = 3e4;
|
|
@@ -4059,7 +4106,7 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4059
4106
|
(0, openclaw_plugin_sdk_allow_from.summarizeMapping)("msteams channels", resolved.mapping, resolved.unresolved, runtime);
|
|
4060
4107
|
}
|
|
4061
4108
|
} catch (err) {
|
|
4062
|
-
runtime.error?.(`msteams resolve failed; mutable allowlist entries are disabled. ${
|
|
4109
|
+
runtime.error?.(`msteams resolve failed; mutable allowlist entries are disabled. ${require_channel_setup.formatUnknownError(err)}`);
|
|
4063
4110
|
}
|
|
4064
4111
|
if (configuredGroupAllowFrom == null && groupAllowFrom) groupAllowFrom = (0, openclaw_plugin_sdk_allow_from.mergeAllowlist)({
|
|
4065
4112
|
existing: groupAllowFrom,
|
|
@@ -4213,7 +4260,7 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4213
4260
|
} catch (err) {
|
|
4214
4261
|
log.error("failed to record poll vote", {
|
|
4215
4262
|
pollId: vote.pollId,
|
|
4216
|
-
error:
|
|
4263
|
+
error: require_channel_setup.formatUnknownError(err)
|
|
4217
4264
|
});
|
|
4218
4265
|
return {
|
|
4219
4266
|
statusCode: 500,
|
|
@@ -4236,7 +4283,7 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4236
4283
|
value: "OK"
|
|
4237
4284
|
};
|
|
4238
4285
|
} catch (err) {
|
|
4239
|
-
log.error("msteams card.action failed", { error:
|
|
4286
|
+
log.error("msteams card.action failed", { error: require_channel_setup.formatUnknownError(err) });
|
|
4240
4287
|
return {
|
|
4241
4288
|
statusCode: 500,
|
|
4242
4289
|
type: "application/vnd.microsoft.error",
|
|
@@ -4304,7 +4351,7 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4304
4351
|
hasExpiry: Boolean(ctx.token.expiration)
|
|
4305
4352
|
});
|
|
4306
4353
|
})().catch((err) => {
|
|
4307
|
-
log.error("msteams sso token persistence failed", { error:
|
|
4354
|
+
log.error("msteams sso token persistence failed", { error: require_channel_setup.formatUnknownError(err) });
|
|
4308
4355
|
});
|
|
4309
4356
|
});
|
|
4310
4357
|
app.on("message.submit", async (ctx) => {
|
|
@@ -4325,7 +4372,7 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4325
4372
|
try {
|
|
4326
4373
|
await handler.run(adaptedCtx);
|
|
4327
4374
|
} catch (err) {
|
|
4328
|
-
log.error("msteams non-turn activity failed", { error:
|
|
4375
|
+
log.error("msteams non-turn activity failed", { error: require_channel_setup.formatUnknownError(err) });
|
|
4329
4376
|
}
|
|
4330
4377
|
});
|
|
4331
4378
|
await app.initialize();
|
|
@@ -4335,7 +4382,7 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4335
4382
|
const onListen = (err) => err ? reject(err) : resolve(server);
|
|
4336
4383
|
const server = privateQaRuntime ? expressApp.listen(port, privateQaRuntime.listenHost, onListen) : expressApp.listen(port, onListen);
|
|
4337
4384
|
}).catch(async (err) => {
|
|
4338
|
-
log.error("msteams server error", { error:
|
|
4385
|
+
log.error("msteams server error", { error: require_channel_setup.formatUnknownError(err) });
|
|
4339
4386
|
await ingress.stop();
|
|
4340
4387
|
throw err;
|
|
4341
4388
|
});
|
|
@@ -4343,14 +4390,14 @@ async function monitorMSTeamsProvider(opts) {
|
|
|
4343
4390
|
publishMSTeamsReady(opts.statusSink);
|
|
4344
4391
|
applyMSTeamsWebhookTimeouts(httpServer);
|
|
4345
4392
|
httpServer.on("error", (err) => {
|
|
4346
|
-
log.error("msteams server error", { error:
|
|
4347
|
-
publishMSTeamsRecovering(opts.statusSink,
|
|
4393
|
+
log.error("msteams server error", { error: require_channel_setup.formatUnknownError(err) });
|
|
4394
|
+
publishMSTeamsRecovering(opts.statusSink, require_channel_setup.formatUnknownError(err));
|
|
4348
4395
|
});
|
|
4349
4396
|
const shutdown = async () => {
|
|
4350
4397
|
log.info("shutting down msteams provider");
|
|
4351
4398
|
await new Promise((resolve) => {
|
|
4352
4399
|
httpServer.close((err) => {
|
|
4353
|
-
if (err) log.debug?.("msteams server close error", { error:
|
|
4400
|
+
if (err) log.debug?.("msteams server close error", { error: require_channel_setup.formatUnknownError(err) });
|
|
4354
4401
|
resolve();
|
|
4355
4402
|
});
|
|
4356
4403
|
});
|
|
@@ -4411,47 +4458,6 @@ function buildActivityHandler() {
|
|
|
4411
4458
|
};
|
|
4412
4459
|
return handler;
|
|
4413
4460
|
}
|
|
4414
|
-
function createMSTeamsReplayContext(activity, app, serviceUrlBoundary) {
|
|
4415
|
-
const rawConversationId = activity.conversation?.id ?? "";
|
|
4416
|
-
const conversationId = require_resolve_allowlist.normalizeMSTeamsConversationId(rawConversationId);
|
|
4417
|
-
const conversationType = activity.conversation?.conversationType ?? "personal";
|
|
4418
|
-
const threadActivityId = conversationType.toLowerCase() === "channel" ? require_resolve_allowlist.extractMSTeamsConversationMessageId(rawConversationId) ?? activity.replyToId : void 0;
|
|
4419
|
-
const tenantId = activity.channelData?.tenant?.id ?? activity.conversation?.tenantId;
|
|
4420
|
-
const reference = {
|
|
4421
|
-
activityId: activity.id,
|
|
4422
|
-
user: activity.from,
|
|
4423
|
-
agent: activity.recipient,
|
|
4424
|
-
conversation: {
|
|
4425
|
-
id: conversationId,
|
|
4426
|
-
conversationType,
|
|
4427
|
-
...tenantId ? { tenantId } : {}
|
|
4428
|
-
},
|
|
4429
|
-
channelId: activity.channelId,
|
|
4430
|
-
serviceUrl: activity.serviceUrl,
|
|
4431
|
-
locale: activity.locale,
|
|
4432
|
-
...tenantId ? { tenantId } : {},
|
|
4433
|
-
...activity.from?.aadObjectId ? { aadObjectId: activity.from.aadObjectId } : {}
|
|
4434
|
-
};
|
|
4435
|
-
const proactiveOptions = {
|
|
4436
|
-
...threadActivityId ? { threadActivityId } : {},
|
|
4437
|
-
serviceUrlBoundary
|
|
4438
|
-
};
|
|
4439
|
-
const sendActivity = (outbound) => require_messenger.sendMSTeamsActivityWithReference(app, reference, outbound, proactiveOptions);
|
|
4440
|
-
return {
|
|
4441
|
-
activity,
|
|
4442
|
-
sendActivity,
|
|
4443
|
-
sendActivities: async (activities) => {
|
|
4444
|
-
const results = [];
|
|
4445
|
-
for (const outbound of activities) results.push(await sendActivity(outbound));
|
|
4446
|
-
return results;
|
|
4447
|
-
},
|
|
4448
|
-
updateActivity: async (outbound) => await require_messenger.updateMSTeamsActivityWithReference(app, reference, typeof outbound.id === "string" ? outbound.id : "", outbound, proactiveOptions),
|
|
4449
|
-
deleteActivity: async (activityId) => {
|
|
4450
|
-
await require_messenger.deleteMSTeamsActivityWithReference(app, reference, activityId, proactiveOptions);
|
|
4451
|
-
},
|
|
4452
|
-
getTeamDetails: (teamId) => app.api.teams.getById(teamId)
|
|
4453
|
-
};
|
|
4454
|
-
}
|
|
4455
4461
|
/**
|
|
4456
4462
|
* Adapt a new @microsoft/teams.apps SDK context to the MSTeamsTurnContext interface
|
|
4457
4463
|
* our handlers expect. The new SDK uses reply()/send() instead of sendActivity().
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/msteams",
|
|
3
|
-
"version": "2026.8.1-beta.
|
|
3
|
+
"version": "2026.8.1-beta.3",
|
|
4
4
|
"description": "OpenClaw Microsoft Teams channel plugin for bot conversations.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"openclaw": "workspace:*"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"openclaw": ">=2026.8.1-beta.
|
|
25
|
+
"openclaw": ">=2026.8.1-beta.3"
|
|
26
26
|
},
|
|
27
27
|
"peerDependenciesMeta": {
|
|
28
28
|
"openclaw": {
|
|
@@ -70,10 +70,10 @@
|
|
|
70
70
|
"minHostVersion": ">=2026.4.10"
|
|
71
71
|
},
|
|
72
72
|
"compat": {
|
|
73
|
-
"pluginApi": ">=2026.8.1-beta.
|
|
73
|
+
"pluginApi": ">=2026.8.1-beta.3"
|
|
74
74
|
},
|
|
75
75
|
"build": {
|
|
76
|
-
"openclawVersion": "2026.8.1-beta.
|
|
76
|
+
"openclawVersion": "2026.8.1-beta.3",
|
|
77
77
|
"runtimeFormat": "cjs"
|
|
78
78
|
},
|
|
79
79
|
"release": {
|