File size: 4,449 Bytes
1640d7b
bea66c7
1640d7b
 
7b8b1dc
1640d7b
 
7b8b1dc
 
 
 
 
 
bea66c7
 
7b8b1dc
 
712720b
7b8b1dc
 
 
 
 
 
 
 
 
1640d7b
7b8b1dc
 
 
bea66c7
7b8b1dc
bea66c7
7b8b1dc
bea66c7
1640d7b
7b8b1dc
 
 
 
 
 
712720b
bea66c7
7b8b1dc
 
 
 
 
 
03cc10b
7b8b1dc
03cc10b
7b8b1dc
 
 
 
 
 
712720b
7b8b1dc
 
 
03cc10b
7b8b1dc
 
 
 
 
 
 
03cc10b
 
 
 
 
 
 
 
 
712720b
7b8b1dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1640d7b
bea66c7
7b8b1dc
bea66c7
7b8b1dc
bea66c7
 
7b8b1dc
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# core/codex_informer.py
# Master Emotional Core (MEC) - Codex Informer v3 (Memory-Optimized)

import yaml
import random

class CodexInformer:
    def __init__(
        self,
        emotion_families_path='config/emotion_families.yaml',
        arc_mapping_path='config/arc_mapping.yaml',
        resonance_mapping_path='config/resonance_mapping.yaml'
    ):
        # Load emotion families YAML
        with open(emotion_families_path, 'r', encoding='utf-8') as f:
            data = yaml.safe_load(f)
        self.emotion_families = data.get('emotion_families', [])

        # Build lookup maps
        self.family_lookup = {}      # code -> True
        self.family_names  = {}      # code -> human-readable name

        for family in self.emotion_families:
            code = family['code']
            name = family.get('name', code)
            self.family_lookup[code] = True
            self.family_names[code] = name

        # Load arc & resonance mappings
        with open(arc_mapping_path, 'r', encoding='utf-8') as f:
            self.arc_lookup = yaml.safe_load(f).get('arc_mapping', {})
        with open(resonance_mapping_path, 'r', encoding='utf-8') as f:
            self.resonance_lookup = yaml.safe_load(f).get('resonance_mapping', {})

        # Optionally load variants (omitted here for brevity)
        self.variant_lookup = {}

        print(
            f"[CodexInformer] Loaded {len(self.family_lookup)} families, "
            f"{len(self.variant_lookup)} variants, "
            f"{len(self.arc_lookup)} arcs, "
            f"{len(self.resonance_lookup)} resonance patterns"
        )

    def resolve_emotion_family(self, emotion_code):
        """
        Always returns a dict with:
          primary_emotion_code, emotion_family, arc, resonance
        """
        # If exact family code
        if emotion_code.startswith("FAM-") and emotion_code in self.family_lookup:
            arc       = self.arc_lookup.get(emotion_code)
            resonance = self.resonance_lookup.get(emotion_code, "Neutral")
        
            return {
                'primary_emotion_code': emotion_code,
                'emotion_family': emotion_code,
                'arc': arc,
                'resonance': resonance
            }

        # If variant code
        if emotion_code.startswith("VAR-") and emotion_code in self.variant_lookup:
            fam_code  = self.variant_lookup[emotion_code]['family_code']
            arc       = self.arc_lookup.get(fam_code, "associate_families")
            resonance = self.resonance_lookup.get(fam_code, "Neutral")
            return {
                'primary_emotion_code': emotion_code,
                'emotion_family': fam_code,
                'arc': arc,
                'resonance': resonance
            }
        else:
            # If emotion_code doesn't match "FAM-" structure, don't default to Stable"    
            arc = self.arc_lookup.get(emotion_code, "Unknown")
            return {
                'primary_emotion_code': emotion_code,
                'emotion_family': emotion_code,
                'arc': arc,
                'resonance': "Unknown"
            }

        # Fallback: unknown code → treat as family, use fallback name logic
        arc       = "Unknown"
        resonance = "Unknown"
        return {
            'primary_emotion_code': emotion_code,
            'emotion_family': emotion_code,
            'arc': arc,
            'resonance': resonance
        }

    def get_family_name(self, code):
        """
        Return the human-readable name for a given family code.
        If not in your YAML, strip "FAM-" and capitalize.
        """
        if code in self.family_names:
            return self.family_names[code]
        # Fallback: strip prefix and make title-case
        if code.startswith("FAM-"):
            raw = code[len("FAM-"):]
            return raw.capitalize()
        return code

    def build_alias_lookup(self):
        # your existing alias logic...
        alias_lookup = {}
        # ...
        return alias_lookup

    def get_family_choices(self):
        """
        For UI dropdown: a list of {label: human-name, value: code}
        """
        return [
            {'label': self.get_family_name(code), 'value': code}
            for code in self.family_names.keys()
        ]

    def select_random_scenario(self, family_code=None):
        # your scenario logic if needed...
        return ""