Skip to content

Commit 45b18f1

Browse files
committed
Keep text-delta suppression across non-fatal reactor errors
1 parent e36a124 commit 45b18f1

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

src/tui/stream-event-map.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,29 @@ describe("mapProductionEvent", () => {
144144
).toEqual([]);
145145
});
146146

147+
test("non-fatal reactor.error keeps connector.reply suppression after deltas", () => {
148+
const ctx = createStreamMapContext();
149+
mapProductionEvent(
150+
{ type: "inference.text.delta", data: { token: "partial" } },
151+
ctx,
152+
);
153+
expect(
154+
mapProductionEvent(
155+
{
156+
type: "reactor.error",
157+
data: { error: "transient checkpoint write", fatal: false },
158+
},
159+
ctx,
160+
),
161+
).toEqual([{ type: "error", message: "transient checkpoint write" }]);
162+
expect(
163+
mapProductionEvent(
164+
{ type: "connector.reply", data: { content: "final answer" } },
165+
ctx,
166+
),
167+
).toEqual([]);
168+
});
169+
147170
test("connector.reply without prior deltas becomes assistant", () => {
148171
expect(
149172
mapProductionEvent({

src/tui/stream-event-map.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,10 +575,12 @@ function mapEvent(
575575
case "reactor.error": {
576576
const error =
577577
typeof data.error === "string" ? data.error : "reactor error";
578-
if (ctx) ctx.hadTextDelta = false;
578+
// Non-fatal errors don't end the turn: keep delta suppression so a
579+
// later connector.reply doesn't repaint already-streamed text.
579580
if (!isReactorErrorFatal(event.data)) {
580581
return [{ type: "error", message: error }];
581582
}
583+
if (ctx) ctx.hadTextDelta = false;
582584
return [
583585
...disarmAttempt(ctx),
584586
{ type: "error", message: error },

0 commit comments

Comments
 (0)