2424
2525from ..api_client import ClaudeClient , Provider , init_client
2626from ..memory_store import MemoryStore
27+ from ..state_persistence import StatePersistence
2728
2829# ============================================================================
2930# Error Recovery (SPEC-12.10)
@@ -125,6 +126,7 @@ def __init__(
125126 client : ClaudeClient | None = None ,
126127 smart_routing : bool = True ,
127128 memory_store : MemoryStore | None = None ,
129+ persistence : StatePersistence | None = None ,
128130 auto_memory : bool = True ,
129131 error_recovery : ErrorRecoveryConfig | None = None ,
130132 verification_config : VerificationConfig | None = None ,
@@ -137,6 +139,7 @@ def __init__(
137139 client: Claude API client (creates one if None)
138140 smart_routing: Enable intelligent model routing based on query type
139141 memory_store: Optional memory store for auto-memory integration
142+ persistence: Optional state persistence for cross-session state (#4)
140143 auto_memory: If True and memory_store provided, auto-store findings
141144 error_recovery: Configuration for error recovery strategies
142145 verification_config: Epistemic verification config (uses default if None)
@@ -148,6 +151,7 @@ def __init__(
148151 self .smart_routing = smart_routing
149152 self ._router : SmartRouter | None = None
150153 self ._memory_store = memory_store
154+ self ._persistence = persistence
151155 self ._auto_memory = auto_memory
152156 self ._error_recovery = error_recovery or ErrorRecoveryConfig ()
153157 # SPEC-16.22: Epistemic verification config (always-on by default)
@@ -238,6 +242,14 @@ async def run(
238242 await trajectory .emit (start_event )
239243 yield start_event
240244
245+ # Initialize session persistence (#4 fix)
246+ if self ._persistence is not None :
247+ import os
248+
249+ session_id = os .environ .get ("CLAUDE_SESSION_ID" , "rlm_default" )
250+ self ._persistence .init_session (session_id )
251+ self ._persistence .update_rlm_active (True )
252+
241253 # Initialize RecursiveREPL for depth management and cost tracking
242254 recursive_handler = RecursiveREPL (
243255 context = context ,
@@ -627,6 +639,7 @@ async def run(
627639 yield final_event
628640
629641 # Export trajectory if enabled
642+ trajectory_export_path : str | None = None
630643 if self .config .trajectory .export_enabled :
631644 import os
632645 import time
@@ -635,7 +648,42 @@ async def run(
635648 export_dir = Path (os .path .expanduser (self .config .trajectory .export_path ))
636649 export_dir .mkdir (parents = True , exist_ok = True )
637650 filename = f"trajectory_{ int (time .time ())} .json"
638- trajectory .export_json (str (export_dir / filename ))
651+ trajectory_export_path = str (export_dir / filename )
652+ trajectory .export_json (trajectory_export_path )
653+
654+ # --- Post-execution persistence bridges (#4, #15 fix) ---
655+
656+ # 1. Update StatePersistence with trajectory data
657+ if self ._persistence is not None and self ._persistence .current_state is not None :
658+ event_count = len (trajectory .get_full_trajectory ())
659+ self ._persistence .increment_trajectory_events (event_count )
660+ if trajectory_export_path :
661+ self ._persistence .set_trajectory_path (trajectory_export_path )
662+ self ._persistence .save_state ()
663+
664+ # 2. Bridge to ReasoningTraces (SPEC-04)
665+ if self ._memory_store is not None :
666+ try :
667+ from ..reasoning_traces import ReasoningTraces
668+
669+ traces = ReasoningTraces (store = self ._memory_store )
670+ for event in trajectory .get_full_trajectory ():
671+ traces .from_trajectory_event (event )
672+ except Exception :
673+ pass # Non-blocking: traces are observability
674+
675+ # 3. Bridge to StrategyCache (Spec §8.1)
676+ if state .final_answer :
677+ try :
678+ from ..strategy_cache import get_strategy_cache
679+ from ..trajectory_analysis import TrajectoryAnalyzer
680+
681+ analysis = TrajectoryAnalyzer ().analyze (trajectory .get_full_trajectory ())
682+ cache = get_strategy_cache ()
683+ cache .add (query , analysis )
684+ cache .save ()
685+ except Exception :
686+ pass # Non-blocking
639687
640688 async def _process_deferred_operations (
641689 self ,
0 commit comments