Files
Assistant/modules/work/domain/lease.go
2026-08-22 12:03:21 +03:00

49 lines
2.4 KiB
Go

package domain
import (
"errors"
"time"
"git.cin.su/m/Assistant/contracts/work"
)
var ErrLeaseRejected = errors.New("agent lease rejected")
var ErrCallbackRejected = errors.New("agent callback rejected")
func AcquireAgentLease(runID work.AgentRunID, workerID string, token work.AgentFencingToken, now time.Time, ttl time.Duration) (work.AgentLease, error) {
if runID == "" || workerID == "" || token == 0 || now.IsZero() || ttl <= 0 {
return work.AgentLease{}, ErrLeaseRejected
}
return work.AgentLease{ID: work.AgentLeaseID(string(runID) + ":" + workerID), RunID: runID, WorkerID: workerID, FencingToken: token, State: work.AgentLeaseActive, AcquiredAt: now, ExpiresAt: now.Add(ttl)}, nil
}
func RenewAgentLease(lease work.AgentLease, workerID string, token work.AgentFencingToken, now time.Time, ttl time.Duration) (work.AgentLease, error) {
if lease.State != work.AgentLeaseActive || lease.WorkerID != workerID || lease.FencingToken != token || now.IsZero() || !now.Before(lease.ExpiresAt) || ttl <= 0 {
return work.AgentLease{}, ErrLeaseRejected
}
lease.ExpiresAt = now.Add(ttl)
return lease, nil
}
func ValidateAgentCallback(callback work.AgentCallback, lease work.AgentLease, lastSequence uint64) error {
if lease.State != work.AgentLeaseActive || callback.RunID == "" || callback.RunID != lease.RunID || callback.WorkerID == "" || callback.WorkerID != lease.WorkerID || callback.FencingToken == 0 || callback.FencingToken != lease.FencingToken || callback.Sequence <= lastSequence || callback.Kind == "" || callback.ObservedAt.IsZero() || !callback.ObservedAt.Before(lease.ExpiresAt) {
return ErrCallbackRejected
}
return nil
}
func ValidateIndependentVerification(value work.IndependentVerification) error {
if value.ProducerRunID == "" || value.VerifierRunID == "" || value.ProducerRunID == value.VerifierRunID || value.VerifierIdentity == "" || value.ArtifactID == "" || value.TestEvidenceRef == "" || value.Summary == "" {
return ErrCallbackRejected
}
return nil
}
func ValidateDispatchIntent(value work.AgentDispatchIntent) error {
if value.DispatchID == "" || value.IdempotencyKey == "" || value.DelegationID == "" || value.RunID == "" || value.ImplementationID == "" || value.ImplementationRevision < 1 || value.SourceRevision == "" || value.WorktreeID == "" || value.VerificationPlanRef == "" || value.CreatedAtUnixMillis < 1 {
return ErrCallbackRejected
}
return nil
}