feat(narrative): add god_mode.inject_event handler

This commit is contained in:
anadoris007 2026-04-20 22:24:28 +05:30
parent 16b7ef7521
commit f91dd00f37
2 changed files with 66 additions and 0 deletions

View File

@ -0,0 +1,28 @@
"""God Mode intervention handlers.
All handlers mutate on-disk JSON under narrative/ and return the result.
Each intervention is logged to world_state.event_log for auditability.
"""
from typing import Optional
from app.services.narrative.story_store import StoryStore
from app.services.narrative.world_state import WorldStateStore
def _current_round(sim_dir: str) -> int:
"""Return the 'current' round: last translated beat's round + 1, or 1."""
beats = StoryStore(sim_dir).get_all_beats()
if not beats:
return 1
return beats[-1].get("round", 0) + 1
def inject_event(sim_dir: str, description: str, round_num: Optional[int] = None) -> dict:
"""Append a user-described event to the world event log."""
world = WorldStateStore(sim_dir)
round_val = round_num if round_num is not None else _current_round(sim_dir)
return world.append_event({
"type": "god_mode_injection",
"description": description,
"round": round_val,
})

View File

@ -0,0 +1,38 @@
import os
import tempfile
import pytest
from app.services.narrative.god_mode import inject_event
from app.services.narrative.story_store import StoryStore
from app.services.narrative.world_state import WorldStateStore
@pytest.fixture
def temp_sim_dir():
with tempfile.TemporaryDirectory() as d:
sim_dir = os.path.join(d, "sim_test")
os.makedirs(sim_dir)
yield sim_dir
def test_inject_event_appends_to_log(temp_sim_dir):
evt = inject_event(temp_sim_dir, description="A storm arrives.", round_num=5)
assert evt["description"] == "A storm arrives."
assert evt["round"] == 5
assert evt["id"] == "evt_1"
assert evt["type"] == "god_mode_injection"
log = WorldStateStore(temp_sim_dir).load()["event_log"]
assert len(log) == 1
def test_inject_event_defaults_round_to_beats_plus_one(temp_sim_dir):
store = StoryStore(temp_sim_dir)
store.append_beat({"round": 3, "prose": "beat 3"})
evt = inject_event(temp_sim_dir, description="auto round")
assert evt["round"] == 4
def test_inject_event_defaults_round_to_one_when_no_beats(temp_sim_dir):
evt = inject_event(temp_sim_dir, description="first event")
assert evt["round"] == 1