""" Start Emma: python emma_run.py Statistikk: python emma_run.py --stats """ import sys import argparse from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from emma.emma_backend_ollama import OllamaBackend from emma.emma_resonance_persistent import PersistentMorphicMemory from emma.emma_mcot import EmmaMCoTAgent from emma.emma_guardrails import EmmaGuardrails from emma.emma_flynn import FlynnTracker def main(): parser = argparse.ArgumentParser(description="Emma AI Agent REPL") parser.add_argument("--model", default="llama3.2") parser.add_argument("--embed", default="nomic-embed-text") parser.add_argument("--stats", action="store_true") args = parser.parse_args() if args.stats: s = FlynnTracker().summary() print("📊 Flynn-statistikk:") for k, v in (s or {}).items(): print(f" {k}: {v:.4f}" if isinstance(v, float) else f" {k}: {v}") return llm = OllamaBackend(model=args.model, embed_model=args.embed) memory = PersistentMorphicMemory() guardrails = EmmaGuardrails() agent = EmmaMCoTAgent(llm=llm, memory=memory) print(f"🤖 Emma klar | Modell: {args.model} | Morfisk minne: {len(memory)} mønstre") print("exit=avslutt stats=Flynn-statistikk\n") history = [] while True: try: user_input = input("Chris> ").strip() except (KeyboardInterrupt, EOFError): break if user_input.lower() in ("exit", "quit"): break if user_input.lower() == "stats": print(FlynnTracker().summary()) continue if not user_input: continue ok, reason = guardrails.can_execute(user_input) if not ok: print(f"🛡️ {reason}") continue response = agent.run(user_input, history) history.append({"role": "user", "content": user_input}) history.append({"role": "assistant", "content": response}) print(f"Emma> {response}\n") if __name__ == "__main__": main()