package main import ( "context" "fmt" "os" "strings" aiservice "GoNavi-Wails/internal/ai/service" "GoNavi-Wails/internal/app" "GoNavi-Wails/internal/logger" "GoNavi-Wails/internal/mcpserver" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/assetserver" "github.com/wailsapp/wails/v2/pkg/options/mac" "github.com/wailsapp/wails/v2/pkg/options/windows" ) func main() { if runSpecialMode(os.Args[1:]) { return } // Create an instance of the app structure application := app.NewApp() aiService := aiservice.NewService() lowMemoryMode := isLowMemoryMode() backgroundColour := &options.RGBA{R: 0, G: 0, B: 0, A: 0} windowsBackdrop := windows.Acrylic if lowMemoryMode { backgroundColour = &options.RGBA{R: 255, G: 255, B: 255, A: 255} windowsBackdrop = windows.None } // Create application with options err := wails.Run(&options.App{ Title: "GoNavi", Width: 1024, Height: 768, MinWidth: 900, MinHeight: 600, Frameless: true, AssetServer: &assetserver.Options{ Assets: assets, }, BackgroundColour: backgroundColour, OnStartup: func(ctx context.Context) { app.InitializeLifecycle(application, ctx) aiservice.InitializeLifecycle(aiService, ctx) }, OnShutdown: func(ctx context.Context) { aiService.Shutdown(ctx) application.Shutdown(ctx) }, Bind: []interface{}{ application, aiService, }, Windows: &windows.Options{ WebviewIsTransparent: !lowMemoryMode, WindowIsTranslucent: !lowMemoryMode, BackdropType: windowsBackdrop, DisableWindowIcon: false, DisableFramelessWindowDecorations: false, WebviewUserDataPath: resolveWindowsWebviewUserDataPath(), }, Mac: &mac.Options{ WebviewIsTransparent: true, WindowIsTranslucent: true, }, }) if err != nil { logger.Error(err, "应用启动失败") } } func runSpecialMode(args []string) bool { if !shouldRunMCPServerMode(args) { return false } if err := runMCPServerMode(context.Background(), args[1:]); err != nil { logger.Error(err, "GoNavi MCP Server 退出") } return true } func runMCPServerMode(ctx context.Context, args []string) error { if len(args) == 0 { return mcpserver.RunAppStdioServer(ctx) } mode := strings.ToLower(strings.TrimSpace(args[0])) switch mode { case "stdio", "--stdio": return mcpserver.RunAppStdioServer(ctx) case "http", "--http", "streamable-http", "--streamable-http": options, err := mcpserver.ParseHTTPServerOptions(args[1:]) if err != nil { return err } logger.Infof("GoNavi MCP Streamable HTTP Server 启动:addr=%s path=%s schemaOnly=%v", options.Addr, options.Path, options.SchemaOnly) return mcpserver.RunAppStreamableHTTPServer(ctx, options) case "remote-config", "--remote-config": return mcpserver.WriteRemoteMCPClientConfig(os.Stdout, args[1:]) default: return fmt.Errorf("未知 MCP server 模式: %s(支持 stdio/http/remote-config)", args[0]) } } func shouldRunMCPServerMode(args []string) bool { if len(args) == 0 { return false } switch strings.ToLower(strings.TrimSpace(args[0])) { case "mcp-server", "--mcp-server": return true default: return false } } func isLowMemoryMode() bool { switch strings.ToLower(strings.TrimSpace(os.Getenv("GONAVI_LOW_MEMORY_MODE"))) { case "1", "true", "yes", "on": return true default: return false } }