Class: Legion::Extensions::Agentic::Social::Governance::Helpers::Proposal

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/social/governance/helpers/proposal.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeProposal

Returns a new instance of Proposal.



14
15
16
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 14

def initialize
  @proposals = {}
end

Instance Attribute Details

#proposalsObject (readonly)

Returns the value of attribute proposals.



12
13
14
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 12

def proposals
  @proposals
end

Instance Method Details

#create(category:, description:, proposer:, council_size: Layers::MIN_COUNCIL_SIZE) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 18

def create(category:, description:, proposer:, council_size: Layers::MIN_COUNCIL_SIZE)
  id = SecureRandom.uuid
  @proposals[id] = {
    proposal_id:   id,
    category:      category,
    description:   description,
    proposer:      proposer,
    council_size:  council_size,
    votes_for:     [],
    votes_against: [],
    status:        :open,
    created_at:    Time.now.utc,
    resolved_at:   nil
  }
  id
end

#get(proposal_id) ⇒ Object



52
53
54
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 52

def get(proposal_id)
  @proposals[proposal_id]
end

#open_proposalsObject



56
57
58
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 56

def open_proposals
  @proposals.values.select { |p| p[:status] == :open }
end

#resolve_timed_out(proposal_id) ⇒ Object



60
61
62
63
64
65
66
67
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 60

def resolve_timed_out(proposal_id)
  prop = @proposals[proposal_id]
  return nil unless prop && prop[:status] == :open

  prop[:status]      = :timed_out
  prop[:resolved_at] = Time.now.utc
  prop
end

#vote(proposal_id, voter:, approve:) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/legion/extensions/agentic/social/governance/helpers/proposal.rb', line 35

def vote(proposal_id, voter:, approve:)
  prop = @proposals[proposal_id]
  return nil unless prop && prop[:status] == :open

  # Prevent double-voting
  all_voters = prop[:votes_for] + prop[:votes_against]
  return :already_voted if all_voters.include?(voter)

  if approve
    prop[:votes_for] << voter
  else
    prop[:votes_against] << voter
  end

  check_resolution(proposal_id)
end