# Lifecycle（生命周期管理）

**模块：** `gateway/core/lifecycle/`

## 文档维护规范

0. **先改文档，再动代码** - 新功能或重大修改需先完成文档更新、并完成审阅后，再进行代码实现
1. **文档分层，链接代码** - 关键实现需标注代码文件路径；格式：`module/file.py:function_name`
2. **简洁快照，日志分离** - 只记录已确认的设计

---

## 模块职责

Agent 生命周期管理，包括：

- **Trace 注册**：调用 Agent 框架创建 Trace
- **Trace 查询**：调用 Agent 框架查询 Trace 信息
- **Workspace 管理**：确保 Workspace 目录存在和清理
- **配置热重载**：监听 Agent 技能配置变化并热重载

**说明：** Trace 元数据由 Agent 框架管理，Gateway 不维护副本

---

## 核心概念

### Trace

基于 Agent Core 架构（详见 `../../../agent/docs/architecture.md`）：

- **Trace = Agent 的执行记录**
- 每个 Trace 有独立的 Workspace
- Trace 数据结构由 Agent Core 定义

### Workspace

- 多个 Trace 可以共享一个 Workspace（主 Agent 和子 Agent）
- 包含 Agent 的配置、记忆、技能等
- 路径格式：`~/.gateway/workspaces/{workspace_id}/`
- 需要引用计数机制，确保清理时无活跃 Trace

---

## 模块结构

```
gateway/core/lifecycle/
├── trace_manager.py      # Trace 注册和元数据管理
├── workspace_manager.py  # Workspace 管理
└── config_watcher.py     # 配置热重载
```

---

## 关键功能

### TraceManager

**实现位置：** `gateway/core/lifecycle/trace_manager.py`

**职责：**
- 调用 Agent 框架创建 Trace
- 查询 Trace 信息
- 管理 Trace 和 Workspace 的关联关系

**核心接口：**

```python
class TraceManager:
    def create_trace(
        self,
        workspace_id: str,
        agent_type: str,  # "personal_assistant" | "digital_employee"
        metadata: dict = None
    ) -> str:
        """创建新 Trace，返回 trace_id"""
        pass

    def get_trace(self, trace_id: str) -> dict:
        """查询 Trace 信息（调用 Agent 框架）"""
        pass

    def list_traces(
        self,
        workspace_id: str = None,
        agent_type: str = None
    ) -> list[dict]:
        """查询 Trace 列表"""
        pass

    def get_workspace_id(self, trace_id: str) -> str:
        """获取 Trace 对应的 workspace_id"""
        pass
```

### WorkspaceManager

**实现位置：** `gateway/core/lifecycle/workspace_manager.py`

**职责：**
- 创建和初始化 Workspace 目录
- 管理 Workspace 引用计数
- 清理无活跃 Trace 的 Workspace

**核心接口：**

```python
class WorkspaceManager:
    def create_workspace(self, workspace_id: str) -> str:
        """创建 Workspace 目录，返回路径"""
        pass

    def get_workspace_path(self, workspace_id: str) -> str:
        """获取 Workspace 路径"""
        pass

    def add_trace_ref(self, workspace_id: str, trace_id: str):
        """增加 Trace 引用"""
        pass

    def remove_trace_ref(self, workspace_id: str, trace_id: str):
        """移除 Trace 引用"""
        pass

    def cleanup_workspace(self, workspace_id: str, force: bool = False):
        """清理 Workspace（检查引用计数，force=True 强制清理）"""
        pass

    def list_workspaces(self) -> list[dict]:
        """列出所有 Workspace 及其引用计数"""
        pass
```

### ConfigWatcher

**实现位置：** `gateway/core/lifecycle/config_watcher.py`

**职责：**
- 监听 Agent 技能配置文件变化
- 触发热重载回调
- 不影响正在运行的 Trace

**核心接口：**

```python
class ConfigWatcher:
    def watch(self, workspace_id: str, callback: callable):
        """监听指定 Workspace 的配置变化"""
        pass

    def stop_watch(self, workspace_id: str):
        """停止监听"""
        pass
```

---

## 典型流程

### 个人助理型 Agent 首次对话

1. 用户通过飞书发送消息
2. Routing 模块收到消息，查询是否有对应 Trace
3. 无 Trace → 调用 `TraceManager.create_trace(workspace_id=user_id, agent_type="personal_assistant")`
4. TraceManager 调用 Agent 框架创建 Trace，返回 trace_id
5. 调用 `WorkspaceManager.create_workspace(workspace_id=user_id)`（如果不存在）
6. 调用 `WorkspaceManager.add_trace_ref(workspace_id=user_id, trace_id=trace_id)`
7. 开始对话

### 数字员工型 Agent 串行处理

1. 用户 A 发送消息
2. Routing 模块查询数字员工的 Trace（共享 workspace_id）
3. 如果无 Trace → 创建（同上）
4. 如果有 Trace 且正在处理 → 消息进入队列
5. 当前对话结束 → 从队列取下一条消息

### 主 Agent 调用子 Agent

1. 主 Agent 执行过程中需要调用子 Agent
2. 调用 `TraceManager.create_trace(workspace_id=主Agent的workspace_id, agent_type=...)`
3. 子 Trace 共享主 Trace 的 Workspace
4. 调用 `WorkspaceManager.add_trace_ref(workspace_id, 子trace_id)`
5. 子 Agent 执行完成 → `WorkspaceManager.remove_trace_ref(...)`

### Workspace 清理

1. Trace 结束时调用 `WorkspaceManager.remove_trace_ref(...)`
2. WorkspaceManager 检查引用计数
3. 引用计数为 0 → 可以清理（可选延迟清理策略）
4. 删除 Workspace 目录

---

## 错误处理

### Trace 创建失败

- Agent 框架返回错误 → 向用户返回友好错误信息
- Workspace 创建失败 → 清理已创建的 Trace，返回错误

### Workspace 引用计数不一致

- 定期检查 Workspace 引用计数和实际 Trace 状态
- 发现不一致 → 记录日志，修正引用计数

### 配置热重载失败

- 配置文件格式错误 → 记录日志，保持旧配置
- 不影响正在运行的 Trace

### 并发安全

- TraceManager 和 WorkspaceManager 的关键操作需要加锁
- 避免多个请求同时创建相同 workspace_id 的 Workspace

---

## 相关文档

- [需求规划](../requirements.md)：生命周期管理需求
- [架构设计](../architecture.md)：模块在整体架构中的位置
- [Agent Core 架构](../../../agent/docs/architecture.md)：Trace 数据结构定义
