45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
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
|
|
}
|