mec-functional-empathy-demo / core /codex_informer.py
ThreatLevelD
Fixed emotional arc retrieval
03cc10b
# 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 ""