# personality_state.py # Persistent evolving personality profile per agent import json, os, time from typing import Dict DEFAULT_TRAITS = { "ambition": 0, "optimism": 0, "resilience": 0, "focus": 0, "curiosity": 0, "calm": 0, } class PersonalityState: def __init__(self, agent_id: str, file_path: str = None): self.agent_id = agent_id self.file_path = file_path or f"personality_{agent_id}.json" self._init() def _init(self): if not os.path.exists(self.file_path): data = { "agent_id": self.agent_id, "traits": DEFAULT_TRAITS.copy(), "last_update": int(time.time()), "notes": [] } self._save(data) def _load(self) -> Dict: with open(self.file_path, "r") as f: return json.load(f) def _save(self, obj: Dict): with open(self.file_path, "w") as f: json.dump(obj, f, indent=2) def apply_deltas(self, deltas: Dict[str, int], note: str = ""): data = self._load() for k, v in deltas.items(): data["traits"][k] = int(data["traits"].get(k, 0) + v) if note: data["notes"].append({"ts": int(time.time()), "note": note}) data["last_update"] = int(time.time()) self._save(data) def summary(self) -> str: data = self._load() traits = data["traits"] lines = [] # Short natural language based on trait scores if traits["ambition"] > 3: lines.append("ambitious") if traits["optimism"] > 3: lines.append("optimistic") if traits["resilience"] > 3: lines.append("resilient") if traits["focus"] > 3: lines.append("focused") if traits["curiosity"] > 3: lines.append("curious") if traits["calm"] > 3: lines.append("calm under pressure") mood = ", ".join(lines) if lines else "still forming" return ( f"Personality snapshot → {mood}. " f"Scores: {traits}. " f"Updated: {data['last_update']}." )