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