Coverage for workspace.py: 27%
22 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-29 02:55 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-29 02:55 +0800
1"""
2工作空间模块
4每个 agent 有独立的工作空间,所有路径都从这里派生,不在各模块中硬编码。
6目录结构:
7 ~/.qrclaw/agents/<agent_id>/
8 ├── sessions/ 会话文件
9 ├── logs/ 日志文件
10 ├── skills/ 技能
11 ├── MEMORY.md 中期记忆
12 ├── HEARTBEAT.md 心跳任务配置
13 └── sub-agents/ 子 agent 工作空间
14 └── <sub_id>/
15 ├── sessions/
16 ├── logs/
17 ├── skills/
18 └── MEMORY.md
19"""
20from pathlib import Path
22# 所有 agent 的根目录
23AGENTS_ROOT = Path.home() / ".qrclaw" / "agents"
26class Workspace:
27 """agent 工作空间,持有该 agent 所有资源的路径。"""
29 def __init__(self, agent_id: str = "default", _root: Path = None):
30 self.agent_id = agent_id
31 # _root 由 sub_agent() 传入,支持嵌套路径
32 self.root = _root or (AGENTS_ROOT / agent_id)
34 # 各子目录/文件路径
35 self.sessions_dir = self.root / "sessions"
36 self.logs_dir = self.root / "logs"
37 self.skills_dir = self.root / "skills"
38 self.memory_file = self.root / "MEMORY.md"
39 self.heartbeat_file = self.root / "HEARTBEAT.md"
40 self.sub_agents_dir = self.root / "sub-agents"
42 # 确保目录都存在
43 self.sessions_dir.mkdir(parents=True, exist_ok=True)
44 self.logs_dir.mkdir(parents=True, exist_ok=True)
45 self.skills_dir.mkdir(parents=True, exist_ok=True)
47 def sub_agent(self, sub_id: str) -> "Workspace":
48 """
49 创建子 agent 工作空间,嵌套在当前 agent 下。
51 路径:<当前agent_root>/sub-agents/<sub_id>/
52 """
53 sub_root = self.sub_agents_dir / sub_id
54 return Workspace(agent_id=sub_id, _root=sub_root)
57def list_agents() -> list[str]:
58 """列出所有顶级 agent ID。"""
59 if not AGENTS_ROOT.exists():
60 return []
61 return [d.name for d in sorted(AGENTS_ROOT.iterdir()) if d.is_dir()]