Skip to content

Commit 34556e8

Browse files
authored
fix(v2): drain message queue after compaction completes (#1414)
handleCompactionEvent set isProcessing: false but never called processQueue(), leaving messages queued during compaction stuck until the next sendMessage — which then ran out of order. Add processQueue() calls after both completed and failed branches, matching the existing pattern in sendMessage.
1 parent a8f3d34 commit 34556e8

2 files changed

Lines changed: 54 additions & 2 deletions

File tree

packages/tui/src/stores/app-store.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ interface BaseAppActions {
220220
agent: { name: string; welcomeMessage?: string } | null
221221
) => void;
222222
setPreviousAgentName: (name: string | null) => void;
223-
handleCompactionEvent: (event: AgentStreamEvent) => void;
223+
handleCompactionEvent: (event: AgentStreamEvent) => Promise<void>;
224224

225225
// Chat actions
226226
clearMessages: () => void;
@@ -1245,7 +1245,7 @@ export const createAppStore = (props: AppStoreProps) => {
12451245
},
12461246
setPreviousAgentName: (previousAgentName) => set({ previousAgentName }),
12471247

1248-
handleCompactionEvent: (event) => {
1248+
handleCompactionEvent: async (event) => {
12491249
if (event.type === AgentEventType.ContextUsage) {
12501250
logger.info(
12511251
'[context-usage] ContextUsage event in compactionHandler, percent=',
@@ -1277,13 +1277,15 @@ export const createAppStore = (props: AppStoreProps) => {
12771277
}
12781278
return { isCompacting: false, isProcessing: false, messages };
12791279
});
1280+
await get().processQueue();
12801281
} else if (event.status === 'failed') {
12811282
set({ isCompacting: false, isProcessing: false });
12821283
get().showTransientAlert({
12831284
message: `Compaction failed: ${event.error ?? 'unknown error'}`,
12841285
status: 'error',
12851286
autoHideMs: 5000,
12861287
});
1288+
await get().processQueue();
12871289
}
12881290
},
12891291

packages/tui/src/stores/message-queue.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { describe, it, expect, mock } from 'bun:test';
22
import { createAppStore } from './app-store';
33
import { Kiro } from '../kiro';
4+
import { AgentEventType } from '../types/agent-events';
45

56
mock.module('../kiro', () => ({
67
Kiro: mock(() => ({
@@ -206,4 +207,53 @@ describe('Message queue', () => {
206207
expect(store.getState().toolOutputsExpanded).toBe(true);
207208
});
208209
});
210+
211+
describe('compaction drains queue', () => {
212+
it('processQueue is called after compaction completes', async () => {
213+
const store = createTestStore();
214+
store.setState({
215+
isCompacting: true,
216+
isProcessing: true,
217+
queuedMessages: ['queued during compaction'],
218+
});
219+
220+
await store.getState().handleCompactionEvent({
221+
type: AgentEventType.CompactionStatus,
222+
status: 'completed',
223+
});
224+
225+
expect(store.getState().isCompacting).toBe(false);
226+
expect(store.getState().queuedMessages).toEqual([]);
227+
});
228+
229+
it('processQueue is called after compaction fails', async () => {
230+
const store = createTestStore();
231+
store.setState({
232+
isCompacting: true,
233+
isProcessing: true,
234+
queuedMessages: ['queued during compaction'],
235+
});
236+
237+
await store.getState().handleCompactionEvent({
238+
type: AgentEventType.CompactionStatus,
239+
status: 'failed',
240+
error: 'test error',
241+
});
242+
243+
expect(store.getState().isCompacting).toBe(false);
244+
expect(store.getState().queuedMessages).toEqual([]);
245+
});
246+
247+
it('queue is untouched when compaction starts', async () => {
248+
const store = createTestStore();
249+
store.setState({ queuedMessages: ['pre-existing'] });
250+
251+
await store.getState().handleCompactionEvent({
252+
type: AgentEventType.CompactionStatus,
253+
status: 'started',
254+
});
255+
256+
expect(store.getState().queuedMessages).toEqual(['pre-existing']);
257+
});
258+
});
209259
});

0 commit comments

Comments
 (0)