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 }