|
@@ -78,7 +78,7 @@ class FileSystemTraceStore:
|
|
|
|
|
|
|
|
# 写入 meta.json
|
|
# 写入 meta.json
|
|
|
meta_file = self._get_meta_file(trace.trace_id)
|
|
meta_file = self._get_meta_file(trace.trace_id)
|
|
|
- meta_file.write_text(json.dumps(trace.to_dict(), indent=2, ensure_ascii=False))
|
|
|
|
|
|
|
+ meta_file.write_text(json.dumps(trace.to_dict(), indent=2, ensure_ascii=False), encoding="utf-8")
|
|
|
|
|
|
|
|
# 创建空的 events.jsonl
|
|
# 创建空的 events.jsonl
|
|
|
events_file = self._get_events_file(trace.trace_id)
|
|
events_file = self._get_events_file(trace.trace_id)
|
|
@@ -92,7 +92,7 @@ class FileSystemTraceStore:
|
|
|
if not meta_file.exists():
|
|
if not meta_file.exists():
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
- data = json.loads(meta_file.read_text())
|
|
|
|
|
|
|
+ data = json.loads(meta_file.read_text(encoding="utf-8"))
|
|
|
|
|
|
|
|
# 解析 datetime 字段
|
|
# 解析 datetime 字段
|
|
|
if data.get("created_at"):
|
|
if data.get("created_at"):
|
|
@@ -115,7 +115,7 @@ class FileSystemTraceStore:
|
|
|
|
|
|
|
|
# 写回文件
|
|
# 写回文件
|
|
|
meta_file = self._get_meta_file(trace_id)
|
|
meta_file = self._get_meta_file(trace_id)
|
|
|
- meta_file.write_text(json.dumps(trace.to_dict(), indent=2, ensure_ascii=False))
|
|
|
|
|
|
|
+ meta_file.write_text(json.dumps(trace.to_dict(), indent=2, ensure_ascii=False), encoding="utf-8")
|
|
|
|
|
|
|
|
async def list_traces(
|
|
async def list_traces(
|
|
|
self,
|
|
self,
|
|
@@ -140,7 +140,7 @@ class FileSystemTraceStore:
|
|
|
continue
|
|
continue
|
|
|
|
|
|
|
|
try:
|
|
try:
|
|
|
- data = json.loads(meta_file.read_text())
|
|
|
|
|
|
|
+ data = json.loads(meta_file.read_text(encoding="utf-8"))
|
|
|
|
|
|
|
|
# 过滤
|
|
# 过滤
|
|
|
if mode and data.get("mode") != mode:
|
|
if mode and data.get("mode") != mode:
|
|
@@ -176,7 +176,7 @@ class FileSystemTraceStore:
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
try:
|
|
try:
|
|
|
- data = json.loads(goal_file.read_text())
|
|
|
|
|
|
|
+ data = json.loads(goal_file.read_text(encoding="utf-8"))
|
|
|
return GoalTree.from_dict(data)
|
|
return GoalTree.from_dict(data)
|
|
|
except Exception:
|
|
except Exception:
|
|
|
return None
|
|
return None
|
|
@@ -184,7 +184,7 @@ class FileSystemTraceStore:
|
|
|
async def update_goal_tree(self, trace_id: str, tree: GoalTree) -> None:
|
|
async def update_goal_tree(self, trace_id: str, tree: GoalTree) -> None:
|
|
|
"""更新完整 GoalTree"""
|
|
"""更新完整 GoalTree"""
|
|
|
goal_file = self._get_goal_file(trace_id)
|
|
goal_file = self._get_goal_file(trace_id)
|
|
|
- goal_file.write_text(json.dumps(tree.to_dict(), indent=2, ensure_ascii=False))
|
|
|
|
|
|
|
+ goal_file.write_text(json.dumps(tree.to_dict(), indent=2, ensure_ascii=False), encoding="utf-8")
|
|
|
|
|
|
|
|
async def add_goal(self, trace_id: str, goal: Goal) -> None:
|
|
async def add_goal(self, trace_id: str, goal: Goal) -> None:
|
|
|
"""添加 Goal 到 GoalTree"""
|
|
"""添加 Goal 到 GoalTree"""
|
|
@@ -463,7 +463,7 @@ class FileSystemTraceStore:
|
|
|
message_file = trace_dir / "messages" / f"{message_id}.json"
|
|
message_file = trace_dir / "messages" / f"{message_id}.json"
|
|
|
if message_file.exists():
|
|
if message_file.exists():
|
|
|
try:
|
|
try:
|
|
|
- data = json.loads(message_file.read_text())
|
|
|
|
|
|
|
+ data = json.loads(message_file.read_text(encoding="utf-8"))
|
|
|
return Message.from_dict(data)
|
|
return Message.from_dict(data)
|
|
|
except Exception:
|
|
except Exception:
|
|
|
pass
|
|
pass
|
|
@@ -483,7 +483,7 @@ class FileSystemTraceStore:
|
|
|
messages = []
|
|
messages = []
|
|
|
for message_file in messages_dir.glob("*.json"):
|
|
for message_file in messages_dir.glob("*.json"):
|
|
|
try:
|
|
try:
|
|
|
- data = json.loads(message_file.read_text())
|
|
|
|
|
|
|
+ data = json.loads(message_file.read_text(encoding="utf-8"))
|
|
|
msg = Message.from_dict(data)
|
|
msg = Message.from_dict(data)
|
|
|
messages.append(msg)
|
|
messages.append(msg)
|
|
|
except Exception:
|
|
except Exception:
|
|
@@ -545,7 +545,7 @@ class FileSystemTraceStore:
|
|
|
# 确定文件路径
|
|
# 确定文件路径
|
|
|
messages_dir = self._get_messages_dir(message.trace_id)
|
|
messages_dir = self._get_messages_dir(message.trace_id)
|
|
|
message_file = messages_dir / f"{message_id}.json"
|
|
message_file = messages_dir / f"{message_id}.json"
|
|
|
- message_file.write_text(json.dumps(message.to_dict(), indent=2, ensure_ascii=False))
|
|
|
|
|
|
|
+ message_file.write_text(json.dumps(message.to_dict(), indent=2, ensure_ascii=False), encoding="utf-8")
|
|
|
|
|
|
|
|
async def abandon_messages_after(self, trace_id: str, cutoff_sequence: int) -> List[str]:
|
|
async def abandon_messages_after(self, trace_id: str, cutoff_sequence: int) -> List[str]:
|
|
|
"""
|
|
"""
|
|
@@ -600,7 +600,7 @@ class FileSystemTraceStore:
|
|
|
|
|
|
|
|
# 读取现有数据
|
|
# 读取现有数据
|
|
|
if usage_file.exists():
|
|
if usage_file.exists():
|
|
|
- data = json.loads(usage_file.read_text())
|
|
|
|
|
|
|
+ data = json.loads(usage_file.read_text(encoding="utf-8"))
|
|
|
else:
|
|
else:
|
|
|
data = {
|
|
data = {
|
|
|
"summary": {
|
|
"summary": {
|
|
@@ -666,7 +666,7 @@ class FileSystemTraceStore:
|
|
|
data["timeline"].append(timeline_entry)
|
|
data["timeline"].append(timeline_entry)
|
|
|
|
|
|
|
|
# 写回文件
|
|
# 写回文件
|
|
|
- usage_file.write_text(json.dumps(data, indent=2, ensure_ascii=False))
|
|
|
|
|
|
|
+ usage_file.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
|
|
|
|
|
|
# ===== 事件流操作(用于 WebSocket 断线续传)=====
|
|
# ===== 事件流操作(用于 WebSocket 断线续传)=====
|
|
|
|
|
|