summaryrefslogtreecommitdiffhomepage
path: root/.rules
diff options
context:
space:
mode:
Diffstat (limited to '.rules')
-rw-r--r--.rules/changelog/2026-03/29/01.md30
1 files changed, 18 insertions, 12 deletions
diff --git a/.rules/changelog/2026-03/29/01.md b/.rules/changelog/2026-03/29/01.md
index 117efc2..6d037c6 100644
--- a/.rules/changelog/2026-03/29/01.md
+++ b/.rules/changelog/2026-03/29/01.md
@@ -1,24 +1,30 @@
# Chat History Persistence & Cross-Device Sync
## New File: `src/chat-history.ts`
-- Added `PersistedMessage` and `ChatHistoryData` interfaces for typed storage
-- `loadChatHistory()` — reads from `chat-history.json` in the plugin folder via `vault.adapter`
-- `saveChatHistory()` — writes user/assistant messages to disk (strips system/tool messages)
-- `clearChatHistory()` — writes an empty history file (not deletion) for reliable Obsidian Sync propagation
-- `toPersistableMessages()` / `toRuntimeMessages()` — conversion between runtime `ChatMessage[]` and storage format
-- `isValidChatHistory()` — strict type guard for safe JSON parsing with version check
+- 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, renders user messages as plain text and assistant messages as markdown (with wiki-link navigation)
+- 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**: writes empty history file and updates sync snapshot
-- Added `reloadChatHistory()` public method for external sync triggers; skips reload if streaming is active to avoid UI disruption
-- Added `saveChatHistoryDebounced()` with snapshot update to prevent false sync reloads from local writes
+- 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 — checks for synced changes when the app regains focus (covers device switching)
-- Added `checkChatHistorySync()` — snapshot-based change detection that reloads the chat view only when the persisted file differs from the known state
+- 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