package agentsvc import ( "slices" llmgwv1 "gitea.mynodes.xyz/ilker/llmgw/api/gen/llmgw/v1" ) // TrainHandler is told how training jobs on the nodes go (BACKLOG F4). type TrainHandler interface { OnTrainStatus(node string, st *llmgwv1.TrainStatus) OnTrainArtifact(node string, a *llmgwv1.TrainArtifact) // OnNodeGone is a node's stream ending: a job running there ended with // it. OnNodeGone(node string) } // SetTrain gives the service what training jobs' messages go to. func (s *Service) SetTrain(h TrainHandler) { s.mu.Lock() s.train = h s.mu.Unlock() } func (s *Service) trainHandler() TrainHandler { s.mu.RLock() defer s.mu.RUnlock() return s.train } // Send gives a connected node's agent a command. func (s *Service) Send(node string, msg *llmgwv1.ControlMessage) error { return s.send(node, msg) } // Connected is whether a node's agent holds a stream to this control plane. func (s *Service) Connected(node string) bool { return slices.Contains(s.ConnectedNodes(), node) }