90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
package acp
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
|
|
"xworkmate-bridge/internal/gatewayruntime"
|
|
"xworkmate-bridge/internal/memory"
|
|
)
|
|
|
|
// Bootstrap initializes the control plane components
|
|
func (s *Server) Bootstrap() {
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
config, providerCatalog, providerOrder := newProductionProviderCatalogFromConfig(s.config)
|
|
s.config = config
|
|
s.providerOrder = providerOrder
|
|
|
|
if s.gateway == nil {
|
|
s.gateway = gatewayruntime.NewManager()
|
|
}
|
|
|
|
homeDir, _ := os.UserHomeDir()
|
|
s.memoryService = memory.NewService(homeDir)
|
|
|
|
s.routingEngine = &DefaultRoutingEngine{server: s}
|
|
s.orchestrator = NewSessionOrchestrator(s)
|
|
s.providers = make(map[string]ProviderCompat)
|
|
s.sessions = make(map[string]*session)
|
|
|
|
for id, p := range providerCatalog {
|
|
if p.Enabled {
|
|
s.providers[id] = newProviderCompat(p)
|
|
}
|
|
}
|
|
|
|
// Build Initial Catalog
|
|
s.catalog = &CapabilityCatalog{
|
|
ProviderCatalog: make([]any, 0),
|
|
GatewayProviders: []any{
|
|
map[string]any{
|
|
"providerId": "openclaw",
|
|
"label": "OpenClaw",
|
|
"targets": []string{"gateway"},
|
|
"providerDisplay": map[string]any{"logoEmoji": "🦞"},
|
|
},
|
|
},
|
|
AvailableExecutionTargets: []any{"agent", "gateway"},
|
|
ProviderProbeSummary: make([]any, 0),
|
|
}
|
|
|
|
for _, id := range providerOrder {
|
|
p, ok := providerCatalog[id]
|
|
if !ok || !p.Enabled {
|
|
continue
|
|
}
|
|
category := "native"
|
|
if id == "gemini" || id == "hermes" {
|
|
category = "protocol-adapter"
|
|
}
|
|
s.catalog.ProviderCatalog = append(s.catalog.ProviderCatalog, map[string]any{
|
|
"providerId": id,
|
|
"label": p.Label,
|
|
"targets": []string{"agent"},
|
|
"category": category,
|
|
})
|
|
if compat, ok := s.providers[id]; ok {
|
|
probe := compat.Probe(context.Background())
|
|
s.catalog.ProviderProbeSummary = append(s.catalog.ProviderProbeSummary, map[string]any{
|
|
"providerId": id,
|
|
"available": probe.Available,
|
|
"status": probe.Status,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *Server) getAvailableProviderIDs() []string {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
var ids []string
|
|
for _, id := range s.providerOrder {
|
|
if _, ok := s.providers[id]; ok {
|
|
ids = append(ids, id)
|
|
}
|
|
}
|
|
return ids
|
|
}
|