Files
ai-agent-scaffold-go/internal/domain/agent/service/armory/runner_node.go

45 lines
1.4 KiB
Go
Raw Normal View History

2026-05-30 23:16:49 +08:00
package armory
import (
"context"
"fmt"
"ai-agent-scaffold-go/internal/domain/agent/model"
"ai-agent-scaffold-go/internal/domain/agent/ports"
)
type RunnerNode struct {
runnerFactory ports.RunnerFactory
registry ports.AgentRegistry
}
func NewRunnerNode(runnerFactory ports.RunnerFactory, registry ports.AgentRegistry) RunnerNode {
return RunnerNode{runnerFactory: runnerFactory, registry: registry}
}
func (n RunnerNode) Apply(ctx context.Context, command model.ArmoryCommand, dynamic *DynamicContext) (model.RegisteredAgent, error) {
runnerConfig := command.Table.Module.Runner
if runnerConfig.AgentName == "" {
return model.RegisteredAgent{}, fmt.Errorf("runner.agent-name is required")
}
agent, ok := dynamic.Agent(runnerConfig.AgentName)
if !ok {
return model.RegisteredAgent{}, fmt.Errorf("runner agent %q not found", runnerConfig.AgentName)
}
runner, err := n.runnerFactory.NewRunner(ctx, command.Table.AppName, agent, runnerConfig.PluginNameList)
if err != nil {
return model.RegisteredAgent{}, err
}
registered := model.RegisteredAgent{
AppName: command.Table.AppName,
AgentID: command.Table.Agent.AgentID,
AgentName: command.Table.Agent.AgentName,
AgentDesc: command.Table.Agent.AgentDesc,
Runner: runner,
}
if err := n.registry.Register(registered); err != nil {
return model.RegisteredAgent{}, err
}
return registered, nil
}