feat(memory): tag all memories with source persona (miku/evil_miku)
Step 1 of memory system overhaul: persona tagging. - discord_bridge: tag user messages with 'persona' metadata at storage time - memory_consolidation: tag Miku's own responses with 'persona' metadata - memory_consolidation: tag declarative facts with source persona during extraction - memory_consolidation: pass persona context to LLM extraction prompt - memory_consolidation: annotate cross-persona facts in prompt injection (e.g., '(learned as Evil Miku)' when Evil facts appear for Normal Miku) - Web UI: show persona badge (🎤 Miku / 😈 Evil Miku) on facts and episodic memories in the Memory Management tab This lets both personas know which version of Miku each memory came from, enabling Evil Miku to distinguish her own memories from Normal Miku's.
This commit is contained in:
@@ -113,11 +113,15 @@ async function loadFacts() {
|
||||
data.facts.forEach((fact, i) => {
|
||||
const source = fact.metadata?.source || 'unknown';
|
||||
const when = fact.metadata?.when ? new Date(fact.metadata.when * 1000).toLocaleString() : 'unknown';
|
||||
const persona = fact.metadata?.persona || 'miku';
|
||||
const personaBadge = persona === 'evil_miku'
|
||||
? '<span style="background: #7a2a2a; color: #ff9999; font-size: 0.7rem; padding: 0.1rem 0.4rem; border-radius: 3px; margin-left: 0.3rem;">😈 Evil Miku</span>'
|
||||
: '<span style="background: #2a5a7a; color: #99ccff; font-size: 0.7rem; padding: 0.1rem 0.4rem; border-radius: 3px; margin-left: 0.3rem;">🎤 Miku</span>';
|
||||
const factDataJson = escapeJsonForAttribute(fact);
|
||||
html += `
|
||||
<div class="memory-item" style="background: #242424; padding: 0.6rem 0.8rem; margin-bottom: 0.4rem; border-radius: 4px; border-left: 3px solid #2a9955; display: flex; justify-content: space-between; align-items: flex-start;">
|
||||
<div style="flex: 1;">
|
||||
<div style="color: #ddd; font-size: 0.9rem;">${escapeHtml(fact.content)}</div>
|
||||
<div style="color: #ddd; font-size: 0.9rem;">${escapeHtml(fact.content)}${personaBadge}</div>
|
||||
<div style="color: #666; font-size: 0.75rem; margin-top: 0.3rem;">
|
||||
Source: ${escapeHtml(source)} · ${when}
|
||||
</div>
|
||||
@@ -155,11 +159,15 @@ async function loadEpisodicMemories() {
|
||||
data.memories.forEach((mem, i) => {
|
||||
const source = mem.metadata?.source || 'unknown';
|
||||
const when = mem.metadata?.when ? new Date(mem.metadata.when * 1000).toLocaleString() : 'unknown';
|
||||
const persona = mem.metadata?.persona || 'miku';
|
||||
const personaBadge = persona === 'evil_miku'
|
||||
? '<span style="background: #7a2a2a; color: #ff9999; font-size: 0.7rem; padding: 0.1rem 0.4rem; border-radius: 3px; margin-left: 0.3rem;">😈 Evil Miku</span>'
|
||||
: '<span style="background: #2a5a7a; color: #99ccff; font-size: 0.7rem; padding: 0.1rem 0.4rem; border-radius: 3px; margin-left: 0.3rem;">🎤 Miku</span>';
|
||||
const memDataJson = escapeJsonForAttribute(mem);
|
||||
html += `
|
||||
<div class="memory-item" style="background: #242424; padding: 0.6rem 0.8rem; margin-bottom: 0.4rem; border-radius: 4px; border-left: 3px solid #2a5599; display: flex; justify-content: space-between; align-items: flex-start;">
|
||||
<div style="flex: 1;">
|
||||
<div style="color: #ddd; font-size: 0.9rem;">${escapeHtml(mem.content)}</div>
|
||||
<div style="color: #ddd; font-size: 0.9rem;">${escapeHtml(mem.content)}${personaBadge}</div>
|
||||
<div style="color: #666; font-size: 0.75rem; margin-top: 0.3rem;">
|
||||
Source: ${escapeHtml(source)} · ${when}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user