












@@ -72,8 +72,9 @@ export function createEventHandlers(context: EventHandlerContext) {
7272 clearLocalBtwRunIds,
7373 localMode,
7474} = context;
75-const finalizedRuns = new Map<string, number>();
7675const sessionRuns = new Map<string, number>();
76+const finalizedRuns = new Map<string, number>();
77+const finalizedRunsWithDisplay = new Map<string, number>();
7778const postFinalizingRuns = new Map<string, number>();
7879let streamAssembler = new TuiStreamAssembler();
7980let lastSessionKey = state.currentSessionKey;
@@ -172,6 +173,7 @@ export function createEventHandlers(context: EventHandlerContext) {
172173}
173174lastSessionKey = state.currentSessionKey;
174175finalizedRuns.clear();
176+finalizedRunsWithDisplay.clear();
175177sessionRuns.clear();
176178postFinalizingRuns.clear();
177179streamAssembler = new TuiStreamAssembler();
@@ -230,11 +232,15 @@ export function createEventHandlers(context: EventHandlerContext) {
230232pruneRunMap(sessionRuns);
231233};
232234233-const noteFinalizedRun = (runId: string) => {
235+const noteFinalizedRun = (runId: string, opts?: { displayedFinal?: boolean }) => {
234236finalizedRuns.set(runId, Date.now());
237+if (opts?.displayedFinal === true) {
238+finalizedRunsWithDisplay.set(runId, Date.now());
239+}
235240sessionRuns.delete(runId);
236241streamAssembler.drop(runId);
237242pruneRunMap(finalizedRuns);
243+pruneRunMap(finalizedRunsWithDisplay);
238244};
239245240246const notePostFinalizingRun = (runId: string) => {
@@ -287,8 +293,9 @@ export function createEventHandlers(context: EventHandlerContext) {
287293runId: string;
288294wasActiveRun: boolean;
289295status: "idle" | "error";
296+displayedFinal?: boolean;
290297}) => {
291-noteFinalizedRun(params.runId);
298+noteFinalizedRun(params.runId, { displayedFinal: params.displayedFinal });
292299clearActiveRunIfMatch(params.runId);
293300flushPendingHistoryRefreshIfIdle();
294301if (params.wasActiveRun) {
@@ -393,8 +400,12 @@ export function createEventHandlers(context: EventHandlerContext) {
393400return;
394401}
395402if (evt.state === "final") {
396-clearStaleStreamingIfNoTrackedRunRemains();
397-return;
403+const hasLateDisplayableFinal =
404+Boolean(evt.message) && !finalizedRunsWithDisplay.has(evt.runId);
405+if (!hasLateDisplayableFinal) {
406+clearStaleStreamingIfNoTrackedRunRemains();
407+return;
408+}
398409}
399410}
400411if (reconnectPendingRunId === evt.runId) {
@@ -451,7 +462,7 @@ export function createEventHandlers(context: EventHandlerContext) {
451462if (text) {
452463chatLog.addSystem(text);
453464}
454-finalizeRun({ runId: evt.runId, wasActiveRun, status: "idle" });
465+finalizeRun({ runId: evt.runId, wasActiveRun, status: "idle", displayedFinal: true });
455466tui.requestRender();
456467return;
457468}
@@ -480,6 +491,7 @@ export function createEventHandlers(context: EventHandlerContext) {
480491runId: evt.runId,
481492 wasActiveRun,
482493status: stopReason === "error" ? "error" : "idle",
494+displayedFinal: !suppressEmptyExternalPlaceholder,
483495});
484496}
485497if (evt.state === "aborted") {
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。