From ff717ef516c6d2261f84b727c409dd050c8e63a6 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 22 Mar 2026 00:40:33 +0000 Subject: [PATCH] fix(core): update main.go to compile with current Core and MCP APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace deprecated patterns with current API conventions: - core.WithName/WithService → core.New() + RegisterService + RegisterAction - mcp.WithWorkspaceRoot/WithWSHub/WithSubsystem → mcp.New(mcp.Options{}) - core.ServiceFor[T] → direct service reference - Add cancellable context and ServiceShutdown to GUI mode - Handle previously-discarded errors from api.New and config.New Co-Authored-By: Virgil --- go.mod | 14 ++++++ go.sum | 2 - main.go | 148 ++++++++++++++++++++++++++++---------------------------- 3 files changed, 87 insertions(+), 77 deletions(-) diff --git a/go.mod b/go.mod index 24abab7..c73cb98 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,10 @@ require ( ) require ( + dappco.re/go/core v0.4.7 // indirect + dappco.re/go/core/io v0.1.7 // indirect + dappco.re/go/core/log v0.0.4 // indirect + dappco.re/go/core/process v0.2.9 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect @@ -174,3 +178,13 @@ require ( gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace forge.lthn.ai/core/mcp => ../../../../core/mcp + +replace dappco.re/go/core => ../../../../core/go + +replace dappco.re/go/core/process => ../../../../core/go-process + +replace dappco.re/go/core/io => ../../../../core/go-io + +replace dappco.re/go/core/log => ../../../../core/go-log diff --git a/go.sum b/go.sum index 8ea66af..eb546c0 100644 --- a/go.sum +++ b/go.sum @@ -24,8 +24,6 @@ forge.lthn.ai/core/go-ws v0.2.5 h1:ZIV7Yrv01R/xpJUogA5vrfP9yB9li1w7EV3eZFMt8h0= forge.lthn.ai/core/go-ws v0.2.5/go.mod h1:C3riJyLLcV6QhLvYlq3P/XkGTsN598qQeGBoLdoHBU4= forge.lthn.ai/core/gui v0.1.5 h1:qelZQQ/6zKvZEKKJ/x9EodjIeFxUW+Z1c7t242U7E3A= forge.lthn.ai/core/gui v0.1.5/go.mod h1:4lB4gdMbLvNBDrxHkIc+Tmb4KURiKSCDQb555HrPkhc= -forge.lthn.ai/core/mcp v0.3.4 h1:I4ubEW8c4Rz+6cfUwwH+6LcuCdvMKKE17LrxXOjCUV8= -forge.lthn.ai/core/mcp v0.3.4/go.mod h1:5Pqn4PBUNOrXj2PPrPzyyjTDp55StAoZgDVCPsVEzvE= github.com/99designs/gqlgen v0.17.88 h1:neMQDgehMwT1vYIOx/w5ZYPUU/iMNAJzRO44I5Intoc= github.com/99designs/gqlgen v0.17.88/go.mod h1:qeqYFEgOeSKqWedOjogPizimp2iu4E23bdPvl4jTYic= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= diff --git a/main.go b/main.go index 7637e6b..ee8560a 100644 --- a/main.go +++ b/main.go @@ -18,8 +18,8 @@ import ( processapi "forge.lthn.ai/core/go-process/pkg/api" "forge.lthn.ai/core/go-ws" "forge.lthn.ai/core/go/pkg/core" - guiMCP "forge.lthn.ai/core/gui/pkg/mcp" "forge.lthn.ai/core/gui/pkg/display" + guiMCP "forge.lthn.ai/core/gui/pkg/mcp" "forge.lthn.ai/core/ide/icons" "forge.lthn.ai/core/mcp/pkg/mcp" "forge.lthn.ai/core/mcp/pkg/mcp/agentic" @@ -41,7 +41,10 @@ func main() { } // ── Configuration ────────────────────────────────────────── - cfg, _ := config.New() + cfg, err := config.New() + if err != nil { + log.Printf("config load failed, using defaults: %v", err) + } cwd, err := os.Getwd() if err != nil { @@ -71,12 +74,15 @@ func main() { if addr := os.Getenv("CORE_API_ADDR"); addr != "" { apiAddr = addr } - engine, _ := api.New( + engine, err := api.New( api.WithAddr(apiAddr), api.WithCORS("*"), api.WithWSHandler(http.Handler(hub.Handler())), api.WithSwagger("Core IDE", "Service Provider API", "0.1.0"), ) + if err != nil { + log.Fatalf("failed to create API engine: %v", err) + } reg.MountAll(engine) // ── Runtime Provider Manager ────────────────────────────── @@ -87,55 +93,49 @@ func main() { engine.Register(NewProvidersAPI(reg, rm)) // ── Core framework ───────────────────────────────────────── - c, err := core.New( - core.WithName("ws", func(c *core.Core) (any, error) { - return hub, nil - }), - core.WithService(display.Register(nil)), // nil platform until Wails starts - core.WithName("mcp", func(c *core.Core) (any, error) { - return mcp.New( - mcp.WithWorkspaceRoot(cwd), - mcp.WithWSHub(hub), - mcp.WithSubsystem(brain.NewDirect()), - mcp.WithSubsystem(agentic.NewPrep()), - mcp.WithSubsystem(guiMCP.New(c)), - ) - }), - ) + c, err := core.New() if err != nil { log.Fatalf("failed to create core: %v", err) } - // Retrieve the MCP service for transport control - mcpSvc, err := core.ServiceFor[*mcp.Service](c, "mcp") + if err := c.RegisterService("ws", hub); err != nil { + log.Fatalf("failed to register ws service: %v", err) + } + + displaySvcAny, err := display.Register(nil)(c) if err != nil { - log.Fatalf("failed to get MCP service: %v", err) + log.Fatalf("failed to create display service: %v", err) + } + if err := c.RegisterService("display", displaySvcAny); err != nil { + log.Fatalf("failed to register display service: %v", err) + } + if ds, ok := displaySvcAny.(*display.Service); ok { + c.RegisterAction(ds.HandleIPCEvents) + } + + mcpSvc, err := mcp.New(mcp.Options{ + WorkspaceRoot: cwd, + WSHub: hub, + Subsystems: []mcp.Subsystem{ + brain.NewDirect(), + agentic.NewPrep(), + guiMCP.New(c), + }, + }) + if err != nil { + log.Fatalf("failed to create MCP service: %v", err) + } + if err := c.RegisterService("mcp", mcpSvc); err != nil { + log.Fatalf("failed to register MCP service: %v", err) } // ── Mode selection ───────────────────────────────────────── if mcpOnly { - // stdio mode — Claude Code connects via --mcp flag - ctx, cancel := signal.NotifyContext(context.Background(), - syscall.SIGINT, syscall.SIGTERM) + ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() - if err := c.ServiceStartup(ctx, nil); err != nil { - log.Fatalf("core startup failed: %v", err) - } - bridge.Start(ctx) - go hub.Run(ctx) - - // Start runtime providers - if err := rm.StartAll(ctx); err != nil { - log.Printf("runtime provider error: %v", err) - } - - // Start API server in background for provider endpoints - go func() { - if err := engine.Serve(ctx); err != nil { - log.Printf("API server error: %v", err) - } - }() + startCore(ctx, c, bridge, hub, rm) + go serveAPI(ctx, engine, apiAddr) if err := mcpSvc.ServeStdio(ctx); err != nil { log.Printf("MCP stdio error: %v", err) @@ -148,29 +148,11 @@ func main() { } if !guiEnabled(cfg) { - // No GUI — run Core with MCP transport in background - ctx, cancel := signal.NotifyContext(context.Background(), - syscall.SIGINT, syscall.SIGTERM) + ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() - if err := c.ServiceStartup(ctx, nil); err != nil { - log.Fatalf("core startup failed: %v", err) - } - bridge.Start(ctx) - go hub.Run(ctx) - - // Start runtime providers - if err := rm.StartAll(ctx); err != nil { - log.Printf("runtime provider error: %v", err) - } - - // Start API server - go func() { - log.Printf("API server listening on %s", apiAddr) - if err := engine.Serve(ctx); err != nil { - log.Printf("API server error: %v", err) - } - }() + startCore(ctx, c, bridge, hub, rm) + go serveAPI(ctx, engine, apiAddr) go func() { if err := mcpSvc.Run(ctx); err != nil { @@ -192,6 +174,8 @@ func main() { log.Fatal(err) } + guiCtx, guiCancel := context.WithCancel(context.Background()) + app := application.New(application.Options{ Name: "Core IDE", Description: "Host UK Core IDE - Development Environment", @@ -205,10 +189,12 @@ func main() { ActivationPolicy: application.ActivationPolicyAccessory, }, OnShutdown: func() { + guiCancel() rm.StopAll() ctx := context.Background() _ = mcpSvc.Shutdown(ctx) bridge.Shutdown() + _ = c.ServiceShutdown(ctx) }, }) @@ -270,24 +256,16 @@ func main() { // Start MCP transport, runtime providers, and API server alongside Wails go func() { - ctx := context.Background() - bridge.Start(ctx) - go hub.Run(ctx) + bridge.Start(guiCtx) + go hub.Run(guiCtx) - // Start runtime providers - if err := rm.StartAll(ctx); err != nil { + if err := rm.StartAll(guiCtx); err != nil { log.Printf("runtime provider error: %v", err) } - // Start API server - go func() { - log.Printf("API server listening on %s", apiAddr) - if err := engine.Serve(ctx); err != nil { - log.Printf("API server error: %v", err) - } - }() + go serveAPI(guiCtx, engine, apiAddr) - if err := mcpSvc.Run(ctx); err != nil { + if err := mcpSvc.Run(guiCtx); err != nil { log.Printf("MCP error: %v", err) } }() @@ -299,6 +277,26 @@ func main() { } } +func startCore(ctx context.Context, c *core.Core, bridge *ide.Bridge, hub *ws.Hub, rm *RuntimeManager) { + if err := c.ServiceStartup(ctx, nil); err != nil { + log.Fatalf("core startup failed: %v", err) + } + bridge.Start(ctx) + go hub.Run(ctx) + if err := rm.StartAll(ctx); err != nil { + log.Printf("runtime provider error: %v", err) + } +} + +func serveAPI(ctx context.Context, engine *api.Engine, addr string) { + if addr != "" { + log.Printf("API server listening on %s", addr) + } + if err := engine.Serve(ctx); err != nil { + log.Printf("API server error: %v", err) + } +} + // guiEnabled checks whether the GUI should start. // Returns false if config says gui.enabled: false, or if no display is available. func guiEnabled(cfg *config.Config) bool {