# 会话存储 — 任务拆解 ## 切片 1:Flyway 迁移脚本 **文件**: `src/main/resources/db/migration/V005__create_session_storage.sql` **内容**:创建 diagnosis_session、agent_step、tool_invocation 三张表 **验收标准**: - [x] 三张表均通过 Flyway 创建成功 - [x] 字段类型、索引、JSON 列定义正确 - [x] 回滚脚本可选(不做强制要求) --- ## 切片 2:JPA 实体类 **文件**: - `src/main/java/com/superbiz/agent/domain/entity/DiagnosisSession.java` - `src/main/java/com/superbiz/agent/domain/entity/AgentStep.java` - `src/main/java/com/superbiz/agent/domain/entity/ToolInvocation.java` **内容**:三个 Entity,使用 @JdbcTypeCode(SqlTypes.JSON) 映射 JSON 列 **验收标准**: - [x] 编译通过,无 JPA 映射错误 - [x] Entity 字段与 DDL 对齐 - [x] Lombok 注解完整 --- ## 切片 3:JPA Repository **文件**: - `src/main/java/com/superbiz/agent/repository/DiagnosisSessionRepository.java` - `src/main/java/com/superbiz/agent/repository/AgentStepRepository.java` - `src/main/java/com/superbiz/agent/repository/ToolInvocationRepository.java` **内容**:三个 Repository,含自定义查询方法 **验收标准**: - [x] 编译通过 - [x] 自定义方法命名正确 - [x] 可在 Spring 中自动注入 --- ## 切片 4:SessionContextHolder 工具类 **文件**: `src/main/java/com/superbiz/agent/util/SessionContextHolder.java` **内容**:基于 ThreadLocal 的 sessionId 传递工具 ```java public class SessionContextHolder { private static final ThreadLocal SESSION_ID = new ThreadLocal<>(); public static void setSessionId(String sessionId) { SESSION_ID.set(sessionId); } public static String getSessionId() { return SESSION_ID.get(); } public static void clear() { SESSION_ID.remove(); } } ``` **验收标准**: - [x] 编译通过 - [x] set/get/clear 在同一线程内正常工作 --- ## 切片 5:AgentLoggingHook 改造为 Spring Bean **文件**: `src/main/java/com/superbiz/agent/hook/AgentLoggingHook.java` **内容**: - 加 @Component 注解 - 构造注入 AgentStepRepository - beforeModel 创建 agent_step - afterModel 更新 agent_step - 从 RunnableConfig 读取 sessionId **验收标准**: - [x] 编译通过 - [x] beforeModel 写入 agent_step 到 DB - [x] afterModel 更新正确行 - [x] 原日志行为不变 --- ## 切片 6:ChatService 集成 **文件**: `src/main/java/com/superbiz/agent/service/ChatService.java` **内容**: - 注入 DiagnosisSessionRepository - executeChat 前后创建/更新 diagnosis_session - 通过 RunnableConfig 传递 sessionId **验收标准**: - [x] 每次 executeChat 产生一条 diagnosis_session 记录 - [x] sessionId 可被 Hook 读取 - [x] status、duration 等汇总指标正确 --- ## 切片 7:AiOpsService 集成 **文件**: `src/main/java/com/superbiz/agent/service/AiOpsService.java` **内容**: - 注入 DiagnosisSessionRepository 和 AgentLoggingHook - executeAiOpsAnalysis 前后创建/更新 diagnosis_session - Planner 和 Executor 各加 AgentLoggingHook - Supervisor 不加 Hook **验收标准**: - [x] 每次 executeAiOpsAnalysis 产生一条 diagnosis_session 记录 - [x] Planner 执行产生 agent_step 记录 - [x] Executor 执行产生 agent_step 记录 - [x] Supervisor 不产生 agent_step 记录 --- ## 切片 8:LookupKnowledgeTool 集成 **文件**: `src/main/java/com/superbiz/agent/tool/LookupKnowledgeTool.java` **内容**: - 注入 ToolInvocationRepository - 执行后写入 tool_invocation 记录 - 记录 L0/L1 检索质量 **验收标准**: - [x] 每次 lookup_knowledge 调用写入一条 tool_invocation - [x] retrieval_layer / l0_match_count 等字段正确 - [x] 异常场景 success=false --- ## 切片 9:测试 **文件**: - `src/test/java/com/superbiz/agent/repository/DiagnosisSessionRepositoryTest.java` - `src/test/java/com/superbiz/agent/repository/AgentStepRepositoryTest.java` - `src/test/java/com/superbiz/agent/repository/ToolInvocationRepositoryTest.java` **内容**: - Repository 单元测试(CRUD + 自定义查询) - 集成测试需要运行环境(后续补充) **验收标准**: - [x] Repository 测试通过