Files
Assistant/adapters/models/deterministic.go
T
2026-08-16 15:22:49 +03:00

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}}
}