summaryrefslogtreecommitdiffhomepage
path: root/.rules/changelog/2026-03/29/01.md
blob: 6d037c602ad6c8133dd3c20f7ebbef126b6e7f08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Chat History Persistence & Cross-Device Sync

## New File: `src/chat-history.ts`
- Added `toPersistableMessages()` — filters ChatMessage[] to only user/assistant messages
- Added `toRuntimeMessages()` — converts persisted messages back to ChatMessage[] for LLM context
- Re-exports `PersistedMessage` type from settings

## Modified: `src/settings.ts`
- Added `PersistedMessage` interface (role: user | assistant, content: string)
- Added `chatHistory: PersistedMessage[]` field to `AIPulseSettings`
- Chat history is stored in `data.json` via Obsidian's `loadData()`/`saveData()`, ensuring:
  - Correct file path regardless of plugin folder name vs manifest ID
  - Native Obsidian Sync support
  - `onExternalSettingsChange()` fires automatically on sync

## Modified: `src/chat-view.ts`
- On **open**: restores persisted chat history from `plugin.settings.chatHistory`, renders user messages as plain text and assistant messages as rendered markdown with wiki-link navigation
- On **message send**: debounced save (500ms) after user message and after assistant response completes
- On **close**: flushes pending save and cleans up debounce timer
- On **clear chat**: sets `chatHistory` to empty array and saves settings (syncs clear to all devices)
- Added `reloadChatHistory()` public method for external sync triggers; skips reload if streaming is active
- Added `saveChatHistoryDebounced()` with snapshot update to prevent false sync reloads
- Added `renderPersistedMessages()` to re-render history with markdown and wiki-link click handlers

## Modified: `src/main.ts`
- Added `onExternalSettingsChange()` — reloads settings and checks for chat history changes when Obsidian Sync updates `data.json`
- Added `visibilitychange` DOM event listener — reloads settings from disk when the app regains focus (covers device switching)
- Added `checkChatHistorySync()` — snapshot-based change detection that reloads the chat view only when the persisted data differs from the known state
- Added `updateChatSnapshot()` — called after local saves and restores to prevent false sync triggers
- Added `buildChatSnapshot()` helper — lightweight string comparison using message count and last message content