feat(evolution): flag self-evolution bubbles in UI and relax MEMORY.md writes

This commit is contained in:
zhayujie
2026-06-07 21:00:03 +08:00
parent 8dd21ddb83
commit 26300a8d43
3 changed files with 31 additions and 7 deletions

View File

@@ -79,13 +79,14 @@ them. When their signal is clear, act; do not be shy here.
Act ONLY on something the main assistant clearly MISSED that does not belong
in any skill.
- MEMORY.md is the curated long-term index, auto-loaded into EVERY future
conversation. Treat it as precious: writing here is RARE and reserved for
CORRECTING a wrong fact already in MEMORY.md (edit that line in place).
Do NOT append new entries to MEMORY.md — that is the nightly pass's job.
- For a genuinely important NEW durable fact the chat missed, append ONE
short bullet to today's `memory/YYYY-MM-DD.md` (not MEMORY.md). When unsure,
the daily file is the safe place — but first ask whether this really
belongs in a skill instead.
conversation. Treat it as precious: edit it in place to CORRECT a wrong
fact, or append a new durable preference/decision/lesson — but do so
SPARINGLY (a lasting fact, not a passing detail; the nightly pass handles
routine consolidation).
- For a NEW fact that is important but not yet clearly lasting, append ONE
short bullet to today's `memory/YYYY-MM-DD.md` instead. When unsure, the
daily file is the safe place — but first ask whether this really belongs
in a skill.
- Keep it to ONE short bullet. Never write paragraphs, never re-summarize the
conversation, never copy what the main assistant already recorded.
- If it is already captured anywhere (check MEMORY.md AND the daily file

View File

@@ -124,6 +124,11 @@ def _is_internal_user_marker(text: str) -> bool:
return any(t.startswith(m) for m in _SCHEDULED_DISPLAY_MARKERS)
def _is_evolution_text(text: str) -> bool:
"""True if assistant text is a self-evolution summary (before cleaning)."""
return (text or "").lstrip().startswith(_EVOLUTION_DISPLAY_MARKER)
def _clean_display_text(text: str) -> str:
"""Strip internal markers from assistant text for user-facing display.
@@ -306,6 +311,10 @@ def _group_into_display_turns(
step["result"] = tr.get("result", "")
step["is_error"] = tr.get("is_error", False)
# Detect a self-evolution bubble BEFORE cleaning the marker away, so the
# UI can flag it even though the visible text stays clean.
is_evolution = _is_evolution_text(final_text)
# Clean internal markers from the user-facing assistant text. Applies to
# both the final content and the mirrored content step so the rendered
# bubble shows clean text while the stored message keeps the markers.
@@ -321,6 +330,8 @@ def _group_into_display_turns(
"steps": steps,
"created_at": final_ts or (user_row[1] if user_row else 0),
}
if is_evolution:
turn["kind"] = "evolution"
if merged_extras:
turn["extras"] = merged_extras
turns.append(turn)