Class: Legion::Extensions::Agentic::Self::NarrativeArc::Helpers::ArcEngine
- Inherits:
-
Object
- Object
- Legion::Extensions::Agentic::Self::NarrativeArc::Helpers::ArcEngine
- Defined in:
- lib/legion/extensions/agentic/self/narrative_arc/helpers/arc_engine.rb
Instance Attribute Summary collapse
-
#arcs ⇒ Object
readonly
Returns the value of attribute arcs.
Instance Method Summary collapse
- #active_arcs ⇒ Object
- #add_beat(arc_id:, content:, intensity: 0.5, beat_type: :rising_action, domain: :general, emotional_charge: 0.0) ⇒ Object
- #arc_report ⇒ Object
- #completed_arcs ⇒ Object
- #create_arc(title:, domain: :general, initial_tension: Constants::DEFAULT_TENSION) ⇒ Object
- #detect_narrative_patterns ⇒ Object
- #get_arc(arc_id) ⇒ Object
-
#initialize ⇒ ArcEngine
constructor
A new instance of ArcEngine.
- #most_dramatic_arc ⇒ Object
- #tension_distribution ⇒ Object
Constructor Details
#initialize ⇒ ArcEngine
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
#arcs ⇒ Object (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_arcs ⇒ Object
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_report ⇒ Object
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_arcs ⇒ Object
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_patterns ⇒ Object
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_arc ⇒ Object
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_distribution ⇒ Object
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 |