Skip to content

Commit 37ba258

Browse files
committed
Fix optimistic items review issues
1 parent 91443cc commit 37ba258

3 files changed

Lines changed: 17 additions & 21 deletions

File tree

apps/code/src/renderer/features/sessions/service/service.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const mockSessionStoreSetters = vi.hoisted(() => ({
5252
clearAll: vi.fn(),
5353
appendOptimisticItem: vi.fn(),
5454
clearOptimisticItems: vi.fn(),
55+
replaceOptimisticWithEvent: vi.fn(),
5556
}));
5657

5758
vi.mock("@features/sessions/stores/sessionStore", () => ({
@@ -207,6 +208,7 @@ const createMockSession = (
207208
promptStartedAt: null,
208209
pendingPermissions: new Map(),
209210
messageQueue: [],
211+
optimisticItems: [],
210212
...overrides,
211213
});
212214

apps/code/src/renderer/features/sessions/service/service.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -817,16 +817,15 @@ export class SessionService {
817817
const session = sessionStoreSetters.getSessions()[taskRunId];
818818
if (!session) return;
819819

820-
if (
820+
const isUserPromptEcho =
821821
isJsonRpcRequest(acpMsg.message) &&
822-
acpMsg.message.method === "session/prompt"
823-
) {
824-
sessionStoreSetters.appendEventAndClearOptimisticItems(taskRunId, acpMsg);
825-
this.updatePromptStateFromEvents(taskRunId, [acpMsg]);
826-
return;
827-
}
822+
acpMsg.message.method === "session/prompt";
828823

829-
sessionStoreSetters.appendEvents(taskRunId, [acpMsg]);
824+
if (isUserPromptEcho) {
825+
sessionStoreSetters.replaceOptimisticWithEvent(taskRunId, acpMsg);
826+
} else {
827+
sessionStoreSetters.appendEvents(taskRunId, [acpMsg]);
828+
}
830829
this.updatePromptStateFromEvents(taskRunId, [acpMsg]);
831830

832831
const msg = acpMsg.message;
@@ -1004,7 +1003,7 @@ export class SessionService {
10041003
prompt_length_chars: promptText.length,
10051004
});
10061005

1007-
return this.sendLocalPrompt(session, blocks);
1006+
return this.sendLocalPrompt(session, blocks, promptText);
10081007
}
10091008

10101009
/**
@@ -1051,7 +1050,7 @@ export class SessionService {
10511050
});
10521051

10531052
try {
1054-
return await this.sendLocalPrompt(session, blocks);
1053+
return await this.sendLocalPrompt(session, blocks, combinedText);
10551054
} catch (error) {
10561055
// Log that queued messages were lost due to send failure
10571056
log.error("Failed to send queued messages, messages lost", {
@@ -1066,6 +1065,7 @@ export class SessionService {
10661065
private async sendLocalPrompt(
10671066
session: AgentSession,
10681067
blocks: ContentBlock[],
1068+
promptText: string,
10691069
): Promise<{ stopReason: string }> {
10701070
sessionStoreSetters.updateSession(session.taskRunId, {
10711071
isPromptPending: true,
@@ -1074,7 +1074,7 @@ export class SessionService {
10741074

10751075
sessionStoreSetters.appendOptimisticItem(session.taskRunId, {
10761076
type: "user_message",
1077-
content: extractPromptText(blocks),
1077+
content: promptText,
10781078
timestamp: Date.now(),
10791079
});
10801080

@@ -1083,7 +1083,6 @@ export class SessionService {
10831083
sessionId: session.taskRunId,
10841084
prompt: blocks,
10851085
});
1086-
// Clear pending state on success
10871086
sessionStoreSetters.updateSession(session.taskRunId, {
10881087
isPromptPending: false,
10891088
promptStartedAt: null,
@@ -1955,6 +1954,7 @@ export class SessionService {
19551954
promptStartedAt: null,
19561955
pendingPermissions: new Map(),
19571956
messageQueue: [],
1957+
optimisticItems: [],
19581958
};
19591959
}
19601960

apps/code/src/renderer/features/sessions/stores/sessionStore.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export interface AgentSession {
6868
cloudErrorMessage?: string | null;
6969
/** Cloud task branch */
7070
cloudBranch?: string | null;
71-
optimisticItems?: OptimisticItem[];
71+
optimisticItems: OptimisticItem[];
7272
}
7373

7474
// --- Config Option Helpers ---
@@ -345,13 +345,10 @@ export const sessionStoreSetters = {
345345
taskRunId: string,
346346
item: Omit<OptimisticItem, "id">,
347347
): void => {
348-
const id = `optimistic-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
348+
const id = `optimistic-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
349349
useSessionStore.setState((state) => {
350350
const session = state.sessions[taskRunId];
351351
if (session) {
352-
if (!session.optimisticItems) {
353-
session.optimisticItems = [];
354-
}
355352
session.optimisticItems.push({ ...item, id });
356353
}
357354
});
@@ -366,10 +363,7 @@ export const sessionStoreSetters = {
366363
});
367364
},
368365

369-
appendEventAndClearOptimisticItems: (
370-
taskRunId: string,
371-
event: AcpMessage,
372-
): void => {
366+
replaceOptimisticWithEvent: (taskRunId: string, event: AcpMessage): void => {
373367
useSessionStore.setState((state) => {
374368
const session = state.sessions[taskRunId];
375369
if (session) {

0 commit comments

Comments
 (0)