Merge branch 'agent/fix-ide-main-go-to-compile-with-current' of /Users/snider/Code/.core/workspace/ide-1774137860574616000/src into dev
Some checks failed
Security Scan / security (push) Successful in 14s
Test / test (push) Failing after 20s
Security Scan / security (pull_request) Successful in 11s
Test / test (pull_request) Failing after 25s

# Conflicts:
#	go.mod
#	main.go
This commit is contained in:
Snider 2026-03-22 00:42:16 +00:00
commit daa8b1e477
3 changed files with 82 additions and 78 deletions

8
go.mod
View file

@ -15,7 +15,14 @@ require (
)
require (
<<<<<<< HEAD
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
=======
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
>>>>>>> ff717ef516c6d2261f84b727c409dd050c8e63a6
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ncruces/go-strftime v1.0.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
@ -176,3 +183,4 @@ require (
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

2
go.sum
View file

@ -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=

150
main.go
View file

@ -18,9 +18,9 @@ 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"
"dappco.re/go/core/ide/icons"
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"
"forge.lthn.ai/core/mcp/pkg/mcp/brain"
@ -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 {