Skip to content

Commit 34b71ec

Browse files
committed
fix: keep pending stream timestamp until retry
1 parent bf803a5 commit 34b71ec

File tree

3 files changed

+2
-35
lines changed

3 files changed

+2
-35
lines changed

src/browser/components/ChatInput/index.tsx

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ import { setTelemetryEnabled } from "@/common/telemetry";
6262
import { getTokenCountPromise } from "@/browser/utils/tokenizer/rendererClient";
6363
import { CreationCenterContent } from "./CreationCenterContent";
6464
import { CreationControls } from "./CreationControls";
65-
import { useWorkspaceStoreRaw } from "@/browser/stores/WorkspaceStore";
6665
import { useCreationWorkspace } from "./useCreationWorkspace";
6766

6867
type TokenCountReader = () => number;
@@ -137,7 +136,6 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
137136
const [mode, setMode] = useMode();
138137
const { recentModels, addModel, evictModel } = useModelLRU();
139138
const commandListId = useId();
140-
const workspaceStore = useWorkspaceStoreRaw();
141139
const telemetry = useTelemetry();
142140
const [vimEnabled, setVimEnabled] = usePersistedState<boolean>(VIM_ENABLED_KEY, false, {
143141
listener: true,
@@ -445,12 +443,6 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
445443
// Workspace variant: full command handling + message send
446444
if (variant !== "workspace") return; // Type guard
447445

448-
const notifyPendingSendFailed = () => {
449-
setTimeout(() => {
450-
workspaceStore.markPendingStreamFailed(props.workspaceId);
451-
}, 0);
452-
};
453-
454446
try {
455447
// Parse command
456448
const parsed = parseCommand(messageText);
@@ -724,7 +716,6 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
724716
setToast(createErrorToast(result.error));
725717
// Restore input and images on error so user can try again
726718
setInput(messageText);
727-
notifyPendingSendFailed();
728719
setImageAttachments(previousImageAttachments);
729720
} else {
730721
// Track telemetry for successful message send
@@ -745,7 +736,6 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
745736
raw: error instanceof Error ? error.message : "Failed to send message",
746737
})
747738
);
748-
notifyPendingSendFailed();
749739
setInput(messageText);
750740
setImageAttachments(previousImageAttachments);
751741
} finally {

src/browser/stores/WorkspaceStore.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -365,20 +365,6 @@ export class WorkspaceStore {
365365
return allStates;
366366
}
367367

368-
/**
369-
* Notify the aggregator that a pending stream never started (renderer send failure).
370-
*/
371-
markPendingStreamFailed(workspaceId: string): void {
372-
const aggregator = this.aggregators.get(workspaceId);
373-
if (!aggregator) {
374-
return;
375-
}
376-
377-
if (aggregator.markPendingStreamStartFailed()) {
378-
this.states.bump(workspaceId);
379-
}
380-
}
381-
382368
/**
383369
* Get recency timestamps for all workspaces (for sorting in command palette).
384370
* Derived on-demand from individual workspace states.

src/browser/utils/messages/StreamingMessageAggregator.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ export class StreamingMessageAggregator {
9696
// Track when we're waiting for stream-start after user message
9797
// Prevents retry barrier flash during normal send flow
9898
// Stores timestamp of when user message was sent (null = no pending stream)
99+
// IMPORTANT: We intentionally keep this timestamp until a stream actually starts
100+
// (or the user retries) so retry UI/backoff logic doesn't misfire on send failures.
99101
private pendingStreamStartTime: number | null = null;
100102

101103
// Workspace creation timestamp (used for recency calculation)
@@ -267,17 +269,6 @@ export class StreamingMessageAggregator {
267269
return this.pendingStreamStartTime;
268270
}
269271

270-
/**
271-
* Clear pending stream-start tracking when send fails before we ever receive stream-start.
272-
* Returns true when the internal state changed so callers can trigger updates.
273-
*/
274-
markPendingStreamStartFailed(): boolean {
275-
if (this.pendingStreamStartTime === null) {
276-
return false;
277-
}
278-
this.pendingStreamStartTime = null;
279-
return true;
280-
}
281272
private setPendingStreamStartTime(time: number | null): void {
282273
this.pendingStreamStartTime = time;
283274
}

0 commit comments

Comments
 (0)