Files
openclaw-monitor/code/backend/api/views.py
flying-hero 2dc130df9d fix: 修复工作记忆隔离 BUG
🐛 问题发现:
- lobster_memory_dates 和 lobster_memory_detail API
- 定义了 lobster_map 但没有使用
- 所有龙虾都读取 flying-hero/memory/
- 没有真正实现工作记忆隔离

 修复内容:
1. 更新 API 从数据库读取工作记忆
   - lobster_memory_dates: 从 LobsterDiary 查询
   - lobster_memory_detail: 从 LobsterDiary 查询
   - 根据 lobster_id 过滤,实现隔离

2. 更新 Lobster 模型的 workspace 字段
   - 飞行侠: flying-hero
   - 道童: daotong
   - 墨子: coder
   - 织网者: web
   - 费曼: physics
   - 守望者: watcher
   - 白泽: secretary
   - 谛听: ditin

3. 创建各龙虾的工作区目录
   - /home/node/.openclaw/workspace/{lobster_name}/memory/
   - 8 个龙虾都有独立的 memory 目录

4. 创建初始工作记忆文件
   - 道童、墨子、白泽、谛听
   - 每个龙虾有自己的工作计划

🎯 现在的工作记忆:
- 从数据库读取 (LobsterDiary, category='memory')
- 每个龙虾独立存储
- 完全隔离

🔧 为未来扩展做好准备:
- 可以在各自工作区记录日常工作
- 支持导入到数据库
- 支持 RAG 检索
2026-04-03 18:07:13 +08:00

157 lines
4.9 KiB
Python

"""
API views for lobster monitoring.
"""
from rest_framework.decorators import api_view
from rest_framework.response import Response
from datetime import datetime
import os
from pathlib import Path
import re
from lobsters.models import Lobster, LobsterDiary
@api_view(['GET'])
def lobster_list(request):
"""获取所有龙虾状态"""
lobsters = Lobster.objects.all()
result = []
for lobster in lobsters:
result.append({
'id': lobster.id,
'name': lobster.name,
'emoji': lobster.emoji,
'port': lobster.port,
'specialty': lobster.specialty,
'container': lobster.container,
'app_name': lobster.app_name,
'app_id': lobster.app_id,
'status': 'healthy',
'last_check': datetime.now().isoformat()
})
return Response(result)
@api_view(['GET'])
def lobster_detail(request, lobster_id):
"""获取单个龙虾详情"""
try:
lobster = Lobster.objects.get(id=lobster_id)
return Response({
'id': lobster.id,
'name': lobster.name,
'emoji': lobster.emoji,
'port': lobster.port,
'specialty': lobster.specialty,
'container': lobster.container,
'app_name': lobster.app_name,
'app_id': lobster.app_id,
'status': 'healthy',
'workspace': f'/home/node/.openclaw/workspace/{lobster.name.lower()}',
'last_check': datetime.now().isoformat()
})
except Lobster.DoesNotExist:
return Response({'error': '龙虾不存在'}, status=404)
@api_view(['GET'])
def lobster_memory(request, lobster_id):
"""获取龙虾记忆"""
# 这里简化处理,实际应该读取文件
return Response({
'lobster_id': lobster_id,
'memory': '# 长期记忆\n\n记忆内容加载中...',
'daily_memories': []
})
@api_view(['GET'])
def tools_list(request):
"""获取工具列表"""
tools = [
{
'name': 'Git 版本控制',
'status': 'running',
'description': '代码版本管理服务',
'url': 'https://xjp.datalibstar.com/flying-hero/openclaw-monitor.git'
}
]
return Response(tools)
@api_view(['GET'])
def lobster_memory_dates(request, lobster_id):
"""获取龙虾有工作记忆的日期列表 - 从数据库读取"""
try:
lobster = Lobster.objects.get(id=lobster_id)
except Lobster.DoesNotExist:
return Response({'error': '龙虾不存在'}, status=404)
# 从数据库查询工作记忆
diaries = LobsterDiary.objects.filter(
lobster=lobster,
category='memory'
).values_list('date', flat=True).distinct()
dates = [str(date) for date in sorted(diaries, reverse=True)]
return Response({'dates': dates})
@api_view(['GET'])
def lobster_memory_detail(request, lobster_id, date):
"""获取指定日期的工作记忆内容 - 从数据库读取"""
try:
lobster = Lobster.objects.get(id=lobster_id)
except Lobster.DoesNotExist:
return Response({'error': '龙虾不存在'}, status=404)
# 从数据库查询工作记忆
try:
diary = LobsterDiary.objects.get(
lobster=lobster,
date=date,
category='memory'
)
return Response({
'date': str(diary.date),
'content': diary.content,
'title': diary.title,
'tags': diary.tags,
})
except LobsterDiary.DoesNotExist:
return Response({'error': '该日期没有工作记忆'}, status=404)
@api_view(['GET'])
def lobster_diary_dates(request, lobster_id):
"""获取龙虾有日记(成才之路)的日期列表 - 从数据库读取"""
try:
lobster = Lobster.objects.get(id=lobster_id)
except Lobster.DoesNotExist:
return Response({'error': '龙虾不存在'}, status=404)
# 从数据库查询日记日期
diaries = LobsterDiary.objects.filter(
lobster=lobster,
category='chengcai'
).values_list('date', flat=True).distinct()
dates = [str(date) for date in sorted(diaries, reverse=True)]
return Response({'dates': dates})
@api_view(['GET'])
def lobster_diary_detail(request, lobster_id, date):
"""获取指定日期的日记内容(成才之路) - 从数据库读取"""
try:
lobster = Lobster.objects.get(id=lobster_id)
except Lobster.DoesNotExist:
return Response({'error': '龙虾不存在'}, status=404)
# 从数据库查询日记
try:
diary = LobsterDiary.objects.get(
lobster=lobster,
date=date,
category='chengcai'
)
return Response({
'date': str(diary.date),
'content': diary.content,
'title': diary.title,
'tags': diary.tags,
})
except LobsterDiary.DoesNotExist:
return Response({'error': '该日期没有日记'}, status=404)