feat: integrar skills en runtime de agentes

Integrar sistema de skills en agents/runtime.go:

- Agregar skillLoader al struct Agent
- Inicializar loader y executor cuando skills.enabled = true
- Registrar skill tools en buildToolRegistry
- Respetar filtro de categorias configurado
- Aplicar timeout configurado para scripts

Las skills quedan disponibles automaticamente para agentes que
las habiliten en su config YAML.

Arquitectura: skills como extension opcional, no dependencia core.
This commit is contained in:
2026-03-08 22:13:32 +00:00
parent aeeb475afb
commit b68ced5c23
+40 -1
View File
@@ -31,6 +31,7 @@ import (
"github.com/enmanuel/agents/shell/matrix" "github.com/enmanuel/agents/shell/matrix"
shellmcp "github.com/enmanuel/agents/shell/mcp" shellmcp "github.com/enmanuel/agents/shell/mcp"
shellmem "github.com/enmanuel/agents/shell/memory" shellmem "github.com/enmanuel/agents/shell/memory"
shellskills "github.com/enmanuel/agents/shell/skills"
"github.com/enmanuel/agents/shell/ssh" "github.com/enmanuel/agents/shell/ssh"
"github.com/enmanuel/agents/tools" "github.com/enmanuel/agents/tools"
toolclock "github.com/enmanuel/agents/tools/clock" toolclock "github.com/enmanuel/agents/tools/clock"
@@ -40,6 +41,7 @@ import (
toolmatrix "github.com/enmanuel/agents/tools/matrix" toolmatrix "github.com/enmanuel/agents/tools/matrix"
toolmcp "github.com/enmanuel/agents/tools/mcptools" toolmcp "github.com/enmanuel/agents/tools/mcptools"
toolmemory "github.com/enmanuel/agents/tools/memorytools" toolmemory "github.com/enmanuel/agents/tools/memorytools"
toolskills "github.com/enmanuel/agents/tools/skilltools"
toolssh "github.com/enmanuel/agents/tools/ssh" toolssh "github.com/enmanuel/agents/tools/ssh"
toolweather "github.com/enmanuel/agents/tools/weather" toolweather "github.com/enmanuel/agents/tools/weather"
) )
@@ -95,6 +97,9 @@ type Agent struct {
// Shared knowledge store — non-nil when shared_knowledge is enabled // Shared knowledge store — non-nil when shared_knowledge is enabled
sharedKnowledgeStore *shellknowledge.FileStore sharedKnowledgeStore *shellknowledge.FileStore
// Skills loader — non-nil when skills are enabled
skillLoader *shellskills.Loader
// Sanitization options — nil when sanitization is disabled // Sanitization options — nil when sanitization is disabled
sanitizeOpts *sanitize.Options sanitizeOpts *sanitize.Options
@@ -277,8 +282,28 @@ func New(cfg *config.AgentConfig, rules []decision.Rule, agentACL acl.ACL, logge
} }
} }
// Skills loader
var skillLoader *shellskills.Loader
var skillExecutor *shellskills.Executor
if cfg.Skills.Enabled {
skillsPath := cfg.Skills.SkillsPath
if skillsPath == "" {
skillsPath = "skills/"
}
skillLoader = shellskills.NewLoader(skillsPath)
// Skills executor for scripts
allowedInterpreters := cfg.Tools.Skills.AllowedInterpreters
timeout := cfg.Skills.Timeout
if timeout == 0 {
timeout = 60 * time.Second
}
skillExecutor = shellskills.NewExecutor(allowedInterpreters, timeout)
logger.Info("skills enabled", "path", skillsPath, "categories", cfg.Skills.Categories)
}
// Tool registry — register tools enabled in config // Tool registry — register tools enabled in config
toolReg := buildToolRegistry(cfg, sshExec, matrixClient, memStore, kStore, sharedKStore, mcpManager, roomCtx, logger) toolReg := buildToolRegistry(cfg, sshExec, matrixClient, memStore, kStore, sharedKStore, mcpManager, skillLoader, skillExecutor, roomCtx, logger)
// Rate limiting for tools // Rate limiting for tools
if cfg.Security.ToolRateLimit.Enabled { if cfg.Security.ToolRateLimit.Enabled {
@@ -322,6 +347,7 @@ func New(cfg *config.AgentConfig, rules []decision.Rule, agentACL acl.ACL, logge
memStore: memStore, memStore: memStore,
knowledgeStore: kStore, knowledgeStore: kStore,
sharedKnowledgeStore: sharedKStore, sharedKnowledgeStore: sharedKStore,
skillLoader: skillLoader,
windowSize: windowSize, windowSize: windowSize,
roomCtx: roomCtx, roomCtx: roomCtx,
} }
@@ -1031,6 +1057,8 @@ func buildToolRegistry(
kStore *shellknowledge.FileStore, kStore *shellknowledge.FileStore,
sharedKStore *shellknowledge.FileStore, sharedKStore *shellknowledge.FileStore,
mcpManager *shellmcp.Manager, mcpManager *shellmcp.Manager,
skillLoader *shellskills.Loader,
skillExecutor *shellskills.Executor,
roomCtx *toolmemory.RoomContext, roomCtx *toolmemory.RoomContext,
logger *slog.Logger, logger *slog.Logger,
) *tools.Registry { ) *tools.Registry {
@@ -1116,5 +1144,16 @@ func buildToolRegistry(
} }
} }
// Skills tools — register skill search, load, read, and run tools
if skillLoader != nil {
reg.Register(toolskills.NewSkillSearch(skillLoader, cfg.Skills.Categories))
reg.Register(toolskills.NewSkillLoad(skillLoader))
reg.Register(toolskills.NewSkillReadResource(skillLoader))
if skillExecutor != nil {
reg.Register(toolskills.NewSkillRunScript(skillLoader, skillExecutor))
}
logger.Debug("registered skills tools")
}
return reg return reg
} }