Files
Agent-System-Backend/internal/cardsvc/task_projection.go
T

64 lines
2.1 KiB
Go

package cardsvc
import (
"agent-system-backend/internal/store"
core "agent-system-core"
"time"
)
func taskCardState(task core.TaskSnapshot) (core.CardStatus, string) {
switch task.ExecutionState {
case "completed":
return core.CardDone, "ok"
case "failed", "interrupted":
return core.CardFailed, "danger"
case "awaiting_user":
return core.CardActionRequired, "warn"
default:
return core.CardActive, "info"
}
}
func (s *Service) commitProjection(w store.TaskProjectionWrite) error {
if s.TaskCommitter != nil {
_, err := s.TaskCommitter(w)
return err
}
_, err := s.st.CommitTaskProjection(w)
return err
}
func (s *Service) taskChannels(card core.ActivityCard) []string {
channels := []string{card.ConversationID}
if s.MirrorConvCards && card.ProjectID != "" {
channels = append(channels, string(core.ProjectChannelKey(card.ProjectID)))
}
return channels
}
func (s *Service) CommitTask(owner string, next core.TaskSnapshot, expectedRevision int64) error {
return s.CommitTaskSources(owner, next, expectedRevision, nil)
}
func (s *Service) CommitTaskSources(owner string, next core.TaskSnapshot, expectedRevision int64, witnesses []store.ArtifactWitness) error {
c, version, err := s.st.GetCardVersion(owner, next.CardID)
if err != nil {
return err
}
c.Task = &next
c.SourceRunID = next.RunID
c.Body = next.SummaryBody()
c.Status, c.Tone = taskCardState(next)
c.UpdatedAt = time.Now().UTC()
return s.commitProjection(store.TaskProjectionWrite{Owner: owner, Card: c, ExpectedCardVersion: version, ExpectedTaskRevision: expectedRevision, SourceWitnesses: witnesses, Channels: s.taskChannels(c)})
}
func (s *Service) CreateTask(owner string, card core.ActivityCard, ref string) (core.ActivityCard, error) {
if card.Task == nil {
return card, store.ErrConflict
}
card.Status, card.Tone = taskCardState(*card.Task)
card.Body = card.Task.SummaryBody()
card.CreatedAt = time.Now().UTC()
card.UpdatedAt = card.CreatedAt
if err := s.commitProjection(store.TaskProjectionWrite{Owner: owner, Card: card, Ref: ref, Channels: s.taskChannels(card)}); err != nil {
return card, err
}
return s.st.GetCard(owner, card.ID)
}