From 4b6c855eda6b9572953c56e3d654e93b8028d7ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Mon, 15 Jun 2026 19:46:05 +0800 Subject: [PATCH] fix: handle memory empty state and tool autoscroll (#728 #729) Tested: - bun test src/server/__tests__/memory.test.ts - cd desktop && bun run test -- src/__tests__/memorySettings.test.tsx - cd desktop && bun run test -- src/components/chat/MessageList.test.tsx -t "active tool input" - cd desktop && bun run check:desktop - bun run check:server --- desktop/src/__tests__/memorySettings.test.tsx | 27 +++++++ .../src/components/chat/MessageList.test.tsx | 74 +++++++++++++++++++ desktop/src/components/chat/MessageList.tsx | 3 +- desktop/src/stores/memoryStore.ts | 28 +++++-- src/server/__tests__/memory.test.ts | 12 +++ src/server/__tests__/scheduled-tasks.test.ts | 2 +- src/server/api/memory.ts | 2 +- 7 files changed, 140 insertions(+), 8 deletions(-) diff --git a/desktop/src/__tests__/memorySettings.test.tsx b/desktop/src/__tests__/memorySettings.test.tsx index 131a4bec..efbeaa3f 100644 --- a/desktop/src/__tests__/memorySettings.test.tsx +++ b/desktop/src/__tests__/memorySettings.test.tsx @@ -163,6 +163,33 @@ describe('MemorySettings', () => { expect(await screen.findByTestId('markdown-preview')).toHaveTextContent('Prefer small diffs') }) + it('does not select a missing current project with no memory files', async () => { + memoryApiMock.listProjects.mockResolvedValue({ + projects: [ + { + id: '-programs-claude-code', + label: 'C:\\Programs\\claude-code', + memoryDir: 'C:\\Users\\HUAWEI\\.claude\\projects\\-programs-claude-code\\memory', + exists: false, + fileCount: 0, + isCurrent: true, + }, + ], + }) + + render() + + await waitFor(() => { + expect(screen.getAllByText('Programs/claude-code')).toHaveLength(1) + }) + expect(screen.getByText('Missing')).toBeInTheDocument() + expect(screen.getAllByText('No file selected').length).toBeGreaterThan(0) + expect(screen.getByText('Select a project.')).toBeInTheDocument() + expect(screen.queryByText(/HUAWEI/)).not.toBeInTheDocument() + expect(memoryApiMock.listFiles).not.toHaveBeenCalled() + expect(useMemoryStore.getState().selectedProjectId).toBeNull() + }) + it('lets the markdown editor fill the remaining detail pane height', async () => { render() diff --git a/desktop/src/components/chat/MessageList.test.tsx b/desktop/src/components/chat/MessageList.test.tsx index a9e37cb7..a3b47e76 100644 --- a/desktop/src/components/chat/MessageList.test.tsx +++ b/desktop/src/components/chat/MessageList.test.tsx @@ -2269,6 +2269,80 @@ describe('MessageList nested tool calls', () => { expect(scrollTop).toBe(600) }) + it('keeps auto-scrolling when active tool input updates in place', async () => { + const scrollIntoView = vi.fn() + Object.defineProperty(HTMLElement.prototype, 'scrollIntoView', { + configurable: true, + value: scrollIntoView, + }) + + useChatStore.setState({ + sessions: { + [ACTIVE_TAB]: makeSessionState({ + chatState: 'tool_executing', + streamingToolInput: '{"file_path":"/tmp/app.vue","content":"