@@ -84,7 +84,11 @@ def __init__(
8484 buddhi_dir = str (self ._engram .data_dir / "buddhi" )
8585 self ._buddhi = Buddhi (data_dir = buddhi_dir )
8686
87- # Session tracking
87+ # Passive session tracker — auto-context + auto-checkpoint
88+ from dhee .core .session_tracker import SessionTracker
89+ self ._tracker = SessionTracker ()
90+
91+ # Session tracking (kept for backward compat with session_start/session_end)
8892 self ._session_id : Optional [str ] = None
8993 self ._session_start_time : Optional [float ] = None
9094
@@ -120,7 +124,15 @@ def remember(
120124 checks for "remember to X when Y" patterns.
121125 """
122126 uid = user_id or self ._user_id
123- result = self ._engram .add (content , user_id = uid , infer = False , metadata = metadata )
127+
128+ # Auto-tier memory content
129+ from dhee .core .session_tracker import classify_tier
130+ tier = classify_tier (content )
131+ meta = dict (metadata ) if metadata else {}
132+ if tier != "smriti" :
133+ meta ["tier" ] = tier
134+
135+ result = self ._engram .add (content , user_id = uid , infer = False , metadata = meta or None )
124136
125137 response : Dict [str , Any ] = {"stored" : True }
126138 memory_id = None
@@ -129,6 +141,12 @@ def remember(
129141 if rs :
130142 memory_id = rs [0 ].get ("id" )
131143 response ["id" ] = memory_id
144+ if tier == "shruti" :
145+ response ["tier" ] = "shruti"
146+
147+ # Session tracking — may trigger auto-context
148+ signals = self ._tracker .on_remember (content , memory_id )
149+ self ._handle_tracker_signals (signals , uid )
132150
133151 # Buddhi: detect intentions, record episode event, create beliefs
134152 intention = self ._buddhi .on_memory_stored (
@@ -152,7 +170,7 @@ def recall(
152170 """Search memory for relevant facts. 0 LLM calls. 1 embedding."""
153171 uid = user_id or self ._user_id
154172 results = self ._engram .search (query , user_id = uid , limit = limit )
155- return [
173+ formatted = [
156174 {
157175 "memory" : r .get ("memory" , r .get ("content" , "" )),
158176 "score" : round (r .get ("composite_score" , r .get ("score" , 0.0 )), 3 ),
@@ -161,6 +179,12 @@ def recall(
161179 for r in results
162180 ]
163181
182+ # Session tracking
183+ signals = self ._tracker .on_recall (query , formatted )
184+ self ._handle_tracker_signals (signals , uid )
185+
186+ return formatted
187+
164188 # ------------------------------------------------------------------
165189 # Tool 3: context
166190 # ------------------------------------------------------------------
@@ -172,6 +196,7 @@ def context(
172196 ) -> Dict [str , Any ]:
173197 """HyperAgent session bootstrap. Returns everything the agent needs."""
174198 uid = user_id or self ._user_id
199+ self ._tracker .on_context (task_description )
175200 hyper_ctx = self ._buddhi .get_hyper_context (
176201 user_id = uid ,
177202 task_description = task_description ,
@@ -219,6 +244,21 @@ def checkpoint(
219244 8. Selective forgetting → utility-based cleanup
220245 """
221246 uid = user_id or self ._user_id
247+ self ._tracker .on_checkpoint ()
248+
249+ # Auto-fill task_type if not provided
250+ if not task_type :
251+ task_type = self ._tracker .get_inferred_task_type ()
252+ if task_type == "general" :
253+ task_type = None
254+
255+ # Auto-fill outcome if not provided
256+ if outcome_score is None and self ._tracker .op_count >= 3 :
257+ outcome = self ._tracker .get_outcome_signals ()
258+ outcome_score = outcome .get ("outcome_score" )
259+ if not what_worked :
260+ what_worked = outcome .get ("what_worked" )
261+
222262 result : Dict [str , Any ] = {}
223263
224264 # 1. Session digest
@@ -401,6 +441,31 @@ def session_end(
401441 self ._session_start_time = None
402442 return result
403443
444+ # ------------------------------------------------------------------
445+ # Auto-lifecycle (driven by SessionTracker)
446+ # ------------------------------------------------------------------
447+
448+ def _handle_tracker_signals (self , signals : Dict [str , Any ], user_id : str ) -> None :
449+ """Process signals from the session tracker."""
450+ if not signals :
451+ return
452+
453+ # Auto-checkpoint a timed-out previous session
454+ if signals .get ("needs_auto_checkpoint" ):
455+ args = signals .get ("auto_checkpoint_args" , {})
456+ try :
457+ self .checkpoint (user_id = user_id , ** args )
458+ except Exception :
459+ pass
460+
461+ # Auto-context for new session
462+ if signals .get ("needs_auto_context" ):
463+ task = signals .get ("inferred_task" )
464+ try :
465+ self .context (task_description = task , user_id = user_id )
466+ except Exception :
467+ pass
468+
404469 # ------------------------------------------------------------------
405470 # Phase 3: Belief management
406471 # ------------------------------------------------------------------
0 commit comments