mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-10-20 02:17:24 +00:00
fix: spawn tool not registered when providers configured via database (#103)
This commit is contained in:
1 parent
7436d6b646
commit
885814ddd1
1 file changed
+52
-52
+52
-52
@@ -193,58 +193,6 @@ func runGateway() {
|
||||
slog.Info("MCP servers initialized", "configured", len(cfg.Tools.McpServers), "tools", len(mcpMgr.ToolNames()))
|
||||
}
|
||||
|
||||
// Subagent system
|
||||
subagentMgr := setupSubagents(providerRegistry, cfg, msgBus, toolsReg, workspace, sandboxMgr)
|
||||
if subagentMgr != nil {
|
||||
// Wire announce queue for batched subagent result delivery (matching TS debounce pattern)
|
||||
announceQueue := tools.NewAnnounceQueue(1000, 20,
|
||||
func(sessionKey string, items []tools.AnnounceQueueItem, meta tools.AnnounceMetadata) {
|
||||
remainingActive := subagentMgr.CountRunningForParent(meta.ParentAgent)
|
||||
content := tools.FormatBatchedAnnounce(items, remainingActive)
|
||||
senderID := fmt.Sprintf("subagent:batch-%d", len(items))
|
||||
label := items[0].Label
|
||||
if len(items) > 1 {
|
||||
label = fmt.Sprintf("%d tasks", len(items))
|
||||
}
|
||||
batchMeta := map[string]string{
|
||||
"origin_channel": meta.OriginChannel,
|
||||
"origin_peer_kind": meta.OriginPeerKind,
|
||||
"parent_agent": meta.ParentAgent,
|
||||
"subagent_label": label,
|
||||
"origin_trace_id": meta.OriginTraceID,
|
||||
"origin_root_span_id": meta.OriginRootSpanID,
|
||||
}
|
||||
if meta.OriginLocalKey != "" {
|
||||
batchMeta["origin_local_key"] = meta.OriginLocalKey
|
||||
}
|
||||
if meta.OriginSessionKey != "" {
|
||||
batchMeta["origin_session_key"] = meta.OriginSessionKey
|
||||
}
|
||||
// Collect media from all items in the batch.
|
||||
var batchMedia []bus.MediaFile
|
||||
for _, item := range items {
|
||||
batchMedia = append(batchMedia, item.Media...)
|
||||
}
|
||||
msgBus.PublishInbound(bus.InboundMessage{
|
||||
Channel: "system",
|
||||
SenderID: senderID,
|
||||
ChatID: meta.OriginChatID,
|
||||
Content: content,
|
||||
UserID: meta.OriginUserID,
|
||||
Metadata: batchMeta,
|
||||
Media: batchMedia,
|
||||
})
|
||||
},
|
||||
func(parentID string) int {
|
||||
return subagentMgr.CountRunningForParent(parentID)
|
||||
},
|
||||
)
|
||||
subagentMgr.SetAnnounceQueue(announceQueue)
|
||||
|
||||
toolsReg.Register(tools.NewSpawnTool(subagentMgr, "default", 0))
|
||||
slog.Info("subagent system enabled", "tools", []string{"spawn"})
|
||||
}
|
||||
|
||||
// Exec approval system — always active (deny patterns + safe bins + configurable ask mode)
|
||||
var execApprovalMgr *tools.ExecApprovalManager
|
||||
{
|
||||
@@ -445,6 +393,58 @@ func runGateway() {
|
||||
slog.Info("bootstrap context files", "count", len(contextFiles), "files", loadedNames)
|
||||
}
|
||||
|
||||
// Subagent system
|
||||
subagentMgr := setupSubagents(providerRegistry, cfg, msgBus, toolsReg, workspace, sandboxMgr)
|
||||
if subagentMgr != nil {
|
||||
// Wire announce queue for batched subagent result delivery (matching TS debounce pattern)
|
||||
announceQueue := tools.NewAnnounceQueue(1000, 20,
|
||||
func(sessionKey string, items []tools.AnnounceQueueItem, meta tools.AnnounceMetadata) {
|
||||
remainingActive := subagentMgr.CountRunningForParent(meta.ParentAgent)
|
||||
content := tools.FormatBatchedAnnounce(items, remainingActive)
|
||||
senderID := fmt.Sprintf("subagent:batch-%d", len(items))
|
||||
label := items[0].Label
|
||||
if len(items) > 1 {
|
||||
label = fmt.Sprintf("%d tasks", len(items))
|
||||
}
|
||||
batchMeta := map[string]string{
|
||||
"origin_channel": meta.OriginChannel,
|
||||
"origin_peer_kind": meta.OriginPeerKind,
|
||||
"parent_agent": meta.ParentAgent,
|
||||
"subagent_label": label,
|
||||
"origin_trace_id": meta.OriginTraceID,
|
||||
"origin_root_span_id": meta.OriginRootSpanID,
|
||||
}
|
||||
if meta.OriginLocalKey != "" {
|
||||
batchMeta["origin_local_key"] = meta.OriginLocalKey
|
||||
}
|
||||
if meta.OriginSessionKey != "" {
|
||||
batchMeta["origin_session_key"] = meta.OriginSessionKey
|
||||
}
|
||||
// Collect media from all items in the batch.
|
||||
var batchMedia []bus.MediaFile
|
||||
for _, item := range items {
|
||||
batchMedia = append(batchMedia, item.Media...)
|
||||
}
|
||||
msgBus.PublishInbound(bus.InboundMessage{
|
||||
Channel: "system",
|
||||
SenderID: senderID,
|
||||
ChatID: meta.OriginChatID,
|
||||
Content: content,
|
||||
UserID: meta.OriginUserID,
|
||||
Metadata: batchMeta,
|
||||
Media: batchMedia,
|
||||
})
|
||||
},
|
||||
func(parentID string) int {
|
||||
return subagentMgr.CountRunningForParent(parentID)
|
||||
},
|
||||
)
|
||||
subagentMgr.SetAnnounceQueue(announceQueue)
|
||||
|
||||
toolsReg.Register(tools.NewSpawnTool(subagentMgr, "default", 0))
|
||||
slog.Info("subagent system enabled", "tools", []string{"spawn"})
|
||||
}
|
||||
|
||||
// Skills loader + search tool
|
||||
// Global skills live under ~/.goclaw/skills/ (user-managed), not data/skills/.
|
||||
globalSkillsDir := os.Getenv("GOCLAW_SKILLS_DIR")
|
||||
|
||||
Reference in new issue
Block a user