package main import ( "log" "sync" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/container" "git.x2erp.com/qdy/go-base/graceful" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/sdk/configure" "git.x2erp.com/qdy/go-base/webx" "git.x2erp.com/qdy/go-base/webx/health" "git.x2erp.com/qdy/go-base/webx/router" "git.x2erp.com/qdy/go-svc-code/internal/opencode" "git.x2erp.com/qdy/go-svc-code/internal/routes" ) var ( appName = "svc-code" appVersion = "1" ) // 全局变量存储 opencode 进程信息 var ( opencodeProcess *opencode.Process opencodePort int opencodeMutex sync.Mutex ) func main() { // 0. 初始化启动日志 logBootFactory := logger.InitBootLog() // 1. 获取配置文件 cfg := config.GetConfig() cfg.SetAppName(appName) cfg.SetAppVersion(appVersion) // 2. 创建关闭容器 ctr := container.NewContainer(cfg) // 注册日志,实现自动关闭 container.Reg(ctr, logBootFactory) // 3. 启用运行日志(需要在启动 opencode 服务之前) container.Create(ctr, logger.InitRuntimeLogger) // 4. 创建 configure 客户端 configClient, err := configure.NewClient() if err != nil { log.Fatalf("创建 configure 客户端失败: %v", err) } // 5. 创建 opencode 客户端(使用 DirectClient,连接外部 opencode 服务) opencodePort = opencode.DefaultOpenCodePort client, err := opencode.NewDirectClient(opencodePort) if err != nil { log.Fatalf("创建 opencode 客户端失败: %v", err) } log.Printf("opencode 客户端已创建,连接端口: %d", opencodePort) // 6. 得到 webservice 服务工厂 webxFactory := webx.GetWebServiceFactory() // 7. 建立 httpService 服务 webService, err := webxFactory.CreateService(cfg.GetServiceConfig()) if err != nil { log.Fatalf("创建 HTTP 服务失败: %v", err) } // 8. 建立路由-api routerService := router.NewWebService(webService.GetRouter()) // 注册健康检查-api health.RegisterConsulHealthCheck(routerService) // 9. 注册路由--api registerRoutes(routerService, webService, configClient, client, nil, opencodePort) // 9. 注册前端静态文件服务 //registerStaticFiles(webService) // 10. 启动服务 webService.Run() // 11. 启用运行日志 container.Create(ctr, logger.InitRuntimeLogger) // 12. 等待关闭 graceful.WaitForShutdown(cfg.GetServiceConfig().ServiceName, ctr, webService.GetServer()) } // registerRoutes 注册所有 API 路由 func registerRoutes(ws *router.RouterService, webService *webx.WebService, configClient *configure.Client, client opencode.OpenCodeClient, opencodeProcess *opencode.Process, opencodePort int) { // 认证路由(公开登录接口) routes.RegisterAuthRoutes(ws, configClient) // 会话管理路由 routes.RegisterSessionRoutes(ws, client) // 同步对话路由 routes.RegisterPromptSyncRoutes(ws, client) // 流式对话路由(需要直接 HTTP 处理器) routes.RegisterPromptStreamRoutes(ws, webService, client) // 日志流路由(需要直接 HTTP 处理器) routes.RegisterLogStreamRoutes(ws, webService, opencodeProcess, opencodePort) }