Class: Legion::Extensions::Agentic::Self::NarrativeArc::Helpers::ArcEngine

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeArcEngine

Returns a new instance of ArcEngine.



12
13
14
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 12

def initialize
  @arcs = {}
end

Instance Attribute Details

#arcsObject (readonly)

Returns the value of attribute arcs.



10
11
12
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 10

def arcs
  @arcs
end

Instance Method Details

#active_arcsObject



48
49
50
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 48

def active_arcs
  @arcs.values.reject(&:complete?)
end

#add_beat(arc_id:, content:, intensity: 0.5, beat_type: :rising_action, domain: :general, emotional_charge: 0.0) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 24

def add_beat(arc_id:, content:, intensity: 0.5, beat_type: :rising_action,
             domain: :general, emotional_charge: 0.0)
  arc = @arcs[arc_id]
  return { success: false, reason: :arc_not_found } unless arc

  beat = BeatEvent.new(
    content:          content,
    intensity:        intensity,
    beat_type:        beat_type,
    domain:           domain,
    emotional_charge: emotional_charge
  )

  added = arc.add_beat!(beat)
  return { success: false, reason: :arc_full_or_complete } unless added

  { success: true, beat_id: beat.beat_id, arc_phase: arc.arc_phase,
    tension_level: arc.tension_level }
end

#arc_reportObject



84
85
86
87
88
89
90
91
92
93
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 84

def arc_report
  {
    total_arcs:    @arcs.size,
    active:        active_arcs.size,
    completed:     completed_arcs.size,
    patterns:      detect_narrative_patterns,
    tension_dist:  tension_distribution,
    most_dramatic: most_dramatic_arc&.to_h
  }
end

#completed_arcsObject



52
53
54
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 52

def completed_arcs
  @arcs.values.select(&:complete?)
end

#create_arc(title:, domain: :general, initial_tension: Constants::DEFAULT_TENSION) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 16

def create_arc(title:, domain: :general, initial_tension: Constants::DEFAULT_TENSION)
  return nil if @arcs.size >= Constants::MAX_ARCS

  arc = Arc.new(title: title, domain: domain, initial_tension: initial_tension)
  @arcs[arc.arc_id] = arc
  arc
end

#detect_narrative_patternsObject



73
74
75
76
77
78
79
80
81
82
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 73

def detect_narrative_patterns
  return [] if @arcs.size < 2

  patterns = []
  patterns << :recurring_crisis if recurring_beat_pattern?(:crisis)
  patterns << :recurring_climax if recurring_beat_pattern?(:climax)
  patterns << :unresolved_tension if unresolved_high_tension?
  patterns << :rapid_resolution if rapid_resolution_pattern?
  patterns
end

#get_arc(arc_id) ⇒ Object



44
45
46
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 44

def get_arc(arc_id)
  @arcs[arc_id]
end

#most_dramatic_arcObject



56
57
58
59
60
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 56

def most_dramatic_arc
  return nil if @arcs.empty?

  @arcs.values.max_by(&:dramatic_score)
end

#tension_distributionObject



62
63
64
65
66
67
68
69
70
71
# File 'lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb', line 62

def tension_distribution
  return {} if @arcs.empty?

  counts = Hash.new(0)
  @arcs.each_value do |arc|
    label = arc.tension_label
    counts[label] += 1
  end
  counts
end