34 lines
1.3 KiB
Go
34 lines
1.3 KiB
Go
package models
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
|
|
"git.cin.su/m/Assistant/contracts/capability"
|
|
commitcontract "git.cin.su/m/Assistant/contracts/commit"
|
|
"git.cin.su/m/Assistant/contracts/identity"
|
|
"git.cin.su/m/Assistant/contracts/work"
|
|
"git.cin.su/m/Assistant/platform/ids"
|
|
)
|
|
|
|
// DeterministicRequest is already target-bound. The adapter performs no text
|
|
// routing and emits a candidate only; Commit remains the execution boundary.
|
|
type DeterministicRequest struct {
|
|
ActorID identity.ActorID
|
|
CapabilityID capability.CapabilityID
|
|
Target work.TaskTarget
|
|
Operation commitcontract.ExternalOperation
|
|
}
|
|
|
|
type Candidate struct {
|
|
Proposal commitcontract.ActionProposal
|
|
Seed string
|
|
}
|
|
|
|
func Propose(request DeterministicRequest) Candidate {
|
|
seed := string(request.ActorID) + "|" + string(request.CapabilityID) + "|" + string(request.Target.TaskID) + "|" + string(request.Target.GoalID) + "|" + string(request.Target.ScopeID) + "|" + string(request.Operation)
|
|
digest := sha256.Sum256([]byte(seed))
|
|
intent := commitcontract.ActionIntentID(ids.ID(hex.EncodeToString(digest[:16])))
|
|
return Candidate{Seed: hex.EncodeToString(digest[:]), Proposal: commitcontract.ActionProposal{IntentID: intent, ActorID: request.ActorID, CapabilityID: request.CapabilityID, Target: request.Target, Operation: request.Operation, State: commitcontract.ActionProposed}}
|
|
}
|