64 lines
2.1 KiB
Go
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)
|
|
}
|