Continue the Zustand migration for the Sage Agent JupyterLab extension.

## Context
Read `summary.md` for details on what was completed in the previous session. We're on branch `app-refactor-v2`.

## What's Done
- Created `servicesStore.ts` for service references
- Migrated `SnippetList.tsx`, `FileExplorerContent.tsx`, `NotebookDeploymentButton.tsx` to Zustand hooks
- Migrated `ChatBoxWidget.tsx` to Zustand subscriptions
- Fixed `onNotebookChanged` subscription pattern in 5 files
- Fixed thread name update timing and launcher state sync
- All changes tested and working

## Next Task: Migrate DiffStateService to diffStore

The `DiffStateService` (src/Services/DiffStateService.ts) uses RxJS BehaviorSubject and needs to be replaced with the existing `diffStore` (src/stores/diffStore.ts).

### Files that consume DiffStateService:
1. `src/Notebook/NotebookDiffManager.ts`
2. `src/Chat/ChatMessages.ts`
3. `src/Components/DiffApprovalDialog.ts`
4. `src/Components/DiffNavigationWidget.tsx`
5. `src/Components/DiffItem.tsx`
6. `src/Components/LLMStateDisplay/LLMStateDisplay.tsx`
7. `src/Components/LLMStateDisplay/LLMStateContent.tsx`
8. `src/Chat/ConversationService.ts`
9. `src/Chat/ConversationServiceUtils.ts`

### Migration Rules (IMPORTANT):
1. DO NOT sync between RxJS and Zustand - complete replacement only
2. DELETE original service files after migration
3. For React components: use hooks (useEffect, useDiffStore)
4. For TypeScript classes: use Zustand's subscribe() method
5. Stop after major component changes and ask for testing
6. Be careful with signals/subscriptions - test thoroughly

### Approach:
1. First, read `DiffStateService.ts` and `diffStore.ts` to understand the mapping
2. Update `diffStore.ts` if needed to match DiffStateService functionality
3. Migrate each consumer file one by one
4. After each major file, ask me to test before continuing
5. Once all consumers migrated, delete `DiffStateService.ts`

Start by reading the DiffStateService and diffStore to understand what needs to be mapped.
