feat: Optimize the first dialogue and memory

This commit is contained in:
saboteur7
2026-01-30 19:10:37 +08:00
parent dd6a9c26bd
commit 8a69d4354e
6 changed files with 156 additions and 335 deletions

View File

@@ -248,8 +248,8 @@ class MemoryManager:
memory_dir = self.config.get_memory_dir()
workspace_dir = self.config.get_workspace()
# Scan memory/MEMORY.md
memory_file = memory_dir / "MEMORY.md"
# Scan MEMORY.md (workspace root)
memory_file = Path(workspace_dir) / "MEMORY.md"
if memory_file.exists():
await self._sync_file(memory_file, "memory", "shared", None)
@@ -452,7 +452,7 @@ class MemoryManager:
**背景知识**: 下方包含核心长期记忆,可直接使用。需要查找历史时,用 memory_search 搜索(搜索一次即可,不要重复)。
**存储记忆**: 当用户分享重要信息时(偏好、决策、事实等),主动用 write 工具存储:
- 长期信息 → memory/MEMORY.md
- 长期信息 → MEMORY.md
- 当天笔记 → memory/{today_file}
- 静默存储,仅在明确要求时确认
@@ -463,7 +463,7 @@ class MemoryManager:
**Background Knowledge**: Core long-term memories below - use directly. For history, use memory_search once (don't repeat).
**Store Memories**: When user shares important info (preferences, decisions, facts), proactively write:
- Durable info → memory/MEMORY.md
- Durable info → MEMORY.md
- Daily notes → memory/{today_file}
- Store silently; confirm only when explicitly requested
@@ -482,8 +482,8 @@ class MemoryManager:
Load bootstrap memory files for session start
Following clawdbot's design:
- Only loads memory/MEMORY.md (long-term curated memory)
- Daily files (YYYY-MM-DD.md) are accessed via memory_search tool, not bootstrap
- Only loads MEMORY.md from workspace root (long-term curated memory)
- Daily files (memory/YYYY-MM-DD.md) are accessed via memory_search tool, not bootstrap
- User-specific MEMORY.md is also loaded if user_id provided
Returns memory content WITHOUT obvious headers so it blends naturally
@@ -500,16 +500,16 @@ class MemoryManager:
sections = []
# 1. Load memory/MEMORY.md ONLY (long-term curated memory)
# 1. Load MEMORY.md from workspace root (long-term curated memory)
# Following clawdbot: only MEMORY.md is bootstrap, daily files use memory_search
memory_file = memory_dir / "MEMORY.md"
memory_file = Path(workspace_dir) / "MEMORY.md"
if memory_file.exists():
try:
content = memory_file.read_text(encoding='utf-8').strip()
if content:
sections.append(content)
except Exception as e:
print(f"Warning: Failed to read memory/MEMORY.md: {e}")
print(f"Warning: Failed to read MEMORY.md: {e}")
# 2. Load user-specific MEMORY.md if user_id provided
if user_id:

View File

@@ -17,7 +17,7 @@ class MemoryFlushManager:
- Triggers when context approaches token limit
- Runs a silent agent turn to write memories to disk
- Uses memory/YYYY-MM-DD.md for daily notes
- Uses MEMORY.md for long-term curated memories
- Uses MEMORY.md (workspace root) for long-term curated memories
"""
def __init__(
@@ -103,7 +103,7 @@ class MemoryFlushManager:
def get_main_memory_file(self, user_id: Optional[str] = None) -> Path:
"""
Get main memory file path: memory/MEMORY.md
Get main memory file path: MEMORY.md (workspace root)
Args:
user_id: Optional user ID for user-specific memory
@@ -116,7 +116,8 @@ class MemoryFlushManager:
user_dir.mkdir(parents=True, exist_ok=True)
return user_dir / "MEMORY.md"
else:
return self.memory_dir / "MEMORY.md"
# Return workspace root MEMORY.md
return Path(self.workspace_root) / "MEMORY.md"
def create_flush_prompt(self) -> str:
"""
@@ -207,13 +208,13 @@ def create_memory_files_if_needed(workspace_dir: Path, user_id: Optional[str] =
memory_dir = workspace_dir / "memory"
memory_dir.mkdir(parents=True, exist_ok=True)
# Create main MEMORY.md in memory directory
# Create main MEMORY.md in workspace root
if user_id:
user_dir = memory_dir / "users" / user_id
user_dir.mkdir(parents=True, exist_ok=True)
main_memory = user_dir / "MEMORY.md"
else:
main_memory = memory_dir / "MEMORY.md"
main_memory = Path(workspace_root) / "MEMORY.md"
if not main_memory.exists():
# Create empty file or with minimal structure (no obvious "Memory" header)