# Memory Editor UI - Comprehensive CRUD Interface ## Overview Implemented comprehensive memory management UI in the Web Control Panel (Tab 9: Memories) with full CRUD operations. Users can now manually edit, create, delete, and search memories through an intuitive interface. ## Features ### 1. Edit Existing Memories - **Edit Button (✏️)** next to each memory/fact - Modal dialog with textarea for content editing - Source field for tracking where the memory came from - Preserves vector embeddings when only metadata changes - Re-embeds content when text is modified ### 2. Create New Memories - **"➕ Add Fact"** button for declarative memories - **"➕ Add Memory"** button for episodic memories - Modal dialog with: - Content textarea - Optional User ID (for user-specific memories) - Source field (defaults to "manual") - Automatically generates proper embeddings and metadata ### 3. Search/Filter Memories - Search input above each memory list - Real-time filtering as you type - Case-insensitive search across content and metadata - Shows/hides matching items dynamically ### 4. Delete Operations - Individual delete (🗑️ button) - single confirmation - Delete All - multi-step safety flow (unchanged) ## Implementation Details ### Backend API (bot/api.py) **New Pydantic Models:** ```python class MemoryEditRequest(BaseModel): content: str metadata: Optional[dict] = None class MemoryCreateRequest(BaseModel): content: str collection: str # "declarative" or "episodic" user_id: Optional[str] = None source: Optional[str] = None metadata: Optional[dict] = None ``` **New Endpoints:** - `PUT /memory/point/{collection}/{point_id}` - Edit existing memory - `POST /memory/create` - Create new memory point ### Cat Client (bot/utils/cat_client.py) **New Methods:** **`update_memory_point(collection, point_id, content, metadata=None)`:** 1. Fetches existing point from Qdrant (includes vector) 2. Checks if content changed 3. If content changed: Re-embeds via Cat's `/embedder` endpoint 4. If only metadata changed: Preserves existing vector 5. Updates point in Qdrant with new payload 6. Returns `True` on success **`create_memory_point(collection, content, user_id=None, source=None)`:** 1. Generates UUID for new point_id 2. Embeds content via Cat's `/embedder` endpoint 3. Builds payload with metadata: - `source`: Tracking field (e.g., "manual", "discord", "autonomous") - `when`: Unix timestamp - `user_id`: For declarative memories, identifies user 4. Inserts into Qdrant collection 5. Returns `point_id` on success, `None` on failure **Key Details:** - Uses Qdrant REST API: `http://cheshire-cat-vector-memory:6333` - Leverages Cat's `/embedder` endpoint for consistent vector generation - Proper error handling with try/except blocks - Async operations with aiohttp ### Frontend UI (bot/static/index.html) **Modal Dialogs Added:** **Edit Memory Modal:** ```html
``` **Create Memory Modal:** ```html
``` **JavaScript Functions Added:** - `showEditMemoryModal(collection, pointId, memoryData)` - Open edit modal with data - `closeEditMemoryModal()` - Close edit modal - `saveMemoryEdit()` - PUT request to update memory - `showCreateMemoryModal(collection)` - Open create modal for collection type - `closeCreateMemoryModal()` - Close create modal - `saveNewMemory()` - POST request to create memory - `filterMemories(listId, searchTerm)` - Real-time search/filter **UI Enhancements:** - Added `memory-item` class to all memory divs for filtering - Edit button (✏️) styled with blue color (#5599cc) - Delete button (🗑️) kept in red (#993333) - Search inputs with `oninput` handlers for live filtering - Flex layout for button groups ## Usage Guide ### Editing a Memory 1. Navigate to **Tab 9: Memories** in Web UI 2. Load facts or episodic memories 3. Click the **✏️ Edit** button next to any memory 4. Modal opens with current content and source 5. Modify the content and/or source 6. Click **"Save Changes"** 7. Memory is updated in Qdrant and list refreshes ### Creating a New Memory **For Declarative Facts:** 1. Click **"➕ Add Fact"** button 2. Enter the fact content (e.g., "Miku's favorite color is cyan") 3. Optionally add User ID (for user-specific facts) 4. Set source (defaults to "manual") 5. Click **"Create Memory"** 6. Fact is embedded and stored in declarative collection **For Episodic Memories:** 1. Click **"➕ Add Memory"** button 2. Enter the memory content (conversation context) 3. Optionally add User ID 4. Set source (e.g., "manual", "test", "import") 5. Click **"Create Memory"** 6. Memory is embedded and stored in episodic collection ### Searching Memories 1. Type in the search box above the memory list 2. Results filter in real-time 3. Clear the search box to see all memories again 4. Search matches content and metadata ### Testing the Feature **Create a Test Fact:** ```javascript // In browser console or through UI: // Click "Add Fact" button, enter: Content: "Miku's favorite color is cyan" User ID: (leave empty for general fact) Source: "test" ``` **Verify Through Chat:** ``` User: "What is your favorite color?" Miku: "My favorite color is cyan!" (should recall the fact) ``` **Edit the Fact:** ```javascript // Click ✏️ next to the fact, change: Content: "Miku's favorite color is teal" Source: "test_edit" ``` **Delete the Fact:** ```javascript // Click 🗑️ button, confirm deletion ``` ## Technical Architecture ### Data Flow **Edit Memory:** ``` User clicks ✏️ → showEditMemoryModal() populates form → User edits and clicks "Save" → saveMemoryEdit() → PUT /memory/point/{collection}/{id} → api.py validates with MemoryEditRequest → cat_adapter.update_memory_point() → Fetches existing point from Qdrant → Re-embeds if content changed → Updates point in Qdrant → Returns success → UI reloads memory list ``` **Create Memory:** ``` User clicks ➕ Add Fact → showCreateMemoryModal('declarative') → User fills form and clicks "Create" → saveNewMemory() → POST /memory/create → api.py validates with MemoryCreateRequest → cat_adapter.create_memory_point() → Generates UUID → Embeds content via Cat's /embedder → Builds payload with metadata → Inserts into Qdrant → Returns point_id → UI reloads memory list and refreshes stats ``` ### Error Handling **Backend:** - Validates collection name (only "declarative" and "episodic" allowed) - Checks for empty content - Handles Qdrant connection errors - Returns proper error messages in JSON **Frontend:** - Shows user-friendly notifications - Disables buttons during operations - Reverts button text on error - Validates required fields before submission ## Metadata Structure ### Declarative Memories ```json { "source": "manual", "when": 1734567890.123, "user_id": "user_discord_id_here" // Optional, for user-specific facts } ``` ### Episodic Memories ```json { "source": "manual", "when": 1734567890.123 } ``` **Note:** `user_id` is only used in declarative memories to associate facts with specific users. ## Future Enhancements ### Potential Features: 1. **Batch Operations** - Select multiple memories with checkboxes - Bulk delete selected - Bulk export selected 2. **Import/Export** - Export memories as JSON file - Import memories from JSON - Bulk memory migration 3. **Advanced Filtering** - Filter by date range - Filter by source - Filter by user_id - Sort by similarity score 4. **Memory History** - Track edit history - Show who edited and when - Ability to revert changes 5. **Memory Insights** - Show most recalled memories - Identify unused/stale memories - Suggest memory consolidation 6. **Rich Text Editing** - Markdown support in memory content - Syntax highlighting for code snippets - Preview mode ## Testing Checklist - [x] Backend API endpoints respond correctly - [x] Cat client methods communicate with Qdrant - [x] Edit modal opens and populates correctly - [x] Edit saves and updates memory in Qdrant - [x] Create modal opens for both fact and memory types - [x] Create generates proper embeddings and stores in Qdrant - [x] Search/filter works in real-time - [x] Delete still works as expected - [x] UI refreshes after operations - [x] Error notifications display properly - [ ] Test with actual chat queries to verify LLM recalls edited facts - [ ] Test user-specific facts with user_id parameter - [ ] Performance test with large memory sets (1000+ items) ## Related Files **Backend:** - `/bot/api.py` - Lines 2778-2788 (models), 2918-2968 (endpoints) - `/bot/utils/cat_client.py` - Lines 382-541 (new methods) **Frontend:** - `/bot/static/index.html` - Lines 1613-1781 (UI sections and modals), 5268-5685 (JavaScript functions) **Documentation:** - `/readmes/MEMORY_EDITOR_FEATURE.md` - This file - `/readmes/AUTONOMOUS_V2_DECISION_LOGIC.md` - Memory usage in autonomous system ## Notes - Container must be restarted after API changes: `docker restart miku-bot` - Modals use flexbox centering with semi-transparent backdrop - Memory items use `class="memory-item"` for filtering - Edit button uses ✏️ emoji with blue color (#5599cc) - Create buttons use ➕ emoji - All operations show loading states (button text changes) - Success/error notifications use existing `showNotification()` function