






















@@ -4,7 +4,8 @@ import {
44deliverWithFinalizableLivePreviewAdapter,
55} from "openclaw/plugin-sdk/channel-outbound";
66import {
7-formatChannelProgressDraftLineForEntry,
7+buildChannelProgressDraftLineForEntry,
8+createChannelProgressDraftCompositor,
89resolveChannelStreamingPreviewToolProgress,
910} from "openclaw/plugin-sdk/channel-outbound";
1011import { isLoopbackHost } from "openclaw/plugin-sdk/gateway-runtime";
@@ -38,7 +39,7 @@ import {
3839type MattermostPost,
3940type MattermostUser,
4041} from "./client.js";
41-import { buildMattermostToolStatusText, createMattermostDraftStream } from "./draft-stream.js";
42+import { createMattermostDraftStream } from "./draft-stream.js";
4243import {
4344computeInteractionCallbackUrl,
4445createMattermostInteractionHandler,
@@ -1682,6 +1683,18 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
16821683})
16831684 : createDisabledMattermostDraftStream();
16841685let lastPartialText = "";
1686+const progressDraft = createChannelProgressDraftCompositor({
1687+entry: account.config,
1688+mode: account.streamingMode,
1689+active: draftPreviewEnabled,
1690+seed: `${account.accountId}:${channelId}`,
1691+update: async (previewText, options) => {
1692+draftStream.update(previewText);
1693+if (options?.flush) {
1694+await draftStream.flush();
1695+}
1696+},
1697+});
16851698const previewState: MattermostDraftPreviewState = {
16861699finalizedViaPreviewPost: false,
16871700};
@@ -1746,6 +1759,9 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
17461759humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, route.agentId),
17471760 typingCallbacks,
17481761deliver: async (payloadEntry: ReplyPayload, info) => {
1762+if (info.kind === "final") {
1763+progressDraft.markFinalReplyStarted();
1764+}
17491765await deliverMattermostReplyWithDraftPreview({
17501766payload: payloadEntry,
17511767 info,
@@ -1785,6 +1801,9 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
17851801}
17861802},
17871803});
1804+if (info.kind === "final") {
1805+progressDraft.markFinalReplyDelivered();
1806+}
17881807},
17891808onError: (err, info) => {
17901809runtime.error?.(`mattermost ${info.kind} reply failed: ${String(err)}`);
@@ -1893,11 +1912,26 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
18931912},
18941913onAssistantMessageStart: () => {
18951914lastPartialText = "";
1915+progressDraft.resetReasoningProgress();
1916+if (account.streamingMode !== "progress") {
1917+progressDraft.reset();
1918+}
18961919},
18971920onReasoningEnd: () => {
18981921lastPartialText = "";
1922+progressDraft.resetReasoningProgress();
1923+if (account.streamingMode !== "progress") {
1924+progressDraft.reset();
1925+}
18991926},
1900-onReasoningStream: async () => {
1927+onReasoningStream: async (payloadResult) => {
1928+if (account.streamingMode === "progress") {
1929+await progressDraft.pushReasoningProgress(
1930+payloadResult.text || "Thinking…",
1931+{ snapshot: payloadResult.isReasoningSnapshot === true },
1932+);
1933+return;
1934+}
19011935if (!lastPartialText) {
19021936draftStream.update("Thinking…");
19031937}
@@ -1906,20 +1940,30 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
19061940if (!draftToolProgressEnabled) {
19071941return;
19081942}
1909-draftStream.update(
1910-buildMattermostToolStatusText({
1911- ...payloadValue,
1912-config: account.config,
1913-}),
1943+await progressDraft.pushToolProgress(
1944+buildChannelProgressDraftLineForEntry(
1945+account.config,
1946+{
1947+event: "tool",
1948+itemId: payloadValue.itemId,
1949+toolCallId: payloadValue.toolCallId,
1950+name: payloadValue.name,
1951+phase: payloadValue.phase,
1952+args: payloadValue.args,
1953+},
1954+payloadValue.detailMode
1955+ ? { detailMode: payloadValue.detailMode }
1956+ : undefined,
1957+),
1958+{ startImmediately: true },
19141959);
19151960},
19161961onItemEvent: async (payloadLocal) => {
19171962if (!draftToolProgressEnabled) {
19181963return;
19191964}
1920-const progressText = formatChannelProgressDraftLineForEntry(
1921-account.config,
1922-{
1965+await progressDraft.pushToolProgress(
1966+buildChannelProgressDraftLineForEntry(account.config, {
19231967event: "item",
19241968itemId: payloadLocal.itemId,
19251969itemKind: payloadLocal.kind,
@@ -1930,11 +1974,9 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
19301974summary: payloadLocal.summary,
19311975progressText: payloadLocal.progressText,
19321976meta: payloadLocal.meta,
1933-},
1977+}),
1978+{ startImmediately: true },
19341979);
1935-if (progressText) {
1936-draftStream.update(progressText);
1937-}
19381980},
19391981},
19401982}),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。