diff --git a/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java b/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java index 4e93de6..54431ee 100644 --- a/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java +++ b/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java @@ -8,6 +8,7 @@ import com.bruce.agent.dto.response.AgentDefinitionResponse; import com.bruce.agent.service.IAgentDefinitionService; import com.bruce.common.domain.model.RequestResult; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +@Slf4j @RestController @RequestMapping("/api/agents") @RequiredArgsConstructor @@ -55,4 +57,15 @@ public class AgentDefinitionController { @RequestBody AgentChatRequest request) { return RequestResult.success(agentDefinitionService.chat(agentId, request)); } + + /** + * 兼容前端实现文档中的运行入口路径。 + */ + @PostMapping("/{agentId}/runs") + public RequestResult run(@PathVariable("agentId") Long agentId, + @RequestBody AgentChatRequest request) { + log.info("Agent运行入口开始,agentId={}, messageCount={}", + agentId, request.getMessages() == null ? 0 : request.getMessages().size()); + return RequestResult.success(agentDefinitionService.chat(agentId, request)); + } } diff --git a/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentSessionController.java b/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentSessionController.java index 2111fcf..37125d7 100644 --- a/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentSessionController.java +++ b/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentSessionController.java @@ -48,6 +48,24 @@ public class AgentSessionController { return RequestResult.success(agentSessionService.getDetailById(id)); } + /** + * 兼容前端实现文档中的资源化会话详情路径。 + */ + @GetMapping("/{sessionId}") + public RequestResult detailByPath(@PathVariable("sessionId") Long sessionId) { + log.info("Agent会话详情按路径查询开始,sessionId={}", sessionId); + return RequestResult.success(agentSessionService.getDetailById(sessionId)); + } + + /** + * 兼容前端实现文档中的 Agent 会话列表路径。 + */ + @GetMapping("/agents/{agentId}/sessions") + public RequestResult> sessionsByAgent(@PathVariable("agentId") Long agentId) { + log.info("Agent会话列表查询开始,agentId={}", agentId); + return RequestResult.success(agentSessionService.listByAgentId(agentId)); + } + @GetMapping("/{sessionId}/messages") public RequestResult> messages(@PathVariable("sessionId") Long sessionId) { log.info("Agent消息列表查询开始,sessionId={}", sessionId); diff --git a/common-agent-agent/src/test/java/com/bruce/agent/controller/AgentCompatControllerTests.java b/common-agent-agent/src/test/java/com/bruce/agent/controller/AgentCompatControllerTests.java new file mode 100644 index 0000000..2afe8fb --- /dev/null +++ b/common-agent-agent/src/test/java/com/bruce/agent/controller/AgentCompatControllerTests.java @@ -0,0 +1,121 @@ +package com.bruce.agent.controller; + +import com.bruce.agent.dto.response.AgentChatResponse; +import com.bruce.agent.service.IAgentDefinitionService; +import com.bruce.agent.service.IAgentMessageService; +import com.bruce.agent.service.IAgentSessionService; +import com.bruce.agent.service.IAgentWorkspaceService; +import com.bruce.agent.vo.AgentSessionDetailVO; +import com.bruce.common.handler.GlobalExceptionHandler; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * 验证 Agent 文档草案兼容路径。 + */ +@ExtendWith(MockitoExtension.class) +class AgentCompatControllerTests { + + private MockMvc mockMvc; + + @Mock + private IAgentDefinitionService agentDefinitionService; + + @Mock + private IAgentSessionService agentSessionService; + + @Mock + private IAgentMessageService agentMessageService; + + @Mock + private IAgentWorkspaceService agentWorkspaceService; + + @InjectMocks + private AgentDefinitionController agentDefinitionController; + + @InjectMocks + private AgentSessionController agentSessionController; + + @BeforeEach + void setUp() { + mockMvc = MockMvcBuilders.standaloneSetup(agentDefinitionController, agentSessionController) + .setControllerAdvice(new GlobalExceptionHandler()) + .build(); + } + + @Test + void agentRunCompatShouldReturnChatResponse() throws Exception { + AgentChatResponse response = new AgentChatResponse(); + response.setAgentId(1001L); + response.setAgentCode("presale_agent"); + response.setAnswer("这是兼容运行入口返回的答案"); + response.setModelRequestId("req-1001"); + + when(agentDefinitionService.chat(org.mockito.ArgumentMatchers.eq(1001L), any())).thenReturn(response); + + mockMvc.perform(post("/api/agents/1001/runs") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "messages": [ + { + "role": "user", + "content": "请总结合同重点" + } + ], + "ragEnabled": true + } + """)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.resultcode").value("0")) + .andExpect(jsonPath("$.data.agentCode").value("presale_agent")) + .andExpect(jsonPath("$.data.modelRequestId").value("req-1001")); + } + + @Test + void sessionsCompatShouldReturnStructuredSessionList() throws Exception { + AgentSessionDetailVO session = new AgentSessionDetailVO(); + session.setId(2001L); + session.setAgentId(1001L); + session.setSessionCode("session_001"); + session.setStatus("ACTIVE"); + + when(agentSessionService.listByAgentId(1001L)).thenReturn(List.of(session)); + + mockMvc.perform(get("/api/agent-sessions/agents/1001/sessions")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.resultcode").value("0")) + .andExpect(jsonPath("$.data[0].sessionCode").value("session_001")); + } + + @Test + void sessionDetailCompatShouldReturnStructuredDetail() throws Exception { + AgentSessionDetailVO session = new AgentSessionDetailVO(); + session.setId(2001L); + session.setSessionCode("session_001"); + session.setStatus("ACTIVE"); + + when(agentSessionService.getDetailById(2001L)).thenReturn(session); + + mockMvc.perform(get("/api/agent-sessions/2001")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.resultcode").value("0")) + .andExpect(jsonPath("$.data.sessionCode").value("session_001")); + } +} diff --git a/common-agent-mcp/src/main/java/com/bruce/mcp/controller/McpImportController.java b/common-agent-mcp/src/main/java/com/bruce/mcp/controller/McpImportController.java index 30f5679..4620355 100644 --- a/common-agent-mcp/src/main/java/com/bruce/mcp/controller/McpImportController.java +++ b/common-agent-mcp/src/main/java/com/bruce/mcp/controller/McpImportController.java @@ -7,8 +7,8 @@ import com.bruce.mcp.service.IMcpCapabilityService; import com.bruce.mcp.service.IMcpImportService; import com.bruce.mcp.service.IMcpServerService; import com.bruce.mcp.service.IMcpWorkspaceService; -import com.bruce.mcp.vo.McpCapabilityVO; import com.bruce.mcp.vo.McpServerVO; +import com.bruce.mcp.vo.McpCapabilityVO; import com.bruce.mcp.vo.McpWorkspaceVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,6 +50,15 @@ public class McpImportController { return RequestResult.success(mcpServerService.listServers()); } + /** + * 兼容前端实现文档中的 query 路径。 + */ + @PostMapping("/servers/query") + public RequestResult> queryServers() { + log.info("MCP服务列表兼容查询开始"); + return RequestResult.success(mcpServerService.listServers()); + } + @GetMapping("/servers/{serverId}/capabilities") public RequestResult> listCapabilities(@PathVariable("serverId") Long serverId) { log.info("MCP能力列表查询开始,serverId={}", serverId); diff --git a/common-agent-mcp/src/test/java/com/bruce/mcp/controller/McpImportControllerTests.java b/common-agent-mcp/src/test/java/com/bruce/mcp/controller/McpImportControllerTests.java index b859741..cc605f4 100644 --- a/common-agent-mcp/src/test/java/com/bruce/mcp/controller/McpImportControllerTests.java +++ b/common-agent-mcp/src/test/java/com/bruce/mcp/controller/McpImportControllerTests.java @@ -5,6 +5,7 @@ import com.bruce.mcp.service.IMcpCapabilityService; import com.bruce.mcp.service.IMcpImportService; import com.bruce.mcp.service.IMcpServerService; import com.bruce.mcp.service.IMcpWorkspaceService; +import com.bruce.mcp.vo.McpServerVO; import com.bruce.mcp.vo.McpWorkspaceVO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -68,4 +70,19 @@ class McpImportControllerTests { .andExpect(jsonPath("$.data.serverCode").value("jira_server")) .andExpect(jsonPath("$.data.healthStatus").value("HEALTHY")); } + + @Test + void queryServersCompatShouldReturnStructuredServerList() throws Exception { + McpServerVO server = new McpServerVO(); + server.setId(301L); + server.setServerCode("jira_server"); + server.setServerName("Jira 服务"); + + when(mcpServerService.listServers()).thenReturn(java.util.List.of(server)); + + mockMvc.perform(post("/api/mcp/servers/query")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.resultcode").value("0")) + .andExpect(jsonPath("$.data[0].serverCode").value("jira_server")); + } } diff --git a/common-agent-skill/src/main/java/com/bruce/skill/controller/SkillWorkspaceController.java b/common-agent-skill/src/main/java/com/bruce/skill/controller/SkillWorkspaceController.java index 98ce2ac..fbab54b 100644 --- a/common-agent-skill/src/main/java/com/bruce/skill/controller/SkillWorkspaceController.java +++ b/common-agent-skill/src/main/java/com/bruce/skill/controller/SkillWorkspaceController.java @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -41,6 +42,16 @@ public class SkillWorkspaceController { return RequestResult.success(skillVersionService.saveDraft(skillCode, request)); } + /** + * 兼容前端实现文档中的 PUT 草稿保存路径。 + */ + @PutMapping("/{skillCode}/draft") + public RequestResult saveDraftCompat(@PathVariable("skillCode") String skillCode, + @RequestBody SkillVersionSaveDTO request) { + log.info("Skill草稿兼容保存开始,skillCode={}, versionNo={}", skillCode, request.getVersionNo()); + return RequestResult.success(skillVersionService.saveDraft(skillCode, request)); + } + @PostMapping("/{skillCode}/test") public RequestResult test(@PathVariable("skillCode") String skillCode, @RequestBody SkillVersionSaveDTO request) { diff --git a/common-agent-skill/src/test/java/com/bruce/skill/controller/SkillWorkspaceControllerTests.java b/common-agent-skill/src/test/java/com/bruce/skill/controller/SkillWorkspaceControllerTests.java index 9d98723..0c877f6 100644 --- a/common-agent-skill/src/test/java/com/bruce/skill/controller/SkillWorkspaceControllerTests.java +++ b/common-agent-skill/src/test/java/com/bruce/skill/controller/SkillWorkspaceControllerTests.java @@ -1,6 +1,7 @@ package com.bruce.skill.controller; import com.bruce.common.handler.GlobalExceptionHandler; +import com.bruce.skill.dto.SkillVersionSaveDTO; import com.bruce.skill.service.ISkillVersionService; import com.bruce.skill.service.ISkillWorkspaceService; import com.bruce.skill.vo.SkillWorkspaceVO; @@ -15,6 +16,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -59,4 +61,22 @@ class SkillWorkspaceControllerTests { .andExpect(jsonPath("$.data.skillCode").value("resume_extract")) .andExpect(jsonPath("$.data.status").value("PUBLISHED")); } + + @Test + void saveDraftCompatShouldReturnSuccess() throws Exception { + when(skillVersionService.saveDraft(org.mockito.ArgumentMatchers.eq("resume_extract"), + org.mockito.ArgumentMatchers.any(SkillVersionSaveDTO.class))).thenReturn(true); + + mockMvc.perform(put("/api/skills/resume_extract/draft") + .contentType(org.springframework.http.MediaType.APPLICATION_JSON) + .content(""" + { + "versionNo": 2, + "promptText": "提取候选人经历" + } + """)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.resultcode").value("0")) + .andExpect(jsonPath("$.data").value(true)); + } } diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowDefinitionController.java b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowDefinitionController.java index b68b6d8..61d6af8 100644 --- a/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowDefinitionController.java +++ b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowDefinitionController.java @@ -5,7 +5,9 @@ import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO; import com.bruce.workflow.service.IWorkflowDefinitionService; import com.bruce.workflow.vo.WorkflowDefinitionVO; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +@Slf4j @RestController @RequestMapping("/api/workflows") @RequiredArgsConstructor @@ -33,8 +36,26 @@ public class WorkflowDefinitionController { return RequestResult.success(workflowDefinitionService.getDefinition(id)); } + /** + * 兼容前端实现文档中的 REST 详情路径。 + */ + @GetMapping("/{workflowId}") + public RequestResult detailByPath(@PathVariable("workflowId") Long workflowId) { + log.info("Workflow定义详情查询开始,workflowId={}", workflowId); + return RequestResult.success(workflowDefinitionService.getDefinition(workflowId)); + } + @PostMapping("/definition/save") public RequestResult save(@RequestBody WorkflowDefinitionSaveDTO request) { return RequestResult.success(workflowDefinitionService.saveDefinition(request)); } + + /** + * 兼容前端实现文档中的草稿保存路径。 + */ + @PostMapping("/save-draft") + public RequestResult saveDraft(@RequestBody WorkflowDefinitionSaveDTO request) { + log.info("Workflow草稿保存开始,workflowId={}, workflowCode={}", request.getId(), request.getWorkflowCode()); + return RequestResult.success(workflowDefinitionService.saveDefinition(request)); + } } diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowRunController.java b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowRunController.java index f0bed83..7d7694b 100644 --- a/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowRunController.java +++ b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowRunController.java @@ -5,6 +5,7 @@ import com.bruce.workflow.dto.WorkflowRunCreateDTO; import com.bruce.workflow.service.IWorkflowRunService; import com.bruce.workflow.vo.WorkflowRunVO; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +@Slf4j @RestController @RequestMapping("/api/workflow-runs") @RequiredArgsConstructor @@ -30,4 +32,25 @@ public class WorkflowRunController { public RequestResult> list(@PathVariable("workflowId") Long workflowId) { return RequestResult.success(workflowRunService.listRecentByWorkflowId(workflowId)); } + + /** + * 兼容前端实现文档中的资源化运行创建路径。 + */ + @PostMapping("/compat/workflows/{workflowId}/runs") + public RequestResult createCompat(@PathVariable("workflowId") Long workflowId, + @RequestBody WorkflowRunCreateDTO request) { + request.setWorkflowId(workflowId); + log.info("Workflow运行创建开始,workflowId={}, versionId={}, requestId={}", + workflowId, request.getWorkflowVersionId(), request.getRequestId()); + return RequestResult.success(workflowRunService.createRun(request)); + } + + /** + * 兼容前端实现文档中的按运行ID查询路径。 + */ + @GetMapping("/compat/workflows/runs/{runId}") + public RequestResult detailCompat(@PathVariable("runId") Long runId) { + log.info("Workflow运行详情查询开始,runId={}", runId); + return RequestResult.success(workflowRunService.getRunById(runId)); + } } diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowVersionController.java b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowVersionController.java index 9de164d..ee766b9 100644 --- a/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowVersionController.java +++ b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowVersionController.java @@ -5,6 +5,7 @@ import com.bruce.workflow.dto.WorkflowVersionSaveDTO; import com.bruce.workflow.service.IWorkflowVersionService; import com.bruce.workflow.vo.WorkflowVersionVO; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +@Slf4j @RestController @RequestMapping("/api/workflow-versions") @RequiredArgsConstructor @@ -30,4 +32,15 @@ public class WorkflowVersionController { public RequestResult publish(@RequestBody WorkflowVersionSaveDTO request) { return RequestResult.success(workflowVersionService.publishVersion(request)); } + + /** + * 兼容前端实现文档中的资源化发布路径。 + */ + @PostMapping("/compat/workflows/{workflowId}/publish") + public RequestResult publishCompat(@PathVariable("workflowId") Long workflowId, + @RequestBody WorkflowVersionSaveDTO request) { + request.setWorkflowId(workflowId); + log.info("Workflow版本发布开始,workflowId={}, versionNo={}", workflowId, request.getVersionNo()); + return RequestResult.success(workflowVersionService.publishVersion(request)); + } } diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowRunService.java b/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowRunService.java index 3c985f4..23e8e41 100644 --- a/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowRunService.java +++ b/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowRunService.java @@ -12,4 +12,6 @@ public interface IWorkflowRunService extends IService { boolean createRun(WorkflowRunCreateDTO request); List listRecentByWorkflowId(Long workflowId); + + WorkflowRunVO getRunById(Long runId); } diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowRunServiceImpl.java b/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowRunServiceImpl.java index 1a1ab3c..60589d2 100644 --- a/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowRunServiceImpl.java +++ b/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowRunServiceImpl.java @@ -52,6 +52,18 @@ public class WorkflowRunServiceImpl extends ServiceImpl