
















@@ -82,6 +82,8 @@ export function createDiscordDraftPreviewController(params: {
8282});
8383let previewToolProgressSuppressed = false;
8484let previewToolProgressLines: string[] = [];
85+let reasoningProgressRawText = "";
86+let lastReasoningProgressLine: string | undefined;
8587const progressSeed = `${params.accountId}:${params.deliverChannelId}`;
86888789const renderProgressDraft = async (options?: { flush?: boolean }) => {
@@ -116,6 +118,8 @@ export function createDiscordDraftPreviewController(params: {
116118draftChunker?.reset();
117119previewToolProgressSuppressed = false;
118120previewToolProgressLines = [];
121+reasoningProgressRawText = "";
122+lastReasoningProgressLine = undefined;
119123};
120124121125const forceNewMessageIfNeeded = () => {
@@ -163,8 +167,11 @@ export function createDiscordDraftPreviewController(params: {
163167return;
164168}
165169const normalized = line?.replace(/\s+/g, " ").trim();
170+if (!normalized) {
171+return;
172+}
166173if (discordStreamMode !== "progress") {
167-if (!previewToolProgressEnabled || previewToolProgressSuppressed || !normalized) {
174+if (!previewToolProgressEnabled || previewToolProgressSuppressed) {
168175return;
169176}
170177const previous = previewToolProgressLines.at(-1);
@@ -200,6 +207,36 @@ export function createDiscordDraftPreviewController(params: {
200207await renderProgressDraft();
201208}
202209},
210+async pushReasoningProgress(text?: string) {
211+if (!draftStream || discordStreamMode !== "progress" || !text) {
212+return;
213+}
214+reasoningProgressRawText = mergeReasoningProgressText(reasoningProgressRawText, text);
215+const normalized = normalizeReasoningProgressLine(reasoningProgressRawText);
216+if (!normalized) {
217+return;
218+}
219+if (previewToolProgressEnabled && !previewToolProgressSuppressed) {
220+const priorIndex =
221+lastReasoningProgressLine === undefined
222+ ? -1
223+ : previewToolProgressLines.lastIndexOf(lastReasoningProgressLine);
224+if (priorIndex >= 0) {
225+previewToolProgressLines = [...previewToolProgressLines];
226+previewToolProgressLines[priorIndex] = normalized;
227+} else {
228+previewToolProgressLines = [...previewToolProgressLines, normalized].slice(
229+-resolveChannelProgressDraftMaxLines(params.discordConfig),
230+);
231+}
232+lastReasoningProgressLine = normalized;
233+}
234+const alreadyStarted = progressDraftGate.hasStarted;
235+await progressDraftGate.noteWork();
236+if (alreadyStarted && progressDraftGate.hasStarted) {
237+await renderProgressDraft();
238+}
239+},
203240resolvePreviewFinalText(text?: string) {
204241if (typeof text !== "string") {
205242return undefined;
@@ -329,3 +366,29 @@ export function createDiscordDraftPreviewController(params: {
329366},
330367};
331368}
369+370+function normalizeReasoningProgressLine(text: string): string {
371+return text
372+.replace(/^\s*(?:>\s*)?Reasoning:\s*/i, "")
373+.replace(/\s+/g, " ")
374+.trim();
375+}
376+377+function mergeReasoningProgressText(current: string, incoming: string): string {
378+if (!current) {
379+return incoming;
380+}
381+const normalizedCurrent = normalizeReasoningProgressLine(current);
382+const normalizedIncoming = normalizeReasoningProgressLine(incoming);
383+if (!normalizedIncoming || normalizedIncoming === normalizedCurrent) {
384+return current;
385+}
386+if (isReasoningSnapshotText(incoming) || normalizedIncoming.startsWith(normalizedCurrent)) {
387+return incoming;
388+}
389+return `${current}${incoming}`;
390+}
391+392+function isReasoningSnapshotText(text: string): boolean {
393+return /^\s*(?:>\s*)?Reasoning:\s*/i.test(text);
394+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。