mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
78fd080189
Add a non-blocking runtime publish path and switch hot-path publishers to it. Enforce subscription timeout boundaries, keep ordered subscriber snapshots up to date on subscribe changes, expose all runtime kinds to process hooks, add safe log attrs for non-agent events, and close the gateway message bus on full shutdown.
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package mcp
|
|
|
|
import (
|
|
"github.com/sipeed/picoclaw/pkg/config"
|
|
runtimeevents "github.com/sipeed/picoclaw/pkg/events"
|
|
)
|
|
|
|
func (m *Manager) publishServerEvent(
|
|
kind runtimeevents.Kind,
|
|
serverName string,
|
|
cfg config.MCPServerConfig,
|
|
toolCount int,
|
|
err error,
|
|
) {
|
|
if m == nil || m.runtimeEvents == nil {
|
|
return
|
|
}
|
|
|
|
severity := runtimeevents.SeverityInfo
|
|
if err != nil {
|
|
severity = runtimeevents.SeverityError
|
|
}
|
|
payload := ServerEventPayload{
|
|
Server: serverName,
|
|
Type: mcpTransportType(cfg),
|
|
URL: cfg.URL,
|
|
Command: cfg.Command,
|
|
ToolCount: toolCount,
|
|
}
|
|
if err != nil {
|
|
payload.Error = err.Error()
|
|
}
|
|
|
|
m.runtimeEvents.PublishNonBlocking(runtimeevents.Event{
|
|
Kind: kind,
|
|
Source: runtimeevents.Source{Component: "mcp", Name: serverName},
|
|
Severity: severity,
|
|
Payload: payload,
|
|
Attrs: mcpServerEventAttrs(payload),
|
|
})
|
|
}
|
|
|
|
func (m *Manager) publishToolDiscovered(serverName string, cfg config.MCPServerConfig, toolName string) {
|
|
if m == nil || m.runtimeEvents == nil {
|
|
return
|
|
}
|
|
payload := ServerEventPayload{
|
|
Server: serverName,
|
|
Type: mcpTransportType(cfg),
|
|
URL: cfg.URL,
|
|
Command: cfg.Command,
|
|
Tool: toolName,
|
|
}
|
|
m.runtimeEvents.PublishNonBlocking(runtimeevents.Event{
|
|
Kind: runtimeevents.KindMCPToolDiscovered,
|
|
Source: runtimeevents.Source{Component: "mcp", Name: serverName},
|
|
Severity: runtimeevents.SeverityInfo,
|
|
Payload: payload,
|
|
Attrs: mcpServerEventAttrs(payload),
|
|
})
|
|
}
|
|
|
|
func mcpServerEventAttrs(payload ServerEventPayload) map[string]any {
|
|
attrs := map[string]any{}
|
|
setMCPAttrString(attrs, "server", payload.Server)
|
|
setMCPAttrString(attrs, "type", payload.Type)
|
|
setMCPAttrString(attrs, "tool", payload.Tool)
|
|
if payload.ToolCount > 0 {
|
|
attrs["tool_count"] = payload.ToolCount
|
|
}
|
|
setMCPAttrString(attrs, "error", payload.Error)
|
|
return attrs
|
|
}
|
|
|
|
func setMCPAttrString(attrs map[string]any, key, value string) {
|
|
if value != "" {
|
|
attrs[key] = value
|
|
}
|
|
}
|
|
|
|
func mcpTransportType(cfg config.MCPServerConfig) string {
|
|
if cfg.Type != "" {
|
|
return cfg.Type
|
|
}
|
|
if cfg.URL != "" {
|
|
return "sse"
|
|
}
|
|
if cfg.Command != "" {
|
|
return "stdio"
|
|
}
|
|
return ""
|
|
}
|