Skip to content

Commit d9fd81f

Browse files
authored
Merge pull request #17 from Sankhya-AI/alpha
V2.2.3
2 parents f364143 + 5949d7b commit d9fd81f

8 files changed

Lines changed: 911 additions & 12 deletions

File tree

dhee/adapters/base.py

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)