reorganize: consolidate all documentation into readmes/
- Moved 20 root-level markdown files to readmes/ - Includes COMMANDS.md, CONFIG_README.md, all UNO docs, all completion reports - Added new: MEMORY_EDITOR_FEATURE.md, MEMORY_EDITOR_ESCAPING_FIX.md, CONFIG_SOURCES_ANALYSIS.md, MCP_TOOL_CALLING_ANALYSIS.md, and others - Root directory is now clean of documentation clutter
This commit is contained in:
82
readmes/MEMORY_EDITOR_ESCAPING_FIX.md
Normal file
82
readmes/MEMORY_EDITOR_ESCAPING_FIX.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# JavaScript String Escaping Bug - FIXED
|
||||
|
||||
## Issue
|
||||
|
||||
When editing memories that contained quotes, newlines, or other special characters, the Edit button would throw:
|
||||
```
|
||||
Uncaught SyntaxError: "" literal not terminated before end of script
|
||||
```
|
||||
|
||||
## Root Cause
|
||||
|
||||
The original code passed JSON data directly into the HTML onclick attribute:
|
||||
```javascript
|
||||
const factData = JSON.stringify(fact).replace(/'/g, "\\'");
|
||||
html += `<button onclick='showEditMemoryModal("declarative", "${fact.id}", ${factData})'>✏️</button>`;
|
||||
```
|
||||
|
||||
**Problem:** When the fact content contained characters like:
|
||||
- Double quotes: `"My favorite song is "Monitoring""`
|
||||
- Newlines: `"Line 1\nLine 2"`
|
||||
- Backslashes: `"Path: C:\Users\Name"`
|
||||
|
||||
The escaping with `.replace(/'/g, "\\'")` only handled single quotes, causing syntax errors in the generated HTML.
|
||||
|
||||
## Solution
|
||||
|
||||
**Encode the data using `encodeURIComponent`:**
|
||||
```javascript
|
||||
const factDataEncoded = encodeURIComponent(JSON.stringify(fact));
|
||||
html += `<button onclick='showEditMemoryModal("declarative", "${fact.id}", "${factDataEncoded}")'>✏️</button>`;
|
||||
```
|
||||
|
||||
**Decode in the modal function:**
|
||||
```javascript
|
||||
function showEditMemoryModal(collection, pointId, memoryData) {
|
||||
const decodedData = typeof memoryData === 'string' ? decodeURIComponent(memoryData) : memoryData;
|
||||
const memory = typeof decodedData === 'string' ? JSON.parse(decodedData) : decodedData;
|
||||
// ... rest of function
|
||||
}
|
||||
```
|
||||
|
||||
## Why This Works
|
||||
|
||||
- `encodeURIComponent()` converts all special characters to URL-safe percent-encoded format
|
||||
- The encoded string is safe to use in HTML attributes
|
||||
- `decodeURIComponent()` converts it back to the original JSON string
|
||||
- `JSON.parse()` then converts it to a JavaScript object
|
||||
|
||||
## Files Modified
|
||||
|
||||
- `/bot/static/index.html`:
|
||||
- Line ~5356: `loadFacts()` function - changed factData to factDataEncoded
|
||||
- Line ~5400: `loadEpisodicMemories()` function - changed memData to memDataEncoded
|
||||
- Line ~5535: `showEditMemoryModal()` function - added decodeURIComponent step
|
||||
|
||||
## Testing
|
||||
|
||||
**Before Fix:**
|
||||
```javascript
|
||||
// Memory with quotes
|
||||
Content: 'My favorite song is "Monitoring"'
|
||||
Result: ❌ Syntax error when clicking Edit button
|
||||
```
|
||||
|
||||
**After Fix:**
|
||||
```javascript
|
||||
// Memory with quotes
|
||||
Content: 'My favorite song is "Monitoring"'
|
||||
Encoded: 'My%20favorite%20song%20is%20%22Monitoring%22'
|
||||
Result: ✅ Modal opens correctly with content displayed
|
||||
```
|
||||
|
||||
## Status
|
||||
|
||||
✅ **FIXED** - Encoding/decoding properly handles all special characters
|
||||
|
||||
## Restart Required
|
||||
|
||||
After making these changes, restart the container:
|
||||
```bash
|
||||
docker restart miku-bot
|
||||
```
|
||||
Reference in New Issue
Block a user