diff --git a/common-agent-agent/pom.xml b/common-agent-agent/pom.xml
new file mode 100644
index 0000000..abdf487
--- /dev/null
+++ b/common-agent-agent/pom.xml
@@ -0,0 +1,60 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-agent
+ common-agent-agent
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ com.bruce
+ common-agent-rag
+ ${project.version}
+
+
+ com.bruce
+ common-agent-modelprovider
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java b/common-agent-agent/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java
similarity index 100%
rename from src/main/java/com/bruce/agent/controller/AgentDefinitionController.java
rename to common-agent-agent/src/main/java/com/bruce/agent/controller/AgentDefinitionController.java
diff --git a/src/main/java/com/bruce/agent/dto/request/AgentChatRequest.java b/common-agent-agent/src/main/java/com/bruce/agent/dto/request/AgentChatRequest.java
similarity index 100%
rename from src/main/java/com/bruce/agent/dto/request/AgentChatRequest.java
rename to common-agent-agent/src/main/java/com/bruce/agent/dto/request/AgentChatRequest.java
diff --git a/src/main/java/com/bruce/agent/dto/request/AgentDefinitionQueryRequest.java b/common-agent-agent/src/main/java/com/bruce/agent/dto/request/AgentDefinitionQueryRequest.java
similarity index 100%
rename from src/main/java/com/bruce/agent/dto/request/AgentDefinitionQueryRequest.java
rename to common-agent-agent/src/main/java/com/bruce/agent/dto/request/AgentDefinitionQueryRequest.java
diff --git a/src/main/java/com/bruce/agent/dto/request/AgentDefinitionSaveRequest.java b/common-agent-agent/src/main/java/com/bruce/agent/dto/request/AgentDefinitionSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/agent/dto/request/AgentDefinitionSaveRequest.java
rename to common-agent-agent/src/main/java/com/bruce/agent/dto/request/AgentDefinitionSaveRequest.java
diff --git a/src/main/java/com/bruce/agent/dto/response/AgentChatResponse.java b/common-agent-agent/src/main/java/com/bruce/agent/dto/response/AgentChatResponse.java
similarity index 100%
rename from src/main/java/com/bruce/agent/dto/response/AgentChatResponse.java
rename to common-agent-agent/src/main/java/com/bruce/agent/dto/response/AgentChatResponse.java
diff --git a/src/main/java/com/bruce/agent/dto/response/AgentDefinitionResponse.java b/common-agent-agent/src/main/java/com/bruce/agent/dto/response/AgentDefinitionResponse.java
similarity index 100%
rename from src/main/java/com/bruce/agent/dto/response/AgentDefinitionResponse.java
rename to common-agent-agent/src/main/java/com/bruce/agent/dto/response/AgentDefinitionResponse.java
diff --git a/src/main/java/com/bruce/agent/entity/AgentDefinition.java b/common-agent-agent/src/main/java/com/bruce/agent/entity/AgentDefinition.java
similarity index 100%
rename from src/main/java/com/bruce/agent/entity/AgentDefinition.java
rename to common-agent-agent/src/main/java/com/bruce/agent/entity/AgentDefinition.java
diff --git a/src/main/java/com/bruce/agent/mapper/AgentDefinitionMapper.java b/common-agent-agent/src/main/java/com/bruce/agent/mapper/AgentDefinitionMapper.java
similarity index 100%
rename from src/main/java/com/bruce/agent/mapper/AgentDefinitionMapper.java
rename to common-agent-agent/src/main/java/com/bruce/agent/mapper/AgentDefinitionMapper.java
diff --git a/src/main/java/com/bruce/agent/service/IAgentDefinitionService.java b/common-agent-agent/src/main/java/com/bruce/agent/service/IAgentDefinitionService.java
similarity index 100%
rename from src/main/java/com/bruce/agent/service/IAgentDefinitionService.java
rename to common-agent-agent/src/main/java/com/bruce/agent/service/IAgentDefinitionService.java
diff --git a/src/main/java/com/bruce/agent/service/impl/AgentDefinitionServiceImpl.java b/common-agent-agent/src/main/java/com/bruce/agent/service/impl/AgentDefinitionServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/agent/service/impl/AgentDefinitionServiceImpl.java
rename to common-agent-agent/src/main/java/com/bruce/agent/service/impl/AgentDefinitionServiceImpl.java
diff --git a/src/test/java/com/bruce/agent/AgentComponentStructureTests.java b/common-agent-agent/src/test/java/com/bruce/agent/AgentComponentStructureTests.java
similarity index 100%
rename from src/test/java/com/bruce/agent/AgentComponentStructureTests.java
rename to common-agent-agent/src/test/java/com/bruce/agent/AgentComponentStructureTests.java
diff --git a/src/test/java/com/bruce/agent/AgentDefinitionServiceImplTests.java b/common-agent-agent/src/test/java/com/bruce/agent/AgentDefinitionServiceImplTests.java
similarity index 100%
rename from src/test/java/com/bruce/agent/AgentDefinitionServiceImplTests.java
rename to common-agent-agent/src/test/java/com/bruce/agent/AgentDefinitionServiceImplTests.java
diff --git a/common-agent-boot/pom.xml b/common-agent-boot/pom.xml
new file mode 100644
index 0000000..096b6a1
--- /dev/null
+++ b/common-agent-boot/pom.xml
@@ -0,0 +1,85 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-boot
+ common-agent-boot
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ com.bruce
+ common-agent-rag
+ ${project.version}
+
+
+ com.bruce
+ common-agent-modelprovider
+ ${project.version}
+
+
+ com.bruce
+ common-agent-agent
+ ${project.version}
+
+
+ com.bruce
+ common-agent-workflow
+ ${project.version}
+
+
+ com.bruce
+ common-agent-mcp
+ ${project.version}
+
+
+ com.bruce
+ common-agent-skill
+ ${project.version}
+
+
+ com.bruce
+ common-agent-observability
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/src/main/java/com/bruce/CommonAgentApplication.java b/common-agent-boot/src/main/java/com/bruce/CommonAgentApplication.java
similarity index 52%
rename from src/main/java/com/bruce/CommonAgentApplication.java
rename to common-agent-boot/src/main/java/com/bruce/CommonAgentApplication.java
index 6dc0943..d877521 100644
--- a/src/main/java/com/bruce/CommonAgentApplication.java
+++ b/common-agent-boot/src/main/java/com/bruce/CommonAgentApplication.java
@@ -1,11 +1,22 @@
package com.bruce;
+import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
+@MapperScan(basePackages = {
+ "com.bruce.common.mapper",
+ "com.bruce.rag.mapper",
+ "com.bruce.modelprovider.mapper",
+ "com.bruce.agent.mapper",
+ "com.bruce.workflow.mapper",
+ "com.bruce.mcp.mapper",
+ "com.bruce.skill.mapper",
+ "com.bruce.observability.mapper"
+})
public class CommonAgentApplication {
public static void main(String[] args) {
diff --git a/src/main/resources/ai-config.ini b/common-agent-boot/src/main/resources/ai-config.ini
similarity index 100%
rename from src/main/resources/ai-config.ini
rename to common-agent-boot/src/main/resources/ai-config.ini
diff --git a/common-agent-boot/src/main/resources/application-dev.yaml b/common-agent-boot/src/main/resources/application-dev.yaml
new file mode 100644
index 0000000..8799d4b
--- /dev/null
+++ b/common-agent-boot/src/main/resources/application-dev.yaml
@@ -0,0 +1,15 @@
+spring:
+ datasource:
+ driver-class-name: org.postgresql.Driver
+ url: jdbc:postgresql://110.42.106.130:5431/common_agent?currentSchema=common_agent
+ username: common_agent
+ password: common_agent
+
+mybatis-plus:
+ mapper-locations: classpath*:/mapper/**/*.xml
+ configuration:
+ map-underscore-to-camel-case: true
+
+common:
+ attachment:
+ base-path: /data/common-agent/attachments
diff --git a/src/main/resources/application-template.yaml b/common-agent-boot/src/main/resources/application-template.yaml
similarity index 100%
rename from src/main/resources/application-template.yaml
rename to common-agent-boot/src/main/resources/application-template.yaml
diff --git a/src/main/resources/application.yaml b/common-agent-boot/src/main/resources/application.yaml
similarity index 100%
rename from src/main/resources/application.yaml
rename to common-agent-boot/src/main/resources/application.yaml
diff --git a/src/test/java/com/bruce/CommonAgentApplicationTests.java b/common-agent-boot/src/test/java/com/bruce/CommonAgentApplicationTests.java
similarity index 100%
rename from src/test/java/com/bruce/CommonAgentApplicationTests.java
rename to common-agent-boot/src/test/java/com/bruce/CommonAgentApplicationTests.java
diff --git a/src/test/java/com/bruce/common/config/EntityAuditMetaObjectHandlerTests.java b/common-agent-boot/src/test/java/com/bruce/integration/config/EntityAuditMetaObjectHandlerTests.java
similarity index 92%
rename from src/test/java/com/bruce/common/config/EntityAuditMetaObjectHandlerTests.java
rename to common-agent-boot/src/test/java/com/bruce/integration/config/EntityAuditMetaObjectHandlerTests.java
index 650774c..1a67aea 100644
--- a/src/test/java/com/bruce/common/config/EntityAuditMetaObjectHandlerTests.java
+++ b/common-agent-boot/src/test/java/com/bruce/integration/config/EntityAuditMetaObjectHandlerTests.java
@@ -1,5 +1,6 @@
-package com.bruce.common.config;
+package com.bruce.integration.config;
+import com.bruce.common.config.EntityAuditMetaObjectHandler;
import com.bruce.rag.entity.RagStore;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.junit.jupiter.api.Test;
diff --git a/src/test/java/com/bruce/common/enumconfig/EnumDefinitionTests.java b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/EnumDefinitionTests.java
similarity index 99%
rename from src/test/java/com/bruce/common/enumconfig/EnumDefinitionTests.java
rename to common-agent-boot/src/test/java/com/bruce/integration/enumconfig/EnumDefinitionTests.java
index 85bd8f7..2445e31 100644
--- a/src/test/java/com/bruce/common/enumconfig/EnumDefinitionTests.java
+++ b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/EnumDefinitionTests.java
@@ -1,4 +1,4 @@
-package com.bruce.common.enumconfig;
+package com.bruce.integration.enumconfig;
import com.bruce.common.enums.CommonStatusEnum;
import com.bruce.common.enums.EnableStatusEnum;
diff --git a/src/test/java/com/bruce/common/enumconfig/SysEnumDataInitTests.java b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDataInitTests.java
similarity index 98%
rename from src/test/java/com/bruce/common/enumconfig/SysEnumDataInitTests.java
rename to common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDataInitTests.java
index a4166d4..1c644e1 100644
--- a/src/test/java/com/bruce/common/enumconfig/SysEnumDataInitTests.java
+++ b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDataInitTests.java
@@ -1,4 +1,4 @@
-package com.bruce.common.enumconfig;
+package com.bruce.integration.enumconfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bruce.common.domain.entity.SysEnum;
diff --git a/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDefinitionSyncSupport.java b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDefinitionSyncSupport.java
new file mode 100644
index 0000000..e60d413
--- /dev/null
+++ b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDefinitionSyncSupport.java
@@ -0,0 +1,90 @@
+package com.bruce.integration.enumconfig;
+
+import com.bruce.common.domain.entity.SysEnum;
+import com.bruce.common.enums.PersistableSysEnumDefinition;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * sys_enum 初始化测试的辅助工具。
+ *
+ * 该类只服务于测试入口,用于把代码里的枚举定义组装成可落库的数据结构,
+ * 并在真正写库前完成组级唯一性校验。
+ */
+final class SysEnumDefinitionSyncSupport {
+
+ private SysEnumDefinitionSyncSupport() {
+ }
+
+ static EnumGroup groupOf(List extends PersistableSysEnumDefinition> definitions) {
+ if (definitions == null || definitions.isEmpty()) {
+ throw new IllegalArgumentException("枚举定义不能为空");
+ }
+ PersistableSysEnumDefinition first = definitions.getFirst();
+ validateGroupMembers(first, definitions);
+ validateUniqueValuesAndSorts(first, definitions);
+ return new EnumGroup(first.getCatalog(), first.getType(), List.copyOf(definitions));
+ }
+
+ static void validateUniqueGroupKeys(List groups) {
+ Set keys = new HashSet<>();
+ for (EnumGroup group : groups) {
+ String key = group.catalog() + "/" + group.type();
+ if (!keys.add(key)) {
+ throw new IllegalArgumentException("存在重复的枚举分组: " + key);
+ }
+ }
+ }
+
+ static List toEntities(EnumGroup group) {
+ return group.definitions().stream()
+ .map(item -> {
+ SysEnum sysEnum = new SysEnum();
+ sysEnum.setCatalog(group.catalog());
+ sysEnum.setType(group.type());
+ sysEnum.setName(item.getName());
+ sysEnum.setValue(item.getValue());
+ sysEnum.setStrvalue(item.getStrvalue());
+ sysEnum.setSort(item.getSort());
+ sysEnum.setRemark(item.getRemark());
+ return sysEnum;
+ })
+ .toList();
+ }
+
+ private static void validateGroupMembers(
+ PersistableSysEnumDefinition first,
+ List extends PersistableSysEnumDefinition> definitions
+ ) {
+ for (PersistableSysEnumDefinition item : definitions) {
+ if (!first.getCatalog().equals(item.getCatalog()) || !first.getType().equals(item.getType())) {
+ throw new IllegalArgumentException("同一枚举组中的 catalog/type 必须一致");
+ }
+ }
+ }
+
+ private static void validateUniqueValuesAndSorts(
+ PersistableSysEnumDefinition first,
+ List extends PersistableSysEnumDefinition> definitions
+ ) {
+ Set values = new HashSet<>();
+ Set sorts = new HashSet<>();
+ for (PersistableSysEnumDefinition item : definitions) {
+ if (!values.add(item.getValue())) {
+ throw new IllegalArgumentException("枚举值重复: " + first.getCatalog() + "/" + first.getType() + "/" + item.getValue());
+ }
+ if (!sorts.add(item.getSort())) {
+ throw new IllegalArgumentException("枚举排序重复: " + first.getCatalog() + "/" + first.getType() + "/" + item.getSort());
+ }
+ }
+ }
+
+ record EnumGroup(
+ String catalog,
+ String type,
+ List extends PersistableSysEnumDefinition> definitions
+ ) {
+ }
+}
diff --git a/src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupportTests.java b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDefinitionSyncSupportTests.java
similarity index 98%
rename from src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupportTests.java
rename to common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDefinitionSyncSupportTests.java
index 9da09ec..8905b48 100644
--- a/src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupportTests.java
+++ b/common-agent-boot/src/test/java/com/bruce/integration/enumconfig/SysEnumDefinitionSyncSupportTests.java
@@ -1,4 +1,4 @@
-package com.bruce.common.enumconfig;
+package com.bruce.integration.enumconfig;
import com.bruce.common.domain.entity.SysEnum;
import com.bruce.common.enums.EnableStatusEnum;
diff --git a/common-agent-common/pom.xml b/common-agent-common/pom.xml
new file mode 100644
index 0000000..2c27f6c
--- /dev/null
+++ b/common-agent-common/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-common
+ common-agent-common
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ org.apache.tika
+ tika-core
+
+
+ org.apache.tika
+ tika-parsers-standard-package
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/src/main/java/com/bruce/common/config/AttachmentProperties.java b/common-agent-common/src/main/java/com/bruce/common/config/AttachmentProperties.java
similarity index 100%
rename from src/main/java/com/bruce/common/config/AttachmentProperties.java
rename to common-agent-common/src/main/java/com/bruce/common/config/AttachmentProperties.java
diff --git a/src/main/java/com/bruce/common/config/EntityAuditMetaObjectHandler.java b/common-agent-common/src/main/java/com/bruce/common/config/EntityAuditMetaObjectHandler.java
similarity index 100%
rename from src/main/java/com/bruce/common/config/EntityAuditMetaObjectHandler.java
rename to common-agent-common/src/main/java/com/bruce/common/config/EntityAuditMetaObjectHandler.java
diff --git a/src/main/java/com/bruce/common/config/MybatisPlusConfig.java b/common-agent-common/src/main/java/com/bruce/common/config/MybatisPlusConfig.java
similarity index 100%
rename from src/main/java/com/bruce/common/config/MybatisPlusConfig.java
rename to common-agent-common/src/main/java/com/bruce/common/config/MybatisPlusConfig.java
diff --git a/src/main/java/com/bruce/common/constant/CommonConsts.java b/common-agent-common/src/main/java/com/bruce/common/constant/CommonConsts.java
similarity index 100%
rename from src/main/java/com/bruce/common/constant/CommonConsts.java
rename to common-agent-common/src/main/java/com/bruce/common/constant/CommonConsts.java
diff --git a/src/main/java/com/bruce/common/controller/SysAttachmentController.java b/common-agent-common/src/main/java/com/bruce/common/controller/SysAttachmentController.java
similarity index 50%
rename from src/main/java/com/bruce/common/controller/SysAttachmentController.java
rename to common-agent-common/src/main/java/com/bruce/common/controller/SysAttachmentController.java
index 6dfd4de..7734f7e 100644
--- a/src/main/java/com/bruce/common/controller/SysAttachmentController.java
+++ b/common-agent-common/src/main/java/com/bruce/common/controller/SysAttachmentController.java
@@ -3,26 +3,39 @@ package com.bruce.common.controller;
import com.bruce.common.domain.model.RequestResult;
import com.bruce.common.dto.request.SysAttachmentUploadRequest;
import com.bruce.common.dto.response.SysAttachmentResponse;
+import com.bruce.common.factory.SysAttachmentFactory;
import com.bruce.common.service.ISysAttachmentService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "系统附件管理")
+@Slf4j
@RestController
@RequestMapping("/api/attachments")
+@RequiredArgsConstructor
public class SysAttachmentController {
- @Autowired
- private ISysAttachmentService sysAttachmentService;
+ private final ISysAttachmentService sysAttachmentService;
+
+ private final SysAttachmentFactory sysAttachmentFactory;
@Operation(summary = "上传附件")
@PostMapping("/upload")
public RequestResult upload(@ModelAttribute SysAttachmentUploadRequest request) {
- return RequestResult.success(SysAttachmentResponse.fromEntity(sysAttachmentService.upload(request)));
+ log.info("上传附件开始,sourceType={}, sourceId={}",
+ request == null ? null : request.getSourceType(),
+ request == null ? null : request.getSourceId());
+ SysAttachmentResponse response = sysAttachmentFactory.toResponse(sysAttachmentService.upload(request));
+ log.info("上传附件结束,attachmentId={}, sourceType={}, sourceId={}",
+ response == null ? null : response.getId(),
+ request == null ? null : request.getSourceType(),
+ request == null ? null : request.getSourceId());
+ return RequestResult.success(response);
}
}
diff --git a/src/main/java/com/bruce/common/controller/SysEnumController.java b/common-agent-common/src/main/java/com/bruce/common/controller/SysEnumController.java
similarity index 100%
rename from src/main/java/com/bruce/common/controller/SysEnumController.java
rename to common-agent-common/src/main/java/com/bruce/common/controller/SysEnumController.java
diff --git a/src/main/java/com/bruce/common/document/parse/DocumentParseContext.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParseContext.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/DocumentParseContext.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParseContext.java
diff --git a/src/main/java/com/bruce/common/document/parse/DocumentParseException.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParseException.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/DocumentParseException.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParseException.java
diff --git a/src/main/java/com/bruce/common/document/parse/DocumentParseResult.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParseResult.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/DocumentParseResult.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParseResult.java
diff --git a/src/main/java/com/bruce/common/document/parse/DocumentParser.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParser.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/DocumentParser.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParser.java
diff --git a/src/main/java/com/bruce/common/document/parse/DocumentParserFactory.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParserFactory.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/DocumentParserFactory.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/DocumentParserFactory.java
diff --git a/src/main/java/com/bruce/common/document/parse/impl/AbstractTikaDocumentParser.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/impl/AbstractTikaDocumentParser.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/impl/AbstractTikaDocumentParser.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/impl/AbstractTikaDocumentParser.java
diff --git a/src/main/java/com/bruce/common/document/parse/impl/ExcelDocumentParser.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/impl/ExcelDocumentParser.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/impl/ExcelDocumentParser.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/impl/ExcelDocumentParser.java
diff --git a/src/main/java/com/bruce/common/document/parse/impl/PdfDocumentParser.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/impl/PdfDocumentParser.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/impl/PdfDocumentParser.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/impl/PdfDocumentParser.java
diff --git a/src/main/java/com/bruce/common/document/parse/impl/TxtDocumentParser.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/impl/TxtDocumentParser.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/impl/TxtDocumentParser.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/impl/TxtDocumentParser.java
diff --git a/src/main/java/com/bruce/common/document/parse/impl/WordDocumentParser.java b/common-agent-common/src/main/java/com/bruce/common/document/parse/impl/WordDocumentParser.java
similarity index 100%
rename from src/main/java/com/bruce/common/document/parse/impl/WordDocumentParser.java
rename to common-agent-common/src/main/java/com/bruce/common/document/parse/impl/WordDocumentParser.java
diff --git a/src/main/java/com/bruce/common/domain/entity/SysAttachment.java b/common-agent-common/src/main/java/com/bruce/common/domain/entity/SysAttachment.java
similarity index 100%
rename from src/main/java/com/bruce/common/domain/entity/SysAttachment.java
rename to common-agent-common/src/main/java/com/bruce/common/domain/entity/SysAttachment.java
diff --git a/src/main/java/com/bruce/common/domain/entity/SysEnum.java b/common-agent-common/src/main/java/com/bruce/common/domain/entity/SysEnum.java
similarity index 100%
rename from src/main/java/com/bruce/common/domain/entity/SysEnum.java
rename to common-agent-common/src/main/java/com/bruce/common/domain/entity/SysEnum.java
diff --git a/src/main/java/com/bruce/common/domain/model/BaseEntity.java b/common-agent-common/src/main/java/com/bruce/common/domain/model/BaseEntity.java
similarity index 100%
rename from src/main/java/com/bruce/common/domain/model/BaseEntity.java
rename to common-agent-common/src/main/java/com/bruce/common/domain/model/BaseEntity.java
diff --git a/src/main/java/com/bruce/common/domain/model/RequestResult.java b/common-agent-common/src/main/java/com/bruce/common/domain/model/RequestResult.java
similarity index 100%
rename from src/main/java/com/bruce/common/domain/model/RequestResult.java
rename to common-agent-common/src/main/java/com/bruce/common/domain/model/RequestResult.java
diff --git a/src/main/java/com/bruce/common/dto/request/SysAttachmentUploadRequest.java b/common-agent-common/src/main/java/com/bruce/common/dto/request/SysAttachmentUploadRequest.java
similarity index 100%
rename from src/main/java/com/bruce/common/dto/request/SysAttachmentUploadRequest.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/request/SysAttachmentUploadRequest.java
diff --git a/src/main/java/com/bruce/common/dto/request/SysEnumBatchSaveRequest.java b/common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumBatchSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/common/dto/request/SysEnumBatchSaveRequest.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumBatchSaveRequest.java
diff --git a/src/main/java/com/bruce/common/dto/request/SysEnumManageQueryRequest.java b/common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumManageQueryRequest.java
similarity index 100%
rename from src/main/java/com/bruce/common/dto/request/SysEnumManageQueryRequest.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumManageQueryRequest.java
diff --git a/src/main/java/com/bruce/common/dto/request/SysEnumQueryRequest.java b/common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumQueryRequest.java
similarity index 100%
rename from src/main/java/com/bruce/common/dto/request/SysEnumQueryRequest.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumQueryRequest.java
diff --git a/src/main/java/com/bruce/common/dto/request/SysEnumSaveRequest.java b/common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/common/dto/request/SysEnumSaveRequest.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/request/SysEnumSaveRequest.java
diff --git a/src/main/java/com/bruce/common/dto/response/SysAttachmentResponse.java b/common-agent-common/src/main/java/com/bruce/common/dto/response/SysAttachmentResponse.java
similarity index 72%
rename from src/main/java/com/bruce/common/dto/response/SysAttachmentResponse.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/response/SysAttachmentResponse.java
index d68b76f..1965a10 100644
--- a/src/main/java/com/bruce/common/dto/response/SysAttachmentResponse.java
+++ b/common-agent-common/src/main/java/com/bruce/common/dto/response/SysAttachmentResponse.java
@@ -1,9 +1,7 @@
package com.bruce.common.dto.response;
-import com.bruce.common.domain.entity.SysAttachment;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
-import org.springframework.beans.BeanUtils;
@Data
@Schema(description = "系统附件响应")
@@ -41,13 +39,4 @@ public class SysAttachmentResponse {
@Schema(description = "备注")
private String remark;
-
- public static SysAttachmentResponse fromEntity(SysAttachment entity) {
- if (entity == null) {
- return null;
- }
- SysAttachmentResponse response = new SysAttachmentResponse();
- BeanUtils.copyProperties(entity, response);
- return response;
- }
}
diff --git a/src/main/java/com/bruce/common/dto/response/SysEnumResponse.java b/common-agent-common/src/main/java/com/bruce/common/dto/response/SysEnumResponse.java
similarity index 66%
rename from src/main/java/com/bruce/common/dto/response/SysEnumResponse.java
rename to common-agent-common/src/main/java/com/bruce/common/dto/response/SysEnumResponse.java
index 78f0c0b..7f5197b 100644
--- a/src/main/java/com/bruce/common/dto/response/SysEnumResponse.java
+++ b/common-agent-common/src/main/java/com/bruce/common/dto/response/SysEnumResponse.java
@@ -1,9 +1,7 @@
package com.bruce.common.dto.response;
-import com.bruce.common.domain.entity.SysEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
-import org.springframework.beans.BeanUtils;
@Data
@Schema(description = "系统枚举响应")
@@ -32,13 +30,4 @@ public class SysEnumResponse {
@Schema(description = "备注")
private String remark;
-
- public static SysEnumResponse fromEntity(SysEnum entity) {
- if (entity == null) {
- return null;
- }
- SysEnumResponse response = new SysEnumResponse();
- BeanUtils.copyProperties(entity, response);
- return response;
- }
}
diff --git a/src/main/java/com/bruce/common/enums/CommonStatusEnum.java b/common-agent-common/src/main/java/com/bruce/common/enums/CommonStatusEnum.java
similarity index 100%
rename from src/main/java/com/bruce/common/enums/CommonStatusEnum.java
rename to common-agent-common/src/main/java/com/bruce/common/enums/CommonStatusEnum.java
diff --git a/src/main/java/com/bruce/common/enums/EnableStatusEnum.java b/common-agent-common/src/main/java/com/bruce/common/enums/EnableStatusEnum.java
similarity index 100%
rename from src/main/java/com/bruce/common/enums/EnableStatusEnum.java
rename to common-agent-common/src/main/java/com/bruce/common/enums/EnableStatusEnum.java
diff --git a/src/main/java/com/bruce/common/enums/PersistableSysEnumDefinition.java b/common-agent-common/src/main/java/com/bruce/common/enums/PersistableSysEnumDefinition.java
similarity index 100%
rename from src/main/java/com/bruce/common/enums/PersistableSysEnumDefinition.java
rename to common-agent-common/src/main/java/com/bruce/common/enums/PersistableSysEnumDefinition.java
diff --git a/common-agent-common/src/main/java/com/bruce/common/factory/SysAttachmentFactory.java b/common-agent-common/src/main/java/com/bruce/common/factory/SysAttachmentFactory.java
new file mode 100644
index 0000000..f6da542
--- /dev/null
+++ b/common-agent-common/src/main/java/com/bruce/common/factory/SysAttachmentFactory.java
@@ -0,0 +1,22 @@
+package com.bruce.common.factory;
+
+import com.bruce.common.domain.entity.SysAttachment;
+import com.bruce.common.dto.response.SysAttachmentResponse;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+/**
+ * 系统附件工厂,集中处理附件元数据出参转换。
+ */
+@Component
+public class SysAttachmentFactory {
+
+ public SysAttachmentResponse toResponse(SysAttachment entity) {
+ if (entity == null) {
+ return null;
+ }
+ SysAttachmentResponse response = new SysAttachmentResponse();
+ BeanUtils.copyProperties(entity, response);
+ return response;
+ }
+}
diff --git a/common-agent-common/src/main/java/com/bruce/common/factory/SysEnumFactory.java b/common-agent-common/src/main/java/com/bruce/common/factory/SysEnumFactory.java
new file mode 100644
index 0000000..2954d26
--- /dev/null
+++ b/common-agent-common/src/main/java/com/bruce/common/factory/SysEnumFactory.java
@@ -0,0 +1,63 @@
+package com.bruce.common.factory;
+
+import com.bruce.common.domain.entity.SysEnum;
+import com.bruce.common.dto.request.SysEnumBatchSaveRequest;
+import com.bruce.common.dto.request.SysEnumSaveRequest;
+import com.bruce.common.dto.response.SysEnumResponse;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 系统枚举工厂,统一负责请求对象、实体对象和响应对象之间的转换。
+ */
+@Component
+public class SysEnumFactory {
+
+ /**
+ * 将保存请求转换为实体,避免在服务层散落字段拷贝逻辑。
+ */
+ public SysEnum toEntity(SysEnumSaveRequest request) {
+ if (request == null) {
+ return null;
+ }
+ SysEnum entity = new SysEnum();
+ BeanUtils.copyProperties(request, entity);
+ return entity;
+ }
+
+ /**
+ * 将批量请求中的单个枚举项转换为实体,catalog/type 由外层分组统一提供。
+ */
+ public SysEnum toEntity(String catalog, String type, SysEnumBatchSaveRequest.Item item) {
+ if (item == null) {
+ return null;
+ }
+ SysEnum entity = new SysEnum();
+ entity.setCatalog(catalog);
+ entity.setType(type);
+ entity.setName(item.getName());
+ entity.setValue(item.getValue());
+ entity.setStrvalue(item.getStrvalue());
+ entity.setSort(item.getSort());
+ entity.setRemark(item.getRemark());
+ return entity;
+ }
+
+ /**
+ * 将实体转换为返回对象,保持接口层不直接暴露实体。
+ */
+ public SysEnumResponse toResponse(SysEnum entity) {
+ if (entity == null) {
+ return null;
+ }
+ SysEnumResponse response = new SysEnumResponse();
+ BeanUtils.copyProperties(entity, response);
+ return response;
+ }
+
+ public List toResponses(List entities) {
+ return entities == null ? List.of() : entities.stream().map(this::toResponse).toList();
+ }
+}
diff --git a/src/main/java/com/bruce/common/handler/GlobalExceptionHandler.java b/common-agent-common/src/main/java/com/bruce/common/handler/GlobalExceptionHandler.java
similarity index 100%
rename from src/main/java/com/bruce/common/handler/GlobalExceptionHandler.java
rename to common-agent-common/src/main/java/com/bruce/common/handler/GlobalExceptionHandler.java
diff --git a/src/main/java/com/bruce/common/mapper/SysAttachmentMapper.java b/common-agent-common/src/main/java/com/bruce/common/mapper/SysAttachmentMapper.java
similarity index 100%
rename from src/main/java/com/bruce/common/mapper/SysAttachmentMapper.java
rename to common-agent-common/src/main/java/com/bruce/common/mapper/SysAttachmentMapper.java
diff --git a/src/main/java/com/bruce/common/mapper/SysEnumMapper.java b/common-agent-common/src/main/java/com/bruce/common/mapper/SysEnumMapper.java
similarity index 100%
rename from src/main/java/com/bruce/common/mapper/SysEnumMapper.java
rename to common-agent-common/src/main/java/com/bruce/common/mapper/SysEnumMapper.java
diff --git a/src/main/java/com/bruce/common/service/ISysAttachmentService.java b/common-agent-common/src/main/java/com/bruce/common/service/ISysAttachmentService.java
similarity index 100%
rename from src/main/java/com/bruce/common/service/ISysAttachmentService.java
rename to common-agent-common/src/main/java/com/bruce/common/service/ISysAttachmentService.java
diff --git a/src/main/java/com/bruce/common/service/ISysEnumService.java b/common-agent-common/src/main/java/com/bruce/common/service/ISysEnumService.java
similarity index 100%
rename from src/main/java/com/bruce/common/service/ISysEnumService.java
rename to common-agent-common/src/main/java/com/bruce/common/service/ISysEnumService.java
diff --git a/src/main/java/com/bruce/common/service/impl/SysAttachmentServiceImpl.java b/common-agent-common/src/main/java/com/bruce/common/service/impl/SysAttachmentServiceImpl.java
similarity index 96%
rename from src/main/java/com/bruce/common/service/impl/SysAttachmentServiceImpl.java
rename to common-agent-common/src/main/java/com/bruce/common/service/impl/SysAttachmentServiceImpl.java
index 407bc6f..829f1fe 100644
--- a/src/main/java/com/bruce/common/service/impl/SysAttachmentServiceImpl.java
+++ b/common-agent-common/src/main/java/com/bruce/common/service/impl/SysAttachmentServiceImpl.java
@@ -28,6 +28,7 @@ public class SysAttachmentServiceImpl extends ServiceImpl implements ISysEnumService {
+ private final SysEnumFactory sysEnumFactory;
+
@Override
public List listByCatalogAndType(SysEnumQueryRequest request) {
log.info("SysEnumServiceImpl.listByCatalogAndType start, request={}", request);
@@ -39,17 +44,19 @@ public class SysEnumServiceImpl extends ServiceImpl impl
@Override
public List listResponses() {
- log.info("SysEnumServiceImpl.listResponses start");
- List responses = toResponses(list());
- log.info("SysEnumServiceImpl.listResponses success, count={}", responses.size());
+ log.info("查询系统枚举列表开始");
+ List responses = sysEnumFactory.toResponses(list());
+ log.info("查询系统枚举列表结束,count={}", responses.size());
return responses;
}
@Override
public List listByCatalogAndTypeResponses(SysEnumQueryRequest request) {
- log.info("SysEnumServiceImpl.listByCatalogAndTypeResponses start");
- List responses = toResponses(listByCatalogAndType(request));
- log.info("SysEnumServiceImpl.listByCatalogAndTypeResponses success, count={}", responses.size());
+ log.info("按模块和类型查询系统枚举开始,catalog={}, type={}",
+ request == null ? null : request.getCatalog(),
+ request == null ? null : request.getType());
+ List responses = sysEnumFactory.toResponses(listByCatalogAndType(request));
+ log.info("按模块和类型查询系统枚举结束,count={}", responses.size());
return responses;
}
@@ -58,7 +65,7 @@ public class SysEnumServiceImpl extends ServiceImpl impl
log.info("SysEnumServiceImpl.listForManagement start, request={}", request);
SysEnumManageQueryRequest queryRequest = request == null ? new SysEnumManageQueryRequest() : request;
String keyword = queryRequest.getKeyword();
- List responses = toResponses(lambdaQuery()
+ List responses = sysEnumFactory.toResponses(lambdaQuery()
.eq(StringUtils.hasText(queryRequest.getCatalog()), SysEnum::getCatalog, queryRequest.getCatalog())
.eq(StringUtils.hasText(queryRequest.getType()), SysEnum::getType, queryRequest.getType())
.and(StringUtils.hasText(keyword), wrapper -> wrapper
@@ -82,37 +89,35 @@ public class SysEnumServiceImpl extends ServiceImpl impl
@Override
public SysEnumResponse getResponseById(Long id) {
- log.info("SysEnumServiceImpl.getResponseById start, id={}", id);
- SysEnumResponse response = SysEnumResponse.fromEntity(getById(id));
- log.info("SysEnumServiceImpl.getResponseById success, id={}, found={}", id, response != null);
+ log.info("查询系统枚举详情开始,id={}", id);
+ SysEnumResponse response = sysEnumFactory.toResponse(getById(id));
+ log.info("查询系统枚举详情结束,id={}, found={}", id, response != null);
return response;
}
@Override
public boolean saveOrUpdate(SysEnumSaveRequest request) {
- log.info("SysEnumServiceImpl.saveOrUpdate start, request={}", request);
+ log.info("保存系统枚举开始,id={}, catalog={}, type={}, value={}",
+ request == null ? null : request.getId(),
+ request == null ? null : request.getCatalog(),
+ request == null ? null : request.getType(),
+ request == null ? null : request.getValue());
if (request == null) {
throw new IllegalArgumentException("保存请求不能为空");
}
- SysEnum sysEnum = new SysEnum();
- sysEnum.setId(request.getId());
- sysEnum.setCatalog(request.getCatalog());
- sysEnum.setType(request.getType());
- sysEnum.setName(request.getName());
- sysEnum.setValue(request.getValue());
- sysEnum.setStrvalue(request.getStrvalue());
- sysEnum.setSort(request.getSort());
- sysEnum.setRemark(request.getRemark());
+ SysEnum sysEnum = sysEnumFactory.toEntity(request);
boolean result = super.saveOrUpdate(sysEnum);
- log.info("SysEnumServiceImpl.saveOrUpdate success, id={}, catalog={}, type={}, value={}, result={}",
+ log.info("保存系统枚举结束,id={}, catalog={}, type={}, value={}, result={}",
request.getId(), request.getCatalog(), request.getType(), request.getValue(), result);
return result;
}
@Override
public boolean batchSave(SysEnumBatchSaveRequest request) {
- log.info("SysEnumServiceImpl.batchSave start, request={}", request);
+ log.info("批量保存系统枚举开始,catalog={}, type={}",
+ request == null ? null : request.getCatalog(),
+ request == null ? null : request.getType());
List existingEnums = lambdaQuery()
.eq(request != null && StringUtils.hasText(request.getCatalog()), SysEnum::getCatalog, request == null ? null : request.getCatalog())
.eq(request != null && StringUtils.hasText(request.getType()), SysEnum::getType, request == null ? null : request.getType())
@@ -120,20 +125,10 @@ public class SysEnumServiceImpl extends ServiceImpl impl
validateBatchSaveRequest(request, existingEnums);
List enums = request.getItems().stream()
- .map(item -> {
- SysEnum sysEnum = new SysEnum();
- sysEnum.setCatalog(request.getCatalog());
- sysEnum.setType(request.getType());
- sysEnum.setName(item.getName());
- sysEnum.setValue(item.getValue());
- sysEnum.setStrvalue(item.getStrvalue());
- sysEnum.setSort(item.getSort());
- sysEnum.setRemark(item.getRemark());
- return sysEnum;
- })
+ .map(item -> sysEnumFactory.toEntity(request.getCatalog(), request.getType(), item))
.toList();
boolean result = saveBatch(enums);
- log.info("SysEnumServiceImpl.batchSave success, catalog={}, type={}, itemCount={}, result={}",
+ log.info("批量保存系统枚举结束,catalog={}, type={}, itemCount={}, result={}",
request.getCatalog(), request.getType(), enums.size(), result);
return result;
}
@@ -240,9 +235,4 @@ public class SysEnumServiceImpl extends ServiceImpl impl
}
}
- private List toResponses(List enums) {
- return enums.stream()
- .map(SysEnumResponse::fromEntity)
- .toList();
- }
}
diff --git a/src/main/java/com/bruce/rag/typehandler/PgJsonbStringTypeHandler.java b/common-agent-common/src/main/java/com/bruce/common/typehandler/PgJsonbStringTypeHandler.java
similarity index 96%
rename from src/main/java/com/bruce/rag/typehandler/PgJsonbStringTypeHandler.java
rename to common-agent-common/src/main/java/com/bruce/common/typehandler/PgJsonbStringTypeHandler.java
index 456be2c..d5ea97d 100644
--- a/src/main/java/com/bruce/rag/typehandler/PgJsonbStringTypeHandler.java
+++ b/common-agent-common/src/main/java/com/bruce/common/typehandler/PgJsonbStringTypeHandler.java
@@ -1,4 +1,4 @@
-package com.bruce.rag.typehandler;
+package com.bruce.common.typehandler;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
diff --git a/src/test/java/com/bruce/common/attachment/SysAttachmentComponentStructureTests.java b/common-agent-common/src/test/java/com/bruce/common/attachment/SysAttachmentComponentStructureTests.java
similarity index 93%
rename from src/test/java/com/bruce/common/attachment/SysAttachmentComponentStructureTests.java
rename to common-agent-common/src/test/java/com/bruce/common/attachment/SysAttachmentComponentStructureTests.java
index 07bfdde..f85fb4a 100644
--- a/src/test/java/com/bruce/common/attachment/SysAttachmentComponentStructureTests.java
+++ b/common-agent-common/src/test/java/com/bruce/common/attachment/SysAttachmentComponentStructureTests.java
@@ -9,6 +9,7 @@ import com.bruce.common.domain.model.RequestResult;
import com.bruce.common.dto.request.SysAttachmentUploadRequest;
import com.bruce.common.domain.entity.SysAttachment;
import com.bruce.common.dto.response.SysAttachmentResponse;
+import com.bruce.common.factory.SysAttachmentFactory;
import com.bruce.common.mapper.SysAttachmentMapper;
import com.bruce.common.service.ISysAttachmentService;
import com.bruce.common.service.impl.SysAttachmentServiceImpl;
@@ -47,7 +48,7 @@ class SysAttachmentComponentStructureTests {
assertEquals(SysAttachment.class, serviceMethod.getReturnType());
assertEquals(RequestResult.class, controllerMethod.getReturnType());
assertTrue(controllerMethod.getGenericReturnType().getTypeName().contains("SysAttachmentResponse"));
- assertEquals(SysAttachmentResponse.class, SysAttachmentResponse.class.getMethod("fromEntity", SysAttachment.class).getReturnType());
+ assertEquals(SysAttachmentResponse.class, SysAttachmentFactory.class.getMethod("toResponse", SysAttachment.class).getReturnType());
}
@Test
diff --git a/src/test/java/com/bruce/common/config/MybatisPlusConfigTests.java b/common-agent-common/src/test/java/com/bruce/common/config/MybatisPlusConfigTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/config/MybatisPlusConfigTests.java
rename to common-agent-common/src/test/java/com/bruce/common/config/MybatisPlusConfigTests.java
diff --git a/src/test/java/com/bruce/common/constant/CommonConstsStructureTests.java b/common-agent-common/src/test/java/com/bruce/common/constant/CommonConstsStructureTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/constant/CommonConstsStructureTests.java
rename to common-agent-common/src/test/java/com/bruce/common/constant/CommonConstsStructureTests.java
diff --git a/src/test/java/com/bruce/common/document/parse/DocumentParserFactoryTests.java b/common-agent-common/src/test/java/com/bruce/common/document/parse/DocumentParserFactoryTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/document/parse/DocumentParserFactoryTests.java
rename to common-agent-common/src/test/java/com/bruce/common/document/parse/DocumentParserFactoryTests.java
diff --git a/src/test/java/com/bruce/common/document/parse/TxtDocumentParserTests.java b/common-agent-common/src/test/java/com/bruce/common/document/parse/TxtDocumentParserTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/document/parse/TxtDocumentParserTests.java
rename to common-agent-common/src/test/java/com/bruce/common/document/parse/TxtDocumentParserTests.java
diff --git a/src/test/java/com/bruce/common/entity/EntityStructureTests.java b/common-agent-common/src/test/java/com/bruce/common/entity/EntityStructureTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/entity/EntityStructureTests.java
rename to common-agent-common/src/test/java/com/bruce/common/entity/EntityStructureTests.java
diff --git a/src/test/java/com/bruce/common/enumconfig/SysEnumBatchSaveValidationTests.java b/common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumBatchSaveValidationTests.java
similarity index 86%
rename from src/test/java/com/bruce/common/enumconfig/SysEnumBatchSaveValidationTests.java
rename to common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumBatchSaveValidationTests.java
index 07d7d8d..ea70b3e 100644
--- a/src/test/java/com/bruce/common/enumconfig/SysEnumBatchSaveValidationTests.java
+++ b/common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumBatchSaveValidationTests.java
@@ -2,6 +2,7 @@ package com.bruce.common.enumconfig;
import com.bruce.common.domain.entity.SysEnum;
import com.bruce.common.dto.request.SysEnumBatchSaveRequest;
+import com.bruce.common.factory.SysEnumFactory;
import com.bruce.common.service.impl.SysEnumServiceImpl;
import org.junit.jupiter.api.Test;
@@ -12,9 +13,11 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
class SysEnumBatchSaveValidationTests {
+ private final SysEnumFactory sysEnumFactory = new SysEnumFactory();
+
@Test
void batchSaveShouldRejectDuplicateValuesInsideRequest() {
- SysEnumServiceImpl service = new SysEnumServiceImpl();
+ SysEnumServiceImpl service = new SysEnumServiceImpl(sysEnumFactory);
SysEnumBatchSaveRequest request = new SysEnumBatchSaveRequest();
request.setCatalog("common");
request.setType("enable_status");
@@ -28,7 +31,7 @@ class SysEnumBatchSaveValidationTests {
@Test
void batchSaveShouldRejectDuplicateValuesFromExistingEnums() {
- SysEnumServiceImpl service = new SysEnumServiceImpl();
+ SysEnumServiceImpl service = new SysEnumServiceImpl(sysEnumFactory);
SysEnum existing = new SysEnum();
existing.setCatalog("common");
existing.setType("enable_status");
@@ -47,7 +50,7 @@ class SysEnumBatchSaveValidationTests {
@Test
void batchSaveShouldAcceptUniqueValues() {
- SysEnumServiceImpl service = new SysEnumServiceImpl();
+ SysEnumServiceImpl service = new SysEnumServiceImpl(sysEnumFactory);
SysEnumBatchSaveRequest request = new SysEnumBatchSaveRequest();
request.setCatalog("common");
request.setType("enable_status");
diff --git a/src/test/java/com/bruce/common/enumconfig/SysEnumComponentStructureTests.java b/common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumComponentStructureTests.java
similarity index 91%
rename from src/test/java/com/bruce/common/enumconfig/SysEnumComponentStructureTests.java
rename to common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumComponentStructureTests.java
index ff55856..fb38d20 100644
--- a/src/test/java/com/bruce/common/enumconfig/SysEnumComponentStructureTests.java
+++ b/common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumComponentStructureTests.java
@@ -11,6 +11,7 @@ import com.bruce.common.dto.request.SysEnumManageQueryRequest;
import com.bruce.common.dto.request.SysEnumQueryRequest;
import com.bruce.common.dto.request.SysEnumSaveRequest;
import com.bruce.common.dto.response.SysEnumResponse;
+import com.bruce.common.factory.SysEnumFactory;
import com.bruce.common.mapper.SysEnumMapper;
import com.bruce.common.service.ISysEnumService;
import com.bruce.common.service.impl.SysEnumServiceImpl;
@@ -89,7 +90,7 @@ class SysEnumComponentStructureTests {
Method manageQueryMethod = SysEnumController.class.getMethod("queryForManagement", SysEnumManageQueryRequest.class);
Method detailMethod = SysEnumController.class.getMethod("getById", Long.class);
Method serviceListMethod = ISysEnumService.class.getMethod("listResponses");
- Method responseFactory = SysEnumResponse.class.getMethod("fromEntity", SysEnum.class);
+ Method responseFactory = SysEnumFactory.class.getMethod("toResponse", SysEnum.class);
assertTrue(serviceListMethod.getGenericReturnType().getTypeName().contains("SysEnumResponse"));
assertTrue(listMethod.getGenericReturnType().getTypeName().contains("SysEnumResponse"));
@@ -99,10 +100,12 @@ class SysEnumComponentStructureTests {
}
@Test
- void sysEnumShouldProvideManualInitTestEntry() throws NoSuchMethodException {
- Method initMethod = SysEnumDataInitTests.class.getMethod("initDefaultEnums");
+ void sysEnumShouldProvideDefinitionSyncSupportEntry() throws NoSuchMethodException {
+ Method groupMethod = SysEnumDefinitionSyncSupport.class.getDeclaredMethod("groupOf", List.class);
+ Method uniqueKeyMethod = SysEnumDefinitionSyncSupport.class.getDeclaredMethod("validateUniqueGroupKeys", List.class);
- assertNotNull(initMethod);
+ assertNotNull(groupMethod);
+ assertNotNull(uniqueKeyMethod);
}
@Test
diff --git a/src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupport.java b/common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupport.java
similarity index 100%
rename from src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupport.java
rename to common-agent-common/src/test/java/com/bruce/common/enumconfig/SysEnumDefinitionSyncSupport.java
diff --git a/common-agent-common/src/test/java/com/bruce/common/factory/SysAttachmentFactoryTests.java b/common-agent-common/src/test/java/com/bruce/common/factory/SysAttachmentFactoryTests.java
new file mode 100644
index 0000000..92963c0
--- /dev/null
+++ b/common-agent-common/src/test/java/com/bruce/common/factory/SysAttachmentFactoryTests.java
@@ -0,0 +1,43 @@
+package com.bruce.common.factory;
+
+import com.bruce.common.domain.entity.SysAttachment;
+import com.bruce.common.dto.response.SysAttachmentResponse;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class SysAttachmentFactoryTests {
+
+ @Test
+ void shouldConvertEntityToResponse() {
+ SysAttachment entity = new SysAttachment();
+ entity.setId(3003L);
+ entity.setSourceType("RAG");
+ entity.setSourceId(1001L);
+ entity.setOriginalName("知识库说明.pdf");
+ entity.setFileName("uuid.pdf");
+ entity.setFileSuffix("pdf");
+ entity.setContentType("application/pdf");
+ entity.setFileSize(1024L);
+ entity.setStorageType("LOCAL");
+ entity.setFilePath("20260601/uuid.pdf");
+ entity.setFileUrl(null);
+ entity.setRemark("上传附件");
+
+ SysAttachmentFactory factory = new SysAttachmentFactory();
+ SysAttachmentResponse response = factory.toResponse(entity);
+
+ assertNotNull(response);
+ assertEquals(3003L, response.getId());
+ assertEquals("RAG", response.getSourceType());
+ assertEquals(1001L, response.getSourceId());
+ assertEquals("知识库说明.pdf", response.getOriginalName());
+ assertEquals("uuid.pdf", response.getFileName());
+ assertEquals("pdf", response.getFileSuffix());
+ assertEquals("application/pdf", response.getContentType());
+ assertEquals(1024L, response.getFileSize());
+ assertEquals("LOCAL", response.getStorageType());
+ assertEquals("上传附件", response.getRemark());
+ }
+}
diff --git a/common-agent-common/src/test/java/com/bruce/common/factory/SysEnumFactoryTests.java b/common-agent-common/src/test/java/com/bruce/common/factory/SysEnumFactoryTests.java
new file mode 100644
index 0000000..1df9c98
--- /dev/null
+++ b/common-agent-common/src/test/java/com/bruce/common/factory/SysEnumFactoryTests.java
@@ -0,0 +1,64 @@
+package com.bruce.common.factory;
+
+import com.bruce.common.domain.entity.SysEnum;
+import com.bruce.common.dto.request.SysEnumSaveRequest;
+import com.bruce.common.dto.response.SysEnumResponse;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class SysEnumFactoryTests {
+
+ @Test
+ void shouldConvertSaveRequestToEntity() {
+ SysEnumSaveRequest request = new SysEnumSaveRequest();
+ request.setId(1001L);
+ request.setCatalog("common");
+ request.setType("enable_status");
+ request.setName("启用");
+ request.setValue(1);
+ request.setStrvalue("ENABLED");
+ request.setSort(1);
+ request.setRemark("启停状态");
+
+ SysEnumFactory factory = new SysEnumFactory();
+ SysEnum entity = factory.toEntity(request);
+
+ assertNotNull(entity);
+ assertEquals(1001L, entity.getId());
+ assertEquals("common", entity.getCatalog());
+ assertEquals("enable_status", entity.getType());
+ assertEquals("启用", entity.getName());
+ assertEquals(1, entity.getValue());
+ assertEquals("ENABLED", entity.getStrvalue());
+ assertEquals(1, entity.getSort());
+ assertEquals("启停状态", entity.getRemark());
+ }
+
+ @Test
+ void shouldConvertEntityToResponse() {
+ SysEnum entity = new SysEnum();
+ entity.setId(2002L);
+ entity.setCatalog("rag");
+ entity.setType("parse_status");
+ entity.setName("已解析");
+ entity.setValue(2);
+ entity.setStrvalue("PARSED");
+ entity.setSort(2);
+ entity.setRemark("解析状态");
+
+ SysEnumFactory factory = new SysEnumFactory();
+ SysEnumResponse response = factory.toResponse(entity);
+
+ assertNotNull(response);
+ assertEquals(2002L, response.getId());
+ assertEquals("rag", response.getCatalog());
+ assertEquals("parse_status", response.getType());
+ assertEquals("已解析", response.getName());
+ assertEquals(2, response.getValue());
+ assertEquals("PARSED", response.getStrvalue());
+ assertEquals(2, response.getSort());
+ assertEquals("解析状态", response.getRemark());
+ }
+}
diff --git a/src/test/java/com/bruce/common/handler/GlobalExceptionHandlerTests.java b/common-agent-common/src/test/java/com/bruce/common/handler/GlobalExceptionHandlerTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/handler/GlobalExceptionHandlerTests.java
rename to common-agent-common/src/test/java/com/bruce/common/handler/GlobalExceptionHandlerTests.java
diff --git a/src/test/java/com/bruce/common/model/RequestResultStructureTests.java b/common-agent-common/src/test/java/com/bruce/common/model/RequestResultStructureTests.java
similarity index 100%
rename from src/test/java/com/bruce/common/model/RequestResultStructureTests.java
rename to common-agent-common/src/test/java/com/bruce/common/model/RequestResultStructureTests.java
diff --git a/common-agent-mcp/pom.xml b/common-agent-mcp/pom.xml
new file mode 100644
index 0000000..aa28a62
--- /dev/null
+++ b/common-agent-mcp/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-mcp
+ common-agent-mcp
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/common-agent-mcp/src/main/java/com/bruce/mcp/entity/McpCapability.java b/common-agent-mcp/src/main/java/com/bruce/mcp/entity/McpCapability.java
new file mode 100644
index 0000000..d0c9407
--- /dev/null
+++ b/common-agent-mcp/src/main/java/com/bruce/mcp/entity/McpCapability.java
@@ -0,0 +1,30 @@
+package com.bruce.mcp.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * MCP 能力实体,对应 mcp_capability 表。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mcp_capability")
+public class McpCapability extends BaseEntity {
+
+ private Long serverId;
+
+ private String capabilityCode;
+
+ private String capabilityName;
+
+ private String capabilityType;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String schemaJson;
+
+ private Boolean enabled;
+}
diff --git a/common-agent-mcp/src/main/java/com/bruce/mcp/entity/McpServer.java b/common-agent-mcp/src/main/java/com/bruce/mcp/entity/McpServer.java
new file mode 100644
index 0000000..cfca33e
--- /dev/null
+++ b/common-agent-mcp/src/main/java/com/bruce/mcp/entity/McpServer.java
@@ -0,0 +1,38 @@
+package com.bruce.mcp.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * MCP 服务实体,对应 mcp_server 表。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mcp_server")
+public class McpServer extends BaseEntity {
+
+ private String serverCode;
+
+ private String serverName;
+
+ private String importType;
+
+ private String endpointUrl;
+
+ private String packageName;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String manifestJson;
+
+ private String authType;
+
+ private String secretRef;
+
+ private String healthStatus;
+
+ private Boolean enabled;
+}
diff --git a/common-agent-mcp/src/main/java/com/bruce/mcp/enums/McpHealthStatusEnum.java b/common-agent-mcp/src/main/java/com/bruce/mcp/enums/McpHealthStatusEnum.java
new file mode 100644
index 0000000..159827b
--- /dev/null
+++ b/common-agent-mcp/src/main/java/com/bruce/mcp/enums/McpHealthStatusEnum.java
@@ -0,0 +1,45 @@
+package com.bruce.mcp.enums;
+
+import com.bruce.common.enums.PersistableSysEnumDefinition;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor
+public enum McpHealthStatusEnum implements PersistableSysEnumDefinition {
+
+ UNKNOWN(1, "未知", "UNKNOWN"),
+ HEALTHY(2, "健康", "HEALTHY"),
+ UNHEALTHY(3, "异常", "UNHEALTHY");
+
+ private final Integer value;
+
+ private final String label;
+
+ private final String strvalue;
+
+ @Override
+ public String getCatalog() {
+ return "mcp";
+ }
+
+ @Override
+ public String getType() {
+ return "health_status";
+ }
+
+ @Override
+ public String getName() {
+ return label;
+ }
+
+ @Override
+ public Integer getSort() {
+ return value;
+ }
+
+ @Override
+ public String getRemark() {
+ return "MCP健康状态";
+ }
+}
diff --git a/common-agent-modelprovider/pom.xml b/common-agent-modelprovider/pom.xml
new file mode 100644
index 0000000..e72bd0e
--- /dev/null
+++ b/common-agent-modelprovider/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-modelprovider
+ common-agent-modelprovider
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/src/main/java/com/bruce/modelprovider/client/OpenAiChatCompletionResult.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiChatCompletionResult.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/client/OpenAiChatCompletionResult.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiChatCompletionResult.java
diff --git a/src/main/java/com/bruce/modelprovider/client/OpenAiChatMessage.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiChatMessage.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/client/OpenAiChatMessage.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiChatMessage.java
diff --git a/src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClient.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClient.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClient.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClient.java
diff --git a/src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClientImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClientImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClientImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/client/OpenAiCompatibleModelClientImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/config/AiConfigFilePropertySourceConfig.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/config/AiConfigFilePropertySourceConfig.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/config/AiConfigFilePropertySourceConfig.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/config/AiConfigFilePropertySourceConfig.java
diff --git a/src/main/java/com/bruce/modelprovider/config/AiSecretProperties.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/config/AiSecretProperties.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/config/AiSecretProperties.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/config/AiSecretProperties.java
diff --git a/src/main/java/com/bruce/modelprovider/controller/ModelCallLogController.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelCallLogController.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/controller/ModelCallLogController.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelCallLogController.java
diff --git a/src/main/java/com/bruce/modelprovider/controller/ModelConfigController.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelConfigController.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/controller/ModelConfigController.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelConfigController.java
diff --git a/src/main/java/com/bruce/modelprovider/controller/ModelProviderController.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelProviderController.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/controller/ModelProviderController.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelProviderController.java
diff --git a/src/main/java/com/bruce/modelprovider/controller/ModelRouteRuleController.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelRouteRuleController.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/controller/ModelRouteRuleController.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/ModelRouteRuleController.java
diff --git a/src/main/java/com/bruce/modelprovider/controller/RagStoreModelConfigController.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/RagStoreModelConfigController.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/controller/RagStoreModelConfigController.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/controller/RagStoreModelConfigController.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/request/ModelCallLogQueryRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelCallLogQueryRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/request/ModelCallLogQueryRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelCallLogQueryRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/request/ModelConfigSaveRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelConfigSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/request/ModelConfigSaveRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelConfigSaveRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/request/ModelProviderSaveRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelProviderSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/request/ModelProviderSaveRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelProviderSaveRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/request/ModelRouteRuleSaveRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelRouteRuleSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/request/ModelRouteRuleSaveRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/ModelRouteRuleSaveRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/request/RagStoreModelConfigSaveRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/RagStoreModelConfigSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/request/RagStoreModelConfigSaveRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/request/RagStoreModelConfigSaveRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/response/ModelCallLogResponse.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelCallLogResponse.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/response/ModelCallLogResponse.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelCallLogResponse.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/response/ModelConfigResponse.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelConfigResponse.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/response/ModelConfigResponse.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelConfigResponse.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/response/ModelProviderResponse.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelProviderResponse.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/response/ModelProviderResponse.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelProviderResponse.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/response/ModelRouteRuleResponse.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelRouteRuleResponse.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/response/ModelRouteRuleResponse.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/ModelRouteRuleResponse.java
diff --git a/src/main/java/com/bruce/modelprovider/dto/response/RagStoreModelConfigResponse.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/RagStoreModelConfigResponse.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/dto/response/RagStoreModelConfigResponse.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/dto/response/RagStoreModelConfigResponse.java
diff --git a/src/main/java/com/bruce/modelprovider/entity/ModelCallLog.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelCallLog.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/entity/ModelCallLog.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelCallLog.java
diff --git a/src/main/java/com/bruce/modelprovider/entity/ModelConfig.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelConfig.java
similarity index 98%
rename from src/main/java/com/bruce/modelprovider/entity/ModelConfig.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelConfig.java
index ce28593..21eb4d3 100644
--- a/src/main/java/com/bruce/modelprovider/entity/ModelConfig.java
+++ b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelConfig.java
@@ -3,7 +3,7 @@ package com.bruce.modelprovider.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
-import com.bruce.rag.typehandler.PgJsonbStringTypeHandler;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/com/bruce/modelprovider/entity/ModelProvider.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelProvider.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/entity/ModelProvider.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelProvider.java
diff --git a/src/main/java/com/bruce/modelprovider/entity/ModelRouteRule.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelRouteRule.java
similarity index 97%
rename from src/main/java/com/bruce/modelprovider/entity/ModelRouteRule.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelRouteRule.java
index b962478..d53e3dd 100644
--- a/src/main/java/com/bruce/modelprovider/entity/ModelRouteRule.java
+++ b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/ModelRouteRule.java
@@ -3,7 +3,7 @@ package com.bruce.modelprovider.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
-import com.bruce.rag.typehandler.PgJsonbStringTypeHandler;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/com/bruce/modelprovider/entity/RagStoreModelConfig.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/RagStoreModelConfig.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/entity/RagStoreModelConfig.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/entity/RagStoreModelConfig.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelCallStatusEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelCallStatusEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelCallStatusEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelCallStatusEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelHealthStatusEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelHealthStatusEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelHealthStatusEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelHealthStatusEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelProtocolTypeEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelProtocolTypeEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelProtocolTypeEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelProtocolTypeEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelProviderTypeEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelProviderTypeEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelProviderTypeEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelProviderTypeEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelRouteStrategyEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelRouteStrategyEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelRouteStrategyEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelRouteStrategyEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelTaskTypeEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelTaskTypeEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelTaskTypeEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelTaskTypeEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/enums/ModelTypeEnum.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelTypeEnum.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/enums/ModelTypeEnum.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/enums/ModelTypeEnum.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/ChatModelGateway.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatModelGateway.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/ChatModelGateway.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatModelGateway.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/ChatModelGatewayImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatModelGatewayImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/ChatModelGatewayImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatModelGatewayImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/ChatRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/ChatRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/ChatResult.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatResult.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/ChatResult.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/ChatResult.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGateway.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGateway.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGateway.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGateway.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGatewayImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGatewayImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGatewayImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingModelGatewayImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/EmbeddingRequest.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingRequest.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/EmbeddingRequest.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingRequest.java
diff --git a/src/main/java/com/bruce/modelprovider/gateway/EmbeddingResult.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingResult.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/gateway/EmbeddingResult.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/gateway/EmbeddingResult.java
diff --git a/src/main/java/com/bruce/modelprovider/mapper/ModelCallLogMapper.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelCallLogMapper.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/mapper/ModelCallLogMapper.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelCallLogMapper.java
diff --git a/src/main/java/com/bruce/modelprovider/mapper/ModelConfigMapper.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelConfigMapper.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/mapper/ModelConfigMapper.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelConfigMapper.java
diff --git a/src/main/java/com/bruce/modelprovider/mapper/ModelProviderMapper.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelProviderMapper.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/mapper/ModelProviderMapper.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelProviderMapper.java
diff --git a/src/main/java/com/bruce/modelprovider/mapper/ModelRouteRuleMapper.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelRouteRuleMapper.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/mapper/ModelRouteRuleMapper.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/ModelRouteRuleMapper.java
diff --git a/src/main/java/com/bruce/modelprovider/mapper/RagStoreModelConfigMapper.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/RagStoreModelConfigMapper.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/mapper/RagStoreModelConfigMapper.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/mapper/RagStoreModelConfigMapper.java
diff --git a/src/main/java/com/bruce/modelprovider/route/ModelRouteContext.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/route/ModelRouteContext.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/route/ModelRouteContext.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/route/ModelRouteContext.java
diff --git a/src/main/java/com/bruce/modelprovider/route/ModelRouteDecision.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/route/ModelRouteDecision.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/route/ModelRouteDecision.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/route/ModelRouteDecision.java
diff --git a/src/main/java/com/bruce/modelprovider/service/IModelCallLogService.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelCallLogService.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/IModelCallLogService.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelCallLogService.java
diff --git a/src/main/java/com/bruce/modelprovider/service/IModelConfigService.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelConfigService.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/IModelConfigService.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelConfigService.java
diff --git a/src/main/java/com/bruce/modelprovider/service/IModelProviderService.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelProviderService.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/IModelProviderService.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelProviderService.java
diff --git a/src/main/java/com/bruce/modelprovider/service/IModelRouteRuleService.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelRouteRuleService.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/IModelRouteRuleService.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelRouteRuleService.java
diff --git a/src/main/java/com/bruce/modelprovider/service/IModelRouteService.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelRouteService.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/IModelRouteService.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IModelRouteService.java
diff --git a/src/main/java/com/bruce/modelprovider/service/IRagStoreModelConfigService.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IRagStoreModelConfigService.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/IRagStoreModelConfigService.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/IRagStoreModelConfigService.java
diff --git a/src/main/java/com/bruce/modelprovider/service/impl/ModelCallLogServiceImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelCallLogServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/impl/ModelCallLogServiceImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelCallLogServiceImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/service/impl/ModelConfigServiceImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelConfigServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/impl/ModelConfigServiceImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelConfigServiceImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/service/impl/ModelProviderServiceImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelProviderServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/impl/ModelProviderServiceImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelProviderServiceImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/service/impl/ModelRouteRuleServiceImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelRouteRuleServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/impl/ModelRouteRuleServiceImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelRouteRuleServiceImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/service/impl/ModelRouteServiceImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelRouteServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/impl/ModelRouteServiceImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/ModelRouteServiceImpl.java
diff --git a/src/main/java/com/bruce/modelprovider/service/impl/RagStoreModelConfigServiceImpl.java b/common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/RagStoreModelConfigServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/modelprovider/service/impl/RagStoreModelConfigServiceImpl.java
rename to common-agent-modelprovider/src/main/java/com/bruce/modelprovider/service/impl/RagStoreModelConfigServiceImpl.java
diff --git a/src/test/java/com/bruce/modelprovider/ModelProviderComponentStructureTests.java b/common-agent-modelprovider/src/test/java/com/bruce/modelprovider/ModelProviderComponentStructureTests.java
similarity index 100%
rename from src/test/java/com/bruce/modelprovider/ModelProviderComponentStructureTests.java
rename to common-agent-modelprovider/src/test/java/com/bruce/modelprovider/ModelProviderComponentStructureTests.java
diff --git a/common-agent-observability/pom.xml b/common-agent-observability/pom.xml
new file mode 100644
index 0000000..d6fd21d
--- /dev/null
+++ b/common-agent-observability/pom.xml
@@ -0,0 +1,65 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-observability
+ common-agent-observability
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ com.bruce
+ common-agent-agent
+ ${project.version}
+
+
+ com.bruce
+ common-agent-modelprovider
+ ${project.version}
+
+
+ com.bruce
+ common-agent-workflow
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/common-agent-observability/src/main/java/com/bruce/observability/controller/ObservabilityTraceController.java b/common-agent-observability/src/main/java/com/bruce/observability/controller/ObservabilityTraceController.java
new file mode 100644
index 0000000..5c1b8f0
--- /dev/null
+++ b/common-agent-observability/src/main/java/com/bruce/observability/controller/ObservabilityTraceController.java
@@ -0,0 +1,27 @@
+package com.bruce.observability.controller;
+
+import com.bruce.common.domain.model.RequestResult;
+import com.bruce.observability.vo.ObservabilityTraceVO;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 运行观测控制器先提供占位查询接口,
+ * 后续在 observability 模块完善聚合服务实现。
+ */
+@RestController
+@RequestMapping("/api/observability")
+public class ObservabilityTraceController {
+
+ @GetMapping("/trace")
+ public RequestResult trace(@RequestParam("requestId") String requestId) {
+ ObservabilityTraceVO vo = new ObservabilityTraceVO();
+ vo.setRequestId(requestId);
+ vo.setStepSummaries(List.of());
+ return RequestResult.success(vo);
+ }
+}
diff --git a/common-agent-observability/src/main/java/com/bruce/observability/vo/ObservabilityTraceVO.java b/common-agent-observability/src/main/java/com/bruce/observability/vo/ObservabilityTraceVO.java
new file mode 100644
index 0000000..ee63533
--- /dev/null
+++ b/common-agent-observability/src/main/java/com/bruce/observability/vo/ObservabilityTraceVO.java
@@ -0,0 +1,31 @@
+package com.bruce.observability.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * requestId 级别的运行追踪聚合返回对象。
+ */
+@Data
+public class ObservabilityTraceVO {
+
+ private String requestId;
+
+ private String workflowStatus;
+
+ private String sessionStatus;
+
+ private Integer workflowStepCount;
+
+ private Integer messageCount;
+
+ private Integer modelCallCount;
+
+ private Integer totalDurationMs;
+
+ private BigDecimal estimatedCost;
+
+ private List stepSummaries;
+}
diff --git a/common-agent-rag/pom.xml b/common-agent-rag/pom.xml
new file mode 100644
index 0000000..b6499d8
--- /dev/null
+++ b/common-agent-rag/pom.xml
@@ -0,0 +1,55 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-rag
+ common-agent-rag
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ com.bruce
+ common-agent-modelprovider
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/src/main/java/com/bruce/rag/constant/RagSystemConstants.java b/common-agent-rag/src/main/java/com/bruce/rag/constant/RagSystemConstants.java
similarity index 100%
rename from src/main/java/com/bruce/rag/constant/RagSystemConstants.java
rename to common-agent-rag/src/main/java/com/bruce/rag/constant/RagSystemConstants.java
diff --git a/src/main/java/com/bruce/rag/controller/RagDocumentController.java b/common-agent-rag/src/main/java/com/bruce/rag/controller/RagDocumentController.java
similarity index 100%
rename from src/main/java/com/bruce/rag/controller/RagDocumentController.java
rename to common-agent-rag/src/main/java/com/bruce/rag/controller/RagDocumentController.java
diff --git a/src/main/java/com/bruce/rag/controller/RagStoreController.java b/common-agent-rag/src/main/java/com/bruce/rag/controller/RagStoreController.java
similarity index 100%
rename from src/main/java/com/bruce/rag/controller/RagStoreController.java
rename to common-agent-rag/src/main/java/com/bruce/rag/controller/RagStoreController.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagDocumentBatchUploadRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentBatchUploadRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagDocumentBatchUploadRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentBatchUploadRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagDocumentChunkRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentChunkRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagDocumentChunkRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentChunkRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagDocumentParseRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentParseRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagDocumentParseRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentParseRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagDocumentQueryRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentQueryRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagDocumentQueryRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentQueryRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagDocumentSaveRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagDocumentSaveRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagDocumentSaveRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagStoreQueryRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagStoreQueryRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagStoreQueryRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagStoreQueryRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/request/RagStoreSaveRequest.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagStoreSaveRequest.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/request/RagStoreSaveRequest.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/request/RagStoreSaveRequest.java
diff --git a/src/main/java/com/bruce/rag/dto/response/RagChunkRecallResponse.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagChunkRecallResponse.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/response/RagChunkRecallResponse.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagChunkRecallResponse.java
diff --git a/src/main/java/com/bruce/rag/dto/response/RagDocumentParseResponse.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagDocumentParseResponse.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/response/RagDocumentParseResponse.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagDocumentParseResponse.java
diff --git a/src/main/java/com/bruce/rag/dto/response/RagDocumentResponse.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagDocumentResponse.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/response/RagDocumentResponse.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagDocumentResponse.java
diff --git a/src/main/java/com/bruce/rag/dto/response/RagStoreDocumentOverviewResponse.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagStoreDocumentOverviewResponse.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/response/RagStoreDocumentOverviewResponse.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagStoreDocumentOverviewResponse.java
diff --git a/src/main/java/com/bruce/rag/dto/response/RagStoreOverviewResponse.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagStoreOverviewResponse.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/response/RagStoreOverviewResponse.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagStoreOverviewResponse.java
diff --git a/src/main/java/com/bruce/rag/dto/response/RagStoreResponse.java b/common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagStoreResponse.java
similarity index 100%
rename from src/main/java/com/bruce/rag/dto/response/RagStoreResponse.java
rename to common-agent-rag/src/main/java/com/bruce/rag/dto/response/RagStoreResponse.java
diff --git a/src/main/java/com/bruce/rag/entity/RagChunk.java b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagChunk.java
similarity index 96%
rename from src/main/java/com/bruce/rag/entity/RagChunk.java
rename to common-agent-rag/src/main/java/com/bruce/rag/entity/RagChunk.java
index e718b85..8ace62d 100644
--- a/src/main/java/com/bruce/rag/entity/RagChunk.java
+++ b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagChunk.java
@@ -3,7 +3,7 @@ package com.bruce.rag.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
-import com.bruce.rag.typehandler.PgJsonbStringTypeHandler;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/com/bruce/rag/entity/RagChunkEmbedding.java b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagChunkEmbedding.java
similarity index 100%
rename from src/main/java/com/bruce/rag/entity/RagChunkEmbedding.java
rename to common-agent-rag/src/main/java/com/bruce/rag/entity/RagChunkEmbedding.java
diff --git a/src/main/java/com/bruce/rag/entity/RagDocument.java b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagDocument.java
similarity index 100%
rename from src/main/java/com/bruce/rag/entity/RagDocument.java
rename to common-agent-rag/src/main/java/com/bruce/rag/entity/RagDocument.java
diff --git a/src/main/java/com/bruce/rag/entity/RagDocumentParseResult.java b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagDocumentParseResult.java
similarity index 96%
rename from src/main/java/com/bruce/rag/entity/RagDocumentParseResult.java
rename to common-agent-rag/src/main/java/com/bruce/rag/entity/RagDocumentParseResult.java
index e5b24e0..62520ec 100644
--- a/src/main/java/com/bruce/rag/entity/RagDocumentParseResult.java
+++ b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagDocumentParseResult.java
@@ -3,7 +3,7 @@ package com.bruce.rag.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
-import com.bruce.rag.typehandler.PgJsonbStringTypeHandler;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
diff --git a/src/main/java/com/bruce/rag/entity/RagStore.java b/common-agent-rag/src/main/java/com/bruce/rag/entity/RagStore.java
similarity index 100%
rename from src/main/java/com/bruce/rag/entity/RagStore.java
rename to common-agent-rag/src/main/java/com/bruce/rag/entity/RagStore.java
diff --git a/src/main/java/com/bruce/rag/enums/RagChunkStrategyEnum.java b/common-agent-rag/src/main/java/com/bruce/rag/enums/RagChunkStrategyEnum.java
similarity index 100%
rename from src/main/java/com/bruce/rag/enums/RagChunkStrategyEnum.java
rename to common-agent-rag/src/main/java/com/bruce/rag/enums/RagChunkStrategyEnum.java
diff --git a/src/main/java/com/bruce/rag/enums/RagIndexStatusEnum.java b/common-agent-rag/src/main/java/com/bruce/rag/enums/RagIndexStatusEnum.java
similarity index 100%
rename from src/main/java/com/bruce/rag/enums/RagIndexStatusEnum.java
rename to common-agent-rag/src/main/java/com/bruce/rag/enums/RagIndexStatusEnum.java
diff --git a/src/main/java/com/bruce/rag/enums/RagParseStatusEnum.java b/common-agent-rag/src/main/java/com/bruce/rag/enums/RagParseStatusEnum.java
similarity index 100%
rename from src/main/java/com/bruce/rag/enums/RagParseStatusEnum.java
rename to common-agent-rag/src/main/java/com/bruce/rag/enums/RagParseStatusEnum.java
diff --git a/src/main/java/com/bruce/rag/mapper/RagChunkEmbeddingMapper.java b/common-agent-rag/src/main/java/com/bruce/rag/mapper/RagChunkEmbeddingMapper.java
similarity index 100%
rename from src/main/java/com/bruce/rag/mapper/RagChunkEmbeddingMapper.java
rename to common-agent-rag/src/main/java/com/bruce/rag/mapper/RagChunkEmbeddingMapper.java
diff --git a/src/main/java/com/bruce/rag/mapper/RagChunkMapper.java b/common-agent-rag/src/main/java/com/bruce/rag/mapper/RagChunkMapper.java
similarity index 100%
rename from src/main/java/com/bruce/rag/mapper/RagChunkMapper.java
rename to common-agent-rag/src/main/java/com/bruce/rag/mapper/RagChunkMapper.java
diff --git a/src/main/java/com/bruce/rag/mapper/RagDocumentMapper.java b/common-agent-rag/src/main/java/com/bruce/rag/mapper/RagDocumentMapper.java
similarity index 100%
rename from src/main/java/com/bruce/rag/mapper/RagDocumentMapper.java
rename to common-agent-rag/src/main/java/com/bruce/rag/mapper/RagDocumentMapper.java
diff --git a/src/main/java/com/bruce/rag/mapper/RagDocumentParseResultMapper.java b/common-agent-rag/src/main/java/com/bruce/rag/mapper/RagDocumentParseResultMapper.java
similarity index 100%
rename from src/main/java/com/bruce/rag/mapper/RagDocumentParseResultMapper.java
rename to common-agent-rag/src/main/java/com/bruce/rag/mapper/RagDocumentParseResultMapper.java
diff --git a/src/main/java/com/bruce/rag/mapper/RagStoreMapper.java b/common-agent-rag/src/main/java/com/bruce/rag/mapper/RagStoreMapper.java
similarity index 100%
rename from src/main/java/com/bruce/rag/mapper/RagStoreMapper.java
rename to common-agent-rag/src/main/java/com/bruce/rag/mapper/RagStoreMapper.java
diff --git a/src/main/java/com/bruce/rag/parse/Chunker.java b/common-agent-rag/src/main/java/com/bruce/rag/parse/Chunker.java
similarity index 100%
rename from src/main/java/com/bruce/rag/parse/Chunker.java
rename to common-agent-rag/src/main/java/com/bruce/rag/parse/Chunker.java
diff --git a/src/main/java/com/bruce/rag/parse/ChunkerFactory.java b/common-agent-rag/src/main/java/com/bruce/rag/parse/ChunkerFactory.java
similarity index 100%
rename from src/main/java/com/bruce/rag/parse/ChunkerFactory.java
rename to common-agent-rag/src/main/java/com/bruce/rag/parse/ChunkerFactory.java
diff --git a/src/main/java/com/bruce/rag/parse/RagChunkCommand.java b/common-agent-rag/src/main/java/com/bruce/rag/parse/RagChunkCommand.java
similarity index 100%
rename from src/main/java/com/bruce/rag/parse/RagChunkCommand.java
rename to common-agent-rag/src/main/java/com/bruce/rag/parse/RagChunkCommand.java
diff --git a/src/main/java/com/bruce/rag/parse/impl/DelimiterChunker.java b/common-agent-rag/src/main/java/com/bruce/rag/parse/impl/DelimiterChunker.java
similarity index 100%
rename from src/main/java/com/bruce/rag/parse/impl/DelimiterChunker.java
rename to common-agent-rag/src/main/java/com/bruce/rag/parse/impl/DelimiterChunker.java
diff --git a/src/main/java/com/bruce/rag/parse/impl/FixedLengthChunker.java b/common-agent-rag/src/main/java/com/bruce/rag/parse/impl/FixedLengthChunker.java
similarity index 100%
rename from src/main/java/com/bruce/rag/parse/impl/FixedLengthChunker.java
rename to common-agent-rag/src/main/java/com/bruce/rag/parse/impl/FixedLengthChunker.java
diff --git a/src/main/java/com/bruce/rag/service/IRagChunkEmbeddingService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagChunkEmbeddingService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagChunkEmbeddingService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagChunkEmbeddingService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagChunkService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagChunkService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagChunkService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagChunkService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagDocumentAutoParseService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentAutoParseService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagDocumentAutoParseService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentAutoParseService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagDocumentChunkService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentChunkService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagDocumentChunkService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentChunkService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagDocumentParseResultService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentParseResultService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagDocumentParseResultService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentParseResultService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagDocumentParseService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentParseService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagDocumentParseService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentParseService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagDocumentService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagDocumentService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagDocumentService.java
diff --git a/src/main/java/com/bruce/rag/service/IRagStoreService.java b/common-agent-rag/src/main/java/com/bruce/rag/service/IRagStoreService.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/IRagStoreService.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/IRagStoreService.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagChunkEmbeddingServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagChunkEmbeddingServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagChunkEmbeddingServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagChunkEmbeddingServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagChunkServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagChunkServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagChunkServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagChunkServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagDocumentAutoParseServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentAutoParseServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagDocumentAutoParseServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentAutoParseServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagDocumentChunkServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentChunkServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagDocumentChunkServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentChunkServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagDocumentParseResultServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentParseResultServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagDocumentParseResultServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentParseResultServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagDocumentParseServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentParseServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagDocumentParseServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentParseServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagDocumentServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagDocumentServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagDocumentServiceImpl.java
diff --git a/src/main/java/com/bruce/rag/service/impl/RagStoreServiceImpl.java b/common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagStoreServiceImpl.java
similarity index 100%
rename from src/main/java/com/bruce/rag/service/impl/RagStoreServiceImpl.java
rename to common-agent-rag/src/main/java/com/bruce/rag/service/impl/RagStoreServiceImpl.java
diff --git a/src/test/java/com/bruce/rag/RagComponentStructureTests.java b/common-agent-rag/src/test/java/com/bruce/rag/RagComponentStructureTests.java
similarity index 99%
rename from src/test/java/com/bruce/rag/RagComponentStructureTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/RagComponentStructureTests.java
index a839ee1..26c83d4 100644
--- a/src/test/java/com/bruce/rag/RagComponentStructureTests.java
+++ b/common-agent-rag/src/test/java/com/bruce/rag/RagComponentStructureTests.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import com.bruce.common.domain.model.RequestResult;
import com.bruce.rag.constant.RagSystemConstants;
import com.bruce.rag.controller.RagDocumentController;
@@ -39,7 +40,6 @@ import com.bruce.rag.service.impl.RagChunkServiceImpl;
import com.bruce.rag.service.impl.RagDocumentParseResultServiceImpl;
import com.bruce.rag.service.impl.RagDocumentServiceImpl;
import com.bruce.rag.service.impl.RagStoreServiceImpl;
-import com.bruce.rag.typehandler.PgJsonbStringTypeHandler;
import org.junit.jupiter.api.Test;
import org.springframework.web.bind.annotation.PostMapping;
diff --git a/src/test/java/com/bruce/rag/RagDocumentParseServiceImplTests.java b/common-agent-rag/src/test/java/com/bruce/rag/RagDocumentParseServiceImplTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/RagDocumentParseServiceImplTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/RagDocumentParseServiceImplTests.java
diff --git a/src/test/java/com/bruce/rag/RagDocumentServiceImplTests.java b/common-agent-rag/src/test/java/com/bruce/rag/RagDocumentServiceImplTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/RagDocumentServiceImplTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/RagDocumentServiceImplTests.java
diff --git a/src/test/java/com/bruce/rag/RagStoreOverviewServiceTests.java b/common-agent-rag/src/test/java/com/bruce/rag/RagStoreOverviewServiceTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/RagStoreOverviewServiceTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/RagStoreOverviewServiceTests.java
diff --git a/src/test/java/com/bruce/rag/RagStoreResponseSerializationTests.java b/common-agent-rag/src/test/java/com/bruce/rag/RagStoreResponseSerializationTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/RagStoreResponseSerializationTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/RagStoreResponseSerializationTests.java
diff --git a/src/test/java/com/bruce/rag/RagStoreSaveValidationTests.java b/common-agent-rag/src/test/java/com/bruce/rag/RagStoreSaveValidationTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/RagStoreSaveValidationTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/RagStoreSaveValidationTests.java
diff --git a/src/test/java/com/bruce/rag/parse/ChunkerFactoryTests.java b/common-agent-rag/src/test/java/com/bruce/rag/parse/ChunkerFactoryTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/parse/ChunkerFactoryTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/parse/ChunkerFactoryTests.java
diff --git a/src/test/java/com/bruce/rag/parse/DelimiterChunkerTests.java b/common-agent-rag/src/test/java/com/bruce/rag/parse/DelimiterChunkerTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/parse/DelimiterChunkerTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/parse/DelimiterChunkerTests.java
diff --git a/src/test/java/com/bruce/rag/parse/FixedLengthChunkerTests.java b/common-agent-rag/src/test/java/com/bruce/rag/parse/FixedLengthChunkerTests.java
similarity index 100%
rename from src/test/java/com/bruce/rag/parse/FixedLengthChunkerTests.java
rename to common-agent-rag/src/test/java/com/bruce/rag/parse/FixedLengthChunkerTests.java
diff --git a/common-agent-skill/pom.xml b/common-agent-skill/pom.xml
new file mode 100644
index 0000000..ad9e4e9
--- /dev/null
+++ b/common-agent-skill/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-skill
+ common-agent-skill
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/common-agent-skill/src/main/java/com/bruce/skill/entity/SkillDefinition.java b/common-agent-skill/src/main/java/com/bruce/skill/entity/SkillDefinition.java
new file mode 100644
index 0000000..4758219
--- /dev/null
+++ b/common-agent-skill/src/main/java/com/bruce/skill/entity/SkillDefinition.java
@@ -0,0 +1,25 @@
+package com.bruce.skill.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Skill 定义实体,对应 skill_definition 表。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("skill_definition")
+public class SkillDefinition extends BaseEntity {
+
+ private String skillCode;
+
+ private String skillName;
+
+ private String skillType;
+
+ private String description;
+
+ private String status;
+}
diff --git a/common-agent-skill/src/main/java/com/bruce/skill/entity/SkillVersion.java b/common-agent-skill/src/main/java/com/bruce/skill/entity/SkillVersion.java
new file mode 100644
index 0000000..2065a00
--- /dev/null
+++ b/common-agent-skill/src/main/java/com/bruce/skill/entity/SkillVersion.java
@@ -0,0 +1,38 @@
+package com.bruce.skill.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Skill 版本实体,用于保存 Prompt、Code、配置和测试结果。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("skill_version")
+public class SkillVersion extends BaseEntity {
+
+ private Long skillId;
+
+ private Integer versionNo;
+
+ private String promptText;
+
+ private String codeText;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String configJson;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String variableSchemaJson;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String testResultJson;
+
+ private String publishStatus;
+
+ private java.time.LocalDateTime publishedTime;
+}
diff --git a/common-agent-workflow/pom.xml b/common-agent-workflow/pom.xml
new file mode 100644
index 0000000..ee394b0
--- /dev/null
+++ b/common-agent-workflow/pom.xml
@@ -0,0 +1,75 @@
+
+
+ 4.0.0
+
+
+ com.bruce
+ common-agent-parent
+ 0.0.1-SNAPSHOT
+
+
+ common-agent-workflow
+ common-agent-workflow
+
+
+
+ com.bruce
+ common-agent-common
+ ${project.version}
+
+
+ com.bruce
+ common-agent-agent
+ ${project.version}
+
+
+ com.bruce
+ common-agent-rag
+ ${project.version}
+
+
+ com.bruce
+ common-agent-modelprovider
+ ${project.version}
+
+
+ com.bruce
+ common-agent-mcp
+ ${project.version}
+
+
+ com.bruce
+ common-agent-skill
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
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
new file mode 100644
index 0000000..275bf4b
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/controller/WorkflowDefinitionController.java
@@ -0,0 +1,38 @@
+package com.bruce.workflow.controller;
+
+import com.bruce.common.domain.model.RequestResult;
+import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
+import com.bruce.workflow.service.IWorkflowDefinitionService;
+import com.bruce.workflow.vo.WorkflowDefinitionVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/workflows")
+@RequiredArgsConstructor
+public class WorkflowDefinitionController {
+
+ private final IWorkflowDefinitionService workflowDefinitionService;
+
+ @GetMapping("/definitions")
+ public RequestResult> list() {
+ return RequestResult.success(workflowDefinitionService.listDefinitions());
+ }
+
+ @GetMapping("/definition/detail")
+ public RequestResult detail(@RequestParam("id") Long id) {
+ return RequestResult.success(workflowDefinitionService.getDefinition(id));
+ }
+
+ @PostMapping("/definition/save")
+ public RequestResult save(@RequestBody WorkflowDefinitionSaveDTO request) {
+ return RequestResult.success(workflowDefinitionService.saveDefinition(request));
+ }
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/dto/WorkflowDefinitionSaveDTO.java b/common-agent-workflow/src/main/java/com/bruce/workflow/dto/WorkflowDefinitionSaveDTO.java
new file mode 100644
index 0000000..888f77f
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/dto/WorkflowDefinitionSaveDTO.java
@@ -0,0 +1,26 @@
+package com.bruce.workflow.dto;
+
+import lombok.Data;
+
+/**
+ * Workflow 定义保存请求。
+ */
+@Data
+public class WorkflowDefinitionSaveDTO {
+
+ private Long id;
+
+ private Long projectId;
+
+ private String workflowCode;
+
+ private String workflowName;
+
+ private String description;
+
+ private Long boundAgentId;
+
+ private String status;
+
+ private String remark;
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/entity/StudioProject.java b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/StudioProject.java
new file mode 100644
index 0000000..07f5618
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/StudioProject.java
@@ -0,0 +1,27 @@
+package com.bruce.workflow.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Studio 项目空间实体,严格映射 studio_project 表。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("studio_project")
+@Schema(description = "Studio项目空间")
+public class StudioProject extends BaseEntity {
+
+ private String projectCode;
+
+ private String projectName;
+
+ private String environment;
+
+ private String publishStatus;
+
+ private String currentVersion;
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowDefinition.java b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowDefinition.java
new file mode 100644
index 0000000..d41523f
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowDefinition.java
@@ -0,0 +1,27 @@
+package com.bruce.workflow.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Workflow 定义实体,对应 workflow_definition 表。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("workflow_definition")
+public class WorkflowDefinition extends BaseEntity {
+
+ private Long projectId;
+
+ private String workflowCode;
+
+ private String workflowName;
+
+ private String description;
+
+ private Long boundAgentId;
+
+ private String status;
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowRun.java b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowRun.java
new file mode 100644
index 0000000..28deb21
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowRun.java
@@ -0,0 +1,41 @@
+package com.bruce.workflow.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * Workflow 运行记录实体,对应 workflow_run 表。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("workflow_run")
+public class WorkflowRun extends BaseEntity {
+
+ private String requestId;
+
+ private Long workflowId;
+
+ private Long workflowVersionId;
+
+ private Long agentId;
+
+ private String runSource;
+
+ private String status;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String inputJson;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String outputJson;
+
+ private Integer durationMs;
+
+ private BigDecimal estimatedCost;
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowRunStep.java b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowRunStep.java
new file mode 100644
index 0000000..f2e7634
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowRunStep.java
@@ -0,0 +1,37 @@
+package com.bruce.workflow.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.bruce.common.domain.model.BaseEntity;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Workflow 步骤日志实体,用于观测与调试。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("workflow_run_step")
+public class WorkflowRunStep extends BaseEntity {
+
+ private Long runId;
+
+ private String nodeId;
+
+ private String nodeType;
+
+ private String nodeName;
+
+ private String status;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String inputJson;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String outputJson;
+
+ private Integer durationMs;
+
+ private String errorMessage;
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowVersion.java b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowVersion.java
new file mode 100644
index 0000000..2aed67b
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/entity/WorkflowVersion.java
@@ -0,0 +1,30 @@
+package com.bruce.workflow.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.bruce.common.domain.model.BaseEntity;
+import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Workflow 版本快照实体,用于持久化画布结构。
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("workflow_version")
+public class WorkflowVersion extends BaseEntity {
+
+ private Long workflowId;
+
+ private Integer versionNo;
+
+ private String snapshotName;
+
+ @TableField(typeHandler = PgJsonbStringTypeHandler.class)
+ private String graphJson;
+
+ private String publishStatus;
+
+ private java.time.LocalDateTime publishedTime;
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/factory/WorkflowDefinitionFactory.java b/common-agent-workflow/src/main/java/com/bruce/workflow/factory/WorkflowDefinitionFactory.java
new file mode 100644
index 0000000..64d9871
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/factory/WorkflowDefinitionFactory.java
@@ -0,0 +1,44 @@
+package com.bruce.workflow.factory;
+
+import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
+import com.bruce.workflow.entity.WorkflowDefinition;
+import com.bruce.workflow.vo.WorkflowDefinitionVO;
+import org.springframework.stereotype.Component;
+
+/**
+ * WorkflowDefinitionFactory 统一处理 DTO、Entity、VO 转换,
+ * 避免控制层和服务层分散手写字段映射。
+ */
+@Component
+public class WorkflowDefinitionFactory {
+
+ public WorkflowDefinition toEntity(WorkflowDefinitionSaveDTO dto) {
+ if (dto == null) {
+ return null;
+ }
+ WorkflowDefinition entity = new WorkflowDefinition();
+ entity.setId(dto.getId());
+ entity.setProjectId(dto.getProjectId());
+ entity.setWorkflowCode(dto.getWorkflowCode());
+ entity.setWorkflowName(dto.getWorkflowName());
+ entity.setDescription(dto.getDescription());
+ entity.setBoundAgentId(dto.getBoundAgentId());
+ entity.setStatus(dto.getStatus());
+ return entity;
+ }
+
+ public WorkflowDefinitionVO toVO(WorkflowDefinition entity) {
+ if (entity == null) {
+ return null;
+ }
+ WorkflowDefinitionVO vo = new WorkflowDefinitionVO();
+ vo.setId(entity.getId());
+ vo.setWorkflowCode(entity.getWorkflowCode());
+ vo.setWorkflowName(entity.getWorkflowName());
+ vo.setProjectId(entity.getProjectId());
+ vo.setBoundAgentId(entity.getBoundAgentId());
+ vo.setStatus(entity.getStatus());
+ vo.setDescription(entity.getDescription());
+ return vo;
+ }
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/StudioProjectMapper.java b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/StudioProjectMapper.java
new file mode 100644
index 0000000..75fd6eb
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/StudioProjectMapper.java
@@ -0,0 +1,7 @@
+package com.bruce.workflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bruce.workflow.entity.StudioProject;
+
+public interface StudioProjectMapper extends BaseMapper {
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowDefinitionMapper.java b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowDefinitionMapper.java
new file mode 100644
index 0000000..9a62661
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowDefinitionMapper.java
@@ -0,0 +1,7 @@
+package com.bruce.workflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bruce.workflow.entity.WorkflowDefinition;
+
+public interface WorkflowDefinitionMapper extends BaseMapper {
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowRunMapper.java b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowRunMapper.java
new file mode 100644
index 0000000..b68dbf0
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowRunMapper.java
@@ -0,0 +1,7 @@
+package com.bruce.workflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bruce.workflow.entity.WorkflowRun;
+
+public interface WorkflowRunMapper extends BaseMapper {
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowRunStepMapper.java b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowRunStepMapper.java
new file mode 100644
index 0000000..b362053
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowRunStepMapper.java
@@ -0,0 +1,7 @@
+package com.bruce.workflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bruce.workflow.entity.WorkflowRunStep;
+
+public interface WorkflowRunStepMapper extends BaseMapper {
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowVersionMapper.java b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowVersionMapper.java
new file mode 100644
index 0000000..5bc156b
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/mapper/WorkflowVersionMapper.java
@@ -0,0 +1,7 @@
+package com.bruce.workflow.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bruce.workflow.entity.WorkflowVersion;
+
+public interface WorkflowVersionMapper extends BaseMapper {
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowDefinitionService.java b/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowDefinitionService.java
new file mode 100644
index 0000000..7d5e373
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/service/IWorkflowDefinitionService.java
@@ -0,0 +1,17 @@
+package com.bruce.workflow.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
+import com.bruce.workflow.entity.WorkflowDefinition;
+import com.bruce.workflow.vo.WorkflowDefinitionVO;
+
+import java.util.List;
+
+public interface IWorkflowDefinitionService extends IService {
+
+ List listDefinitions();
+
+ WorkflowDefinitionVO getDefinition(Long id);
+
+ boolean saveDefinition(WorkflowDefinitionSaveDTO request);
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowDefinitionServiceImpl.java b/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowDefinitionServiceImpl.java
new file mode 100644
index 0000000..88c29a2
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/service/impl/WorkflowDefinitionServiceImpl.java
@@ -0,0 +1,55 @@
+package com.bruce.workflow.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
+import com.bruce.workflow.entity.WorkflowDefinition;
+import com.bruce.workflow.factory.WorkflowDefinitionFactory;
+import com.bruce.workflow.mapper.WorkflowDefinitionMapper;
+import com.bruce.workflow.service.IWorkflowDefinitionService;
+import com.bruce.workflow.vo.WorkflowDefinitionVO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Workflow 定义服务当前先提供主数据能力,
+ * 后续运行器与版本发布能力会在此基础上继续扩展。
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WorkflowDefinitionServiceImpl extends ServiceImpl
+ implements IWorkflowDefinitionService {
+
+ private final WorkflowDefinitionFactory workflowDefinitionFactory;
+
+ @Override
+ public List listDefinitions() {
+ log.info("查询Workflow定义列表开始");
+ List result = list().stream().map(workflowDefinitionFactory::toVO).toList();
+ log.info("查询Workflow定义列表结束,count={}", result.size());
+ return result;
+ }
+
+ @Override
+ public WorkflowDefinitionVO getDefinition(Long id) {
+ log.info("查询Workflow定义详情开始,workflowId={}", id);
+ WorkflowDefinitionVO result = workflowDefinitionFactory.toVO(getById(id));
+ log.info("查询Workflow定义详情结束,workflowId={}, found={}", id, result != null);
+ return result;
+ }
+
+ @Override
+ public boolean saveDefinition(WorkflowDefinitionSaveDTO request) {
+ log.info("保存Workflow定义开始,workflowId={}, workflowCode={}", request == null ? null : request.getId(),
+ request == null ? null : request.getWorkflowCode());
+ boolean result = saveOrUpdate(workflowDefinitionFactory.toEntity(request));
+ log.info("保存Workflow定义结束,workflowId={}, workflowCode={}, result={}",
+ request == null ? null : request.getId(),
+ request == null ? null : request.getWorkflowCode(),
+ result);
+ return result;
+ }
+}
diff --git a/common-agent-workflow/src/main/java/com/bruce/workflow/vo/WorkflowDefinitionVO.java b/common-agent-workflow/src/main/java/com/bruce/workflow/vo/WorkflowDefinitionVO.java
new file mode 100644
index 0000000..afc5cbf
--- /dev/null
+++ b/common-agent-workflow/src/main/java/com/bruce/workflow/vo/WorkflowDefinitionVO.java
@@ -0,0 +1,24 @@
+package com.bruce.workflow.vo;
+
+import lombok.Data;
+
+/**
+ * Workflow 定义详情返回对象。
+ */
+@Data
+public class WorkflowDefinitionVO {
+
+ private Long id;
+
+ private String workflowCode;
+
+ private String workflowName;
+
+ private Long projectId;
+
+ private Long boundAgentId;
+
+ private String status;
+
+ private String description;
+}
diff --git a/frontend/src/api/__tests__/attachments.spec.ts b/frontend/src/api/__tests__/attachments.spec.ts
new file mode 100644
index 0000000..1dd182e
--- /dev/null
+++ b/frontend/src/api/__tests__/attachments.spec.ts
@@ -0,0 +1,30 @@
+import { describe, expect, it, vi } from 'vitest';
+
+import { uploadAttachment } from '../attachments';
+import { post } from '../request';
+
+vi.mock('../request', () => ({
+ post: vi.fn(),
+}));
+
+describe('attachments api', () => {
+ it('uploads attachment with multipart form data', () => {
+ const file = new File(['hello'], 'note.txt', { type: 'text/plain' });
+ uploadAttachment({
+ file,
+ sourceType: 'RAG',
+ sourceId: '1001',
+ });
+
+ const [url, body] = vi.mocked(post).mock.calls[0];
+ expect(url).toBe('/attachments/upload');
+ expect(body).toBeInstanceOf(FormData);
+
+ const entries = Array.from((body as FormData).entries());
+ expect(entries).toEqual([
+ ['file', file],
+ ['sourceType', 'RAG'],
+ ['sourceId', '1001'],
+ ]);
+ });
+});
diff --git a/frontend/src/api/attachments.ts b/frontend/src/api/attachments.ts
new file mode 100644
index 0000000..54a21b6
--- /dev/null
+++ b/frontend/src/api/attachments.ts
@@ -0,0 +1,31 @@
+import { post } from './request';
+
+export interface AttachmentUploadRequest {
+ file: File;
+ sourceType: string;
+ sourceId?: string;
+}
+
+export interface AttachmentResponse {
+ id: string;
+ sourceType: string;
+ sourceId?: string | null;
+ originalName: string;
+ fileName: string;
+ fileSuffix?: string | null;
+ contentType?: string | null;
+ fileSize: number;
+ storageType: string;
+ fileUrl?: string | null;
+ remark?: string | null;
+}
+
+export function uploadAttachment(data: AttachmentUploadRequest) {
+ const formData = new FormData();
+ formData.append('file', data.file);
+ formData.append('sourceType', data.sourceType);
+ if (data.sourceId) {
+ formData.append('sourceId', data.sourceId);
+ }
+ return post('/attachments/upload', formData);
+}
diff --git a/pom.xml b/pom.xml
index 59fc07c..51adaaf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,110 +1,83 @@
-
4.0.0
+
org.springframework.boot
spring-boot-starter-parent
4.0.6
-
+
+
com.bruce
- common_agent
+ common-agent-parent
0.0.1-SNAPSHOT
- common_agent
- common_agent
-
-
-
-
-
-
-
-
-
-
-
-
-
+ pom
+ common-agent-parent
+ Common Agent Studio parent project
+
21
3.5.16
3.2.3
+ 2.8.13
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-web
-
+
+ common-agent-boot
+ common-agent-common
+ common-agent-rag
+ common-agent-modelprovider
+ common-agent-agent
+ common-agent-workflow
+ common-agent-mcp
+ common-agent-skill
+ common-agent-observability
+
-
- com.baomidou
- mybatis-plus-spring-boot4-starter
- ${mybatis-plus.version}
-
-
-
- org.projectlombok
- lombok
- true
-
-
-
- org.postgresql
- postgresql
- runtime
-
-
-
- com.fasterxml.jackson.core
- jackson-annotations
-
-
-
- org.apache.tika
- tika-core
- ${tika.version}
-
-
-
- org.apache.tika
- tika-parsers-standard-package
- ${tika.version}
-
-
-
- org.springdoc
- springdoc-openapi-starter-webmvc-ui
- 2.8.13
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
+
+
+
+ com.baomidou
+ mybatis-plus-spring-boot4-starter
+ ${mybatis-plus.version}
+
+
+ org.apache.tika
+ tika-core
+ ${tika.version}
+
+
+ org.apache.tika
+ tika-parsers-standard-package
+ ${tika.version}
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ ${springdoc.version}
+
+
+
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- org.projectlombok
- lombok
-
-
-
-
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
-