diff options
| author | Marat Boshernitsan <[email protected]> | 2025-06-03 23:01:26 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-03 23:01:26 -0700 |
| commit | 7de790fbf236193191a33482793ee3ec5943d62d (patch) | |
| tree | 793bd860550f91238e91b65177c88b53c6b820b7 /packages/cli/src/ui/hooks | |
| parent | c313762ba06ab1324dccd4c7663038cb56d24e53 (diff) | |
Fix several bugs in prompt history (#734)
Co-authored-by: Marat Boshernitsan <[email protected]>
Diffstat (limited to 'packages/cli/src/ui/hooks')
| -rw-r--r-- | packages/cli/src/ui/hooks/useHistoryManager.test.ts | 61 | ||||
| -rw-r--r-- | packages/cli/src/ui/hooks/useHistoryManager.ts | 18 |
2 files changed, 77 insertions, 2 deletions
diff --git a/packages/cli/src/ui/hooks/useHistoryManager.test.ts b/packages/cli/src/ui/hooks/useHistoryManager.test.ts index 35964612..c7f925e2 100644 --- a/packages/cli/src/ui/hooks/useHistoryManager.test.ts +++ b/packages/cli/src/ui/hooks/useHistoryManager.test.ts @@ -138,4 +138,65 @@ describe('useHistoryManager', () => { expect(result.current.history).toEqual([]); }); + + it('should not add consecutive duplicate user messages', () => { + const { result } = renderHook(() => useHistory()); + const timestamp = Date.now(); + const itemData1: Omit<HistoryItem, 'id'> = { + type: 'user', // Replaced HistoryItemType.User + text: 'Duplicate message', + }; + const itemData2: Omit<HistoryItem, 'id'> = { + type: 'user', // Replaced HistoryItemType.User + text: 'Duplicate message', + }; + const itemData3: Omit<HistoryItem, 'id'> = { + type: 'gemini', // Replaced HistoryItemType.Gemini + text: 'Gemini response', + }; + const itemData4: Omit<HistoryItem, 'id'> = { + type: 'user', // Replaced HistoryItemType.User + text: 'Another user message', + }; + + act(() => { + result.current.addItem(itemData1, timestamp); + result.current.addItem(itemData2, timestamp + 1); // Same text, different timestamp + result.current.addItem(itemData3, timestamp + 2); + result.current.addItem(itemData4, timestamp + 3); + }); + + expect(result.current.history).toHaveLength(3); + expect(result.current.history[0].text).toBe('Duplicate message'); + expect(result.current.history[1].text).toBe('Gemini response'); + expect(result.current.history[2].text).toBe('Another user message'); + }); + + it('should add duplicate user messages if they are not consecutive', () => { + const { result } = renderHook(() => useHistory()); + const timestamp = Date.now(); + const itemData1: Omit<HistoryItem, 'id'> = { + type: 'user', // Replaced HistoryItemType.User + text: 'Message 1', + }; + const itemData2: Omit<HistoryItem, 'id'> = { + type: 'gemini', // Replaced HistoryItemType.Gemini + text: 'Gemini response', + }; + const itemData3: Omit<HistoryItem, 'id'> = { + type: 'user', // Replaced HistoryItemType.User + text: 'Message 1', // Duplicate text, but not consecutive + }; + + act(() => { + result.current.addItem(itemData1, timestamp); + result.current.addItem(itemData2, timestamp + 1); + result.current.addItem(itemData3, timestamp + 2); + }); + + expect(result.current.history).toHaveLength(3); + expect(result.current.history[0].text).toBe('Message 1'); + expect(result.current.history[1].text).toBe('Gemini response'); + expect(result.current.history[2].text).toBe('Message 1'); + }); }); diff --git a/packages/cli/src/ui/hooks/useHistoryManager.ts b/packages/cli/src/ui/hooks/useHistoryManager.ts index 424f1fb6..f82707ef 100644 --- a/packages/cli/src/ui/hooks/useHistoryManager.ts +++ b/packages/cli/src/ui/hooks/useHistoryManager.ts @@ -43,8 +43,22 @@ export function useHistory(): UseHistoryManagerReturn { (itemData: Omit<HistoryItem, 'id'>, baseTimestamp: number): number => { const id = getNextMessageId(baseTimestamp); const newItem: HistoryItem = { ...itemData, id } as HistoryItem; - setHistory((prevHistory) => [...prevHistory, newItem]); - return id; // Return the generated ID + + setHistory((prevHistory) => { + if (prevHistory.length > 0) { + const lastItem = prevHistory[prevHistory.length - 1]; + // Prevent adding duplicate consecutive user messages + if ( + lastItem.type === 'user' && + newItem.type === 'user' && + lastItem.text === newItem.text + ) { + return prevHistory; // Don't add the duplicate + } + } + return [...prevHistory, newItem]; + }); + return id; // Return the generated ID (even if not added, to keep signature) }, [getNextMessageId], ); |
