




















@@ -1,6 +1,9 @@
11import {
2+formatChannelProgressDraftText,
23resolveChannelPreviewStreamMode,
4+resolveChannelProgressDraftMaxLines,
35resolveChannelProgressDraftLabel,
6+resolveChannelStreamingPreviewToolProgress,
47} from "openclaw/plugin-sdk/channel-streaming";
58import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
69import type { MSTeamsConfig, ReplyPayload } from "../runtime-api.js";
@@ -40,6 +43,11 @@ export function createTeamsReplyStreamController(params: {
4043const streamMode = resolveChannelPreviewStreamMode(params.msteamsConfig, "partial");
4144const shouldUseNativeStream =
4245isPersonal && (streamMode === "partial" || streamMode === "progress");
46+const shouldSuppressDefaultToolProgressMessages =
47+shouldUseNativeStream && streamMode === "progress";
48+const shouldStreamPreviewToolProgress =
49+shouldSuppressDefaultToolProgressMessages &&
50+resolveChannelStreamingPreviewToolProgress(params.msteamsConfig);
4351const stream = shouldUseNativeStream
4452 ? new TeamsHttpStream({
4553sendActivity: (activity) => params.context.sendActivity(activity),
@@ -52,8 +60,35 @@ export function createTeamsReplyStreamController(params: {
52605361let streamReceivedTokens = false;
5462let informativeUpdateSent = false;
63+let progressLines: string[] = [];
5564let pendingFinalize: Promise<void> | undefined;
566566+const pushProgressLine = async (line?: string): Promise<void> => {
67+if (!stream || !shouldStreamPreviewToolProgress) {
68+return;
69+}
70+const normalized = line?.replace(/\s+/g, " ").trim();
71+if (!normalized) {
72+return;
73+}
74+const previous = progressLines.at(-1);
75+if (previous === normalized) {
76+return;
77+}
78+progressLines = [...progressLines, normalized].slice(
79+-resolveChannelProgressDraftMaxLines(params.msteamsConfig),
80+);
81+informativeUpdateSent = true;
82+await stream.sendInformativeUpdate(
83+formatChannelProgressDraftText({
84+entry: params.msteamsConfig,
85+lines: progressLines,
86+seed: params.progressSeed,
87+bullet: "-",
88+}),
89+);
90+};
91+5792const fallbackAfterStreamFailure = (
5893payload: ReplyPayload,
5994hasMedia: boolean,
@@ -100,6 +135,18 @@ export function createTeamsReplyStreamController(params: {
100135stream.update(payload.text);
101136},
102137138+async pushProgressLine(line?: string): Promise<void> {
139+await pushProgressLine(line);
140+},
141+142+shouldSuppressDefaultToolProgressMessages(): boolean {
143+return shouldSuppressDefaultToolProgressMessages;
144+},
145+146+shouldStreamPreviewToolProgress(): boolean {
147+return shouldStreamPreviewToolProgress;
148+},
149+103150async preparePayload(payload: ReplyPayload): Promise<Maybe<ReplyPayload>> {
104151const hasMedia = Boolean(payload.mediaUrl || payload.mediaUrls?.length);
105152此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。