fix(agent): enforce frontmatter policy for runtime tools

This commit is contained in:
Anton Bogdanovich 2026-05-09 12:37:52 -07:00
parent 133c3cef14
commit a450bb4b8b

View file

@ -114,7 +114,7 @@ func registerSharedTools(
if err != nil {
logger.ErrorCF("agent", "Failed to create web search tool", map[string]any{"error": err.Error()})
} else if searchTool != nil {
agent.Tools.Register(searchTool)
registerToolIfAllowed(agent, searchTool)
}
}
if cfg.Tools.IsToolEnabled("web_fetch") {
@ -127,19 +127,19 @@ func registerSharedTools(
if err != nil {
logger.ErrorCF("agent", "Failed to create web fetch tool", map[string]any{"error": err.Error()})
} else {
agent.Tools.Register(fetchTool)
registerToolIfAllowed(agent, fetchTool)
}
}
// Hardware tools (I2C, SPI) - Linux only, returns error on other platforms
if cfg.Tools.IsToolEnabled("i2c") {
agent.Tools.Register(tools.NewI2CTool())
registerToolIfAllowed(agent, tools.NewI2CTool())
}
if cfg.Tools.IsToolEnabled("spi") {
agent.Tools.Register(tools.NewSPITool())
registerToolIfAllowed(agent, tools.NewSPITool())
}
if cfg.Tools.IsToolEnabled("serial") {
agent.Tools.Register(tools.NewSerialTool())
registerToolIfAllowed(agent, tools.NewSerialTool())
}
// Message tool
@ -166,7 +166,7 @@ func registerSharedTools(
ReplyToMessageID: replyToMessageID,
})
})
agent.Tools.Register(messageTool)
registerToolIfAllowed(agent, messageTool)
}
if cfg.Tools.IsToolEnabled("reaction") {
reactionTool := tools.NewReactionTool()
@ -185,7 +185,7 @@ func registerSharedTools(
_, err := rc.ReactToMessage(ctx, chatID, messageID)
return err
})
agent.Tools.Register(reactionTool)
registerToolIfAllowed(agent, reactionTool)
}
// Send file tool (outbound media via MediaStore — store injected later by SetMediaStore)
@ -197,11 +197,11 @@ func registerSharedTools(
nil,
allowReadPaths,
)
agent.Tools.Register(sendFileTool)
registerToolIfAllowed(agent, sendFileTool)
}
if ttsProvider != nil {
agent.Tools.Register(tools.NewSendTTSTool(ttsProvider, nil))
registerToolIfAllowed(agent, tools.NewSendTTSTool(ttsProvider, nil))
}
if cfg.Tools.IsToolEnabled("load_image") {
@ -212,7 +212,7 @@ func registerSharedTools(
nil,
allowReadPaths,
)
agent.Tools.Register(loadImageTool)
registerToolIfAllowed(agent, loadImageTool)
}
// Skill discovery and installation tools
@ -227,11 +227,11 @@ func registerSharedTools(
cfg.Tools.Skills.SearchCache.MaxSize,
time.Duration(cfg.Tools.Skills.SearchCache.TTLSeconds)*time.Second,
)
agent.Tools.Register(tools.NewFindSkillsTool(registryMgr, searchCache))
registerToolIfAllowed(agent, tools.NewFindSkillsTool(registryMgr, searchCache))
}
if install_skills_enable {
agent.Tools.Register(tools.NewInstallSkillTool(registryMgr, agent.Workspace))
registerToolIfAllowed(agent, tools.NewInstallSkillTool(registryMgr, agent.Workspace))
}
}
@ -324,15 +324,15 @@ func registerSharedTools(
return registry.CanSpawnSubagent(currentAgentID, targetAgentID)
})
agent.Tools.Register(spawnTool)
registerToolIfAllowed(agent, spawnTool)
// Also register the synchronous subagent tool
subagentTool := tools.NewSubagentTool(subagentManager)
subagentTool.SetSpawner(NewSubTurnSpawner(al))
agent.Tools.Register(subagentTool)
registerToolIfAllowed(agent, subagentTool)
}
if spawnStatusEnabled {
agent.Tools.Register(tools.NewSpawnStatusTool(subagentManager))
registerToolIfAllowed(agent, tools.NewSpawnStatusTool(subagentManager))
}
} else if (spawnEnabled || spawnStatusEnabled) && !cfg.Tools.IsToolEnabled("subagent") {
logger.WarnCF("agent", "spawn/spawn_status tools require subagent to be enabled", nil)
@ -350,7 +350,7 @@ func registerSharedTools(
delegateTool.SetAllowlistChecker(func(targetAgentID string) bool {
return registry.CanSpawnSubagent(currentAgentID, targetAgentID)
})
agent.Tools.Register(delegateTool)
registerToolIfAllowed(agent, delegateTool)
}
warnOnUnknownAgentToolDeclarations(agentID, agent.Workspace, agent.Definition, agent.Tools)