aboutsummaryrefslogtreecommitdiff
path: root/agent/orchestrator/context.py
diff options
context:
space:
mode:
Diffstat (limited to 'agent/orchestrator/context.py')
-rw-r--r--agent/orchestrator/context.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/agent/orchestrator/context.py b/agent/orchestrator/context.py
new file mode 100644
index 0000000..f8679ff
--- /dev/null
+++ b/agent/orchestrator/context.py
@@ -0,0 +1,42 @@
+"""Builds the dynamic per-turn context.
+
+This handles things that change per turn: the current time, today's diary
+entries, open tasks. Persona is NOT here; that's a backend configuration
+concern (see models/claude_code.py docstring).
+"""
+
+import sqlite3
+from datetime import datetime, timezone
+from pathlib import Path
+
+
+SENIA_DB = Path("/etc/senia/data/senia.db")
+
+
+def _today_diary_entries() -> list[str]:
+ if not SENIA_DB.exists():
+ return []
+ now = datetime.now(timezone.utc).astimezone()
+ start = now.replace(hour=0, minute=0, second=0, microsecond=0).isoformat()
+ conn = sqlite3.connect(SENIA_DB)
+ try:
+ return [
+ f"- {row[0]} - {row[1]}"
+ for row in conn.execute(
+ "SELECT ts, content FROM diary_logs WHERE ts >= ? ORDER BY ts",
+ (start,),
+ ).fetchall()
+ ]
+ finally:
+ conn.close()
+
+
+def build_turn_context() -> str:
+ diary = _today_diary_entries()
+ diary_section = (
+ "## Today's diary so far\n\n" + "\n".join(diary)
+ if diary
+ else "## Today's diary so far\n\n(no entries yet today)"
+ )
+ now = datetime.now(timezone.utc).astimezone().isoformat(timespec="seconds")
+ return f"## Current time\n\n{now}\n\n{diary_section}"