@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.
@@ -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-C6YcNC9a.cjs");
5
- const require_channel = require("./channel-DfCbi0d_.cjs");
6
- const require_setup_surface = require("./setup-surface-DAhGL2h8.cjs");
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-BqA8G3pY.cjs");
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: require_setup_surface.formatUnknownError(err) }),
93
- onDispatchError: (err) => log.debug?.("reflection reply error", { error: require_setup_surface.formatUnknownError(err) })
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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 = require_setup_surface.classifyMSTeamsSendError(failure.error);
2139
- const errorText = require_setup_surface.formatUnknownError(failure.error);
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
- classification.kind === "transient" || classification.kind === "throttled" ? "Retrying later may succeed." : void 0
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: require_setup_surface.formatUnknownError(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 = require_setup_surface.formatUnknownError(err);
2272
- const classification = require_setup_surface.classifyMSTeamsSendError(err);
2273
- const hint = require_setup_surface.formatMSTeamsSendErrorHint(classification);
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: require_setup_surface.formatUnknownError(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: ${require_setup_surface.formatUnknownError(err)}`);
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: require_setup_surface.formatUnknownError(err) });
2676
- runtime.error(`msteams dispatch failed: ${require_setup_surface.formatUnknownError(err)}`);
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: require_setup_surface.formatUnknownError(err)
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(parentResult.reason) });
2993
- if (repliesResult.status === "rejected") params.log.debug?.("failed to fetch thread replies", { error: require_setup_surface.formatUnknownError(repliesResult.reason) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err)
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: ${require_setup_surface.formatUnknownError(err)}`);
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 reactions = direction === "added" ? activity.reactionsAdded ?? [] : activity.reactionsRemoved ?? [];
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: ${require_setup_surface.formatUnknownError(err)}`);
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err)
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: require_setup_surface.formatUnknownError(err) });
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 require_setup_surface.classifyMSTeamsSendError(error).kind === "auth" ? {
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. ${require_setup_surface.formatUnknownError(err)}`);
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: require_setup_surface.formatUnknownError(err)
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
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: require_setup_surface.formatUnknownError(err) });
4347
- publishMSTeamsRecovering(opts.statusSink, require_setup_surface.formatUnknownError(err));
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: require_setup_surface.formatUnknownError(err) });
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.2",
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.2"
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.2"
73
+ "pluginApi": ">=2026.8.1-beta.3"
74
74
  },
75
75
  "build": {
76
- "openclawVersion": "2026.8.1-beta.2",
76
+ "openclawVersion": "2026.8.1-beta.3",
77
77
  "runtimeFormat": "cjs"
78
78
  },
79
79
  "release": {