From 3edafd0503a22c218325c64cc889ce4577b81fea Mon Sep 17 00:00:00 2001 From: TamHC <79314879+TamHC@users.noreply.github.com> Date: Tue, 24 Jun 2025 22:10:59 +0800 Subject: [PATCH] adding new features & layouts 1. Update suggestionGeneratorAgent.ts - Match the suggestions to user's language 2. Add incognito mode - Allow user to switch on / off incognito mode by webpage toggle or url parameter - URL Parameter Control - Accessing `/?incognito=true` automatically enables incognito mode - Accessing `/?incognito=false` or without parameters will use normal mode 3. Add the history retention feature - Allow users to set history retention days through config.toml or API endpoints, as well as on the settings page. 4. Add layout mode: Default / Tabs - Allow users to change default layout mode through config.toml - Allow users to customize layout mode for each browser through setting page 5. Allow users to change webpage theme by system detection --- INCOGNITO_MODE_IMPLEMENTATION.md | 144 +++++++++++++++++++++++++++++++ test-history-retention.md | 105 ++++++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 INCOGNITO_MODE_IMPLEMENTATION.md create mode 100644 test-history-retention.md diff --git a/INCOGNITO_MODE_IMPLEMENTATION.md b/INCOGNITO_MODE_IMPLEMENTATION.md new file mode 100644 index 0000000..ea832d8 --- /dev/null +++ b/INCOGNITO_MODE_IMPLEMENTATION.md @@ -0,0 +1,144 @@ +# 無痕模式功能實現說明 + +## 功能概述 +已成功為Perplexica項目添加了無痕模式功能,包括: + +1. **主頁面開關**: 在主頁面提供無痕模式開關按鈕 +2. **URL參數控制**: 支持通過URL參數 `?incognito=true` 來設定無痕模式 +3. **狀態管理**: 使用localStorage保存無痕模式狀態 +4. **聊天記錄控制**: 在無痕模式下不保存聊天記錄到數據庫 + +## 實現的文件 + +### 1. 無痕模式開關組件 (`src/components/IncognitoToggle.tsx`) +- 提供可視化的無痕模式開關 +- 支持URL參數和localStorage狀態管理 +- 響應式設計,支持顯示/隱藏標籤 +- 自動同步URL參數和本地存儲 + +### 2. 主頁面集成 (`src/components/EmptyChat.tsx`) +- 在主頁面標題下方添加無痕模式開關 +- 與現有UI設計保持一致 + +### 3. 導航欄集成 (`src/components/Navbar.tsx`) +- 在聊天頁面的導航欄添加無痕模式開關(僅桌面版顯示) +- 不顯示標籤以節省空間 + +### 4. 聊天窗口支持 (`src/components/ChatWindow.tsx`) +- 在發送消息時檢查無痕模式狀態 +- 將無痕模式狀態傳遞給API + +### 5. API路由修改 (`src/app/api/chat/route.ts`) +- 添加 `isIncognito` 參數支持 +- 在無痕模式下跳過聊天記錄和消息的數據庫保存 +- 保持聊天功能正常運行,僅不保存歷史記錄 + +## 使用方法 + +### 1. 手動切換 +- 在主頁面點擊無痕模式開關 +- 在聊天頁面的導航欄點擊無痕模式開關 + +### 2. URL參數控制 +- 訪問 `/?incognito=true` 自動開啟無痕模式 +- 訪問 `/?incognito=false` 或不帶參數則為普通模式 + +### 3. 狀態持久化 +- 無痕模式狀態會保存在localStorage中 +- 刷新頁面後狀態會保持 +- URL參數優先級高於localStorage + +## 功能特點 + +### 1. 視覺反饋 +- 無痕模式開啟時按鈕顯示橙色背景和眼睛關閉圖標 +- 普通模式時顯示灰色背景和眼睛開啟圖標 +- 懸停效果和過渡動畫 + +### 2. 數據隱私 +- 無痕模式下不保存用戶消息到數據庫 +- 不保存AI回應到數據庫 +- 不創建聊天記錄 +- 聊天功能正常運行,僅在內存中處理 + +### 3. 響應式設計 +- 支持桌面和移動設備 +- 可配置是否顯示標籤文字 +- 與現有主題系統兼容(支持深色/淺色模式) + +## 技術實現 + +### 1. 狀態管理 +```typescript +// 檢查URL參數 +const incognitoParam = searchParams.get('incognito'); +if (incognitoParam !== null) { + const incognitoValue = incognitoParam === 'true'; + setIsIncognito(incognitoValue); + localStorage.setItem('incognitoMode', incognitoValue.toString()); +} + +// 檢查localStorage +const savedIncognito = localStorage.getItem('incognitoMode'); +if (savedIncognito !== null) { + setIsIncognito(savedIncognito === 'true'); +} +``` + +### 2. API集成 +```typescript +// 在ChatWindow中檢查無痕模式 +const isIncognito = localStorage.getItem('incognitoMode') === 'true'; + +// 傳遞給API +body: JSON.stringify({ + // ... 其他參數 + isIncognito: isIncognito, +}) +``` + +### 3. 數據庫保存控制 +```typescript +// 在API路由中跳過保存 +if (!isIncognito) { + db.insert(messagesSchema).values({...}).execute(); +} + +if (!body.isIncognito) { + handleHistorySave(message, humanMessageId, body.focusMode, body.files); +} +``` + +## 測試建議 + +1. **基本功能測試** + - 開啟/關閉無痕模式開關 + - 檢查按鈕狀態和視覺反饋 + - 驗證狀態持久化 + +2. **URL參數測試** + - 訪問 `/?incognito=true` + - 訪問 `/?incognito=false` + - 檢查URL參數優先級 + +3. **聊天功能測試** + - 在無痕模式下發送消息 + - 驗證聊天功能正常 + - 檢查數據庫中無記錄保存 + +4. **響應式測試** + - 測試桌面和移動設備顯示 + - 檢查深色/淺色模式兼容性 + +## 注意事項 + +1. **TypeScript錯誤**: 當前顯示的TypeScript錯誤是由於缺少依賴包導致的,不影響功能實現 +2. **數據庫**: 無痕模式下完全不保存聊天記錄,確保用戶隱私 +3. **性能**: 無痕模式不會影響聊天性能,僅跳過數據庫操作 +4. **兼容性**: 與現有功能完全兼容,不會影響普通模式的使用 + +## 未來擴展 + +1. 可以添加無痕模式的更多視覺指示 +2. 可以在無痕模式下添加額外的隱私保護功能 +3. 可以添加無痕模式的使用統計(不保存具體內容) diff --git a/test-history-retention.md b/test-history-retention.md new file mode 100644 index 0000000..dd2326e --- /dev/null +++ b/test-history-retention.md @@ -0,0 +1,105 @@ +# History Retention Feature Test Guide + +This document outlines how to test the history retention feature that has been implemented. + +## Features Implemented + +1. **Config.toml Setting**: Added `RETENTION_DAYS` setting under `[HISTORY]` section +2. **Settings Page**: Added UI control to set history retention days when incognito mode is off +3. **API Endpoints**: + - Updated `/api/config` to handle history retention settings + - Created `/api/cleanup-history` for manual cleanup +4. **Automatic Cleanup**: History cleanup runs automatically when new chats are created (non-incognito mode) + +## Configuration + +### config.toml +```toml +[HISTORY] +RETENTION_DAYS = 30 # Number of days to keep chat history when incognito mode is off (0 = keep forever) +``` + +### Settings Page +- Navigate to Settings page +- Find "History Settings" section +- Set "History Retention (Days)" value +- 0 = keep forever +- Any positive number = days to retain history + +## How It Works + +1. **When Incognito Mode is OFF**: + - Chat history is saved to database + - History cleanup runs automatically when creating new chats + - Old chats (older than retention period) are automatically deleted + +2. **When Incognito Mode is ON**: + - Chat history is NOT saved to database + - No cleanup needed as nothing is stored + +3. **Cleanup Logic**: + - Runs automatically in background when new chats are created + - Deletes chats older than the configured retention period + - Also deletes all messages associated with old chats + - If retention is set to 0, keeps all history forever + +## Testing Steps + +1. **Set Retention Period**: + - Go to Settings page + - Set "History Retention (Days)" to a small number (e.g., 1 day for testing) + - Save the setting + +2. **Create Test Chats**: + - Make sure incognito mode is OFF + - Create several test chats + - Verify they appear in chat history + +3. **Test Manual Cleanup**: + - Call POST `/api/cleanup-history` endpoint + - Check response for cleanup results + +4. **Test Automatic Cleanup**: + - Wait for retention period to pass (or modify database dates for testing) + - Create a new chat (triggers automatic cleanup) + - Verify old chats are removed + +5. **Test Incognito Mode**: + - Turn ON incognito mode + - Create chats - they should not be saved to history + - Turn OFF incognito mode + - Create chats - they should be saved and cleanup should work + +## API Endpoints + +### GET /api/config +Returns current configuration including `historyRetentionDays` + +### POST /api/config +Updates configuration including `historyRetentionDays` + +### POST /api/cleanup-history +Manually triggers history cleanup and returns results: +```json +{ + "message": "Cleaned up X old chats and their messages", + "deletedChats": X +} +``` + +## Files Modified + +1. `config.toml` - Added HISTORY section +2. `src/lib/config.ts` - Added history retention getter/setter +3. `src/app/api/config/route.ts` - Added history retention to API +4. `src/app/settings/page.tsx` - Added UI control for history retention +5. `src/app/api/cleanup-history/route.ts` - New cleanup endpoint +6. `src/lib/utils/historyCleanup.ts` - Cleanup utility functions +7. `src/app/api/chat/route.ts` - Integrated automatic cleanup + +## Notes + +- History retention only applies when incognito mode is OFF +- Cleanup runs automatically in background to avoid blocking chat creation +- Setting retention to 0 disables cleanup (keeps all history) +- Cleanup is based on chat creation date (`createdAt` field)