get-claudia 1.28.1 → 1.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1427,6 +1427,19 @@ async def call_tool(name: str, arguments: Dict[str, Any]) -> CallToolResult:
|
|
|
1427
1427
|
|
|
1428
1428
|
elif name == "memory.end_session":
|
|
1429
1429
|
episode_id = arguments["episode_id"]
|
|
1430
|
+
|
|
1431
|
+
# Auto-create episode if it doesn't exist (handles skipped buffer_turn)
|
|
1432
|
+
svc = get_remember_service()
|
|
1433
|
+
episode = svc.db.get_one("episodes", where="id = ?", where_params=(episode_id,))
|
|
1434
|
+
if not episode:
|
|
1435
|
+
from datetime import datetime
|
|
1436
|
+
new_id = svc.db.insert("episodes", {
|
|
1437
|
+
"started_at": datetime.utcnow().isoformat(),
|
|
1438
|
+
"source": arguments.get("source", "claude_code"),
|
|
1439
|
+
})
|
|
1440
|
+
logger.info(f"Auto-created episode {new_id} (requested {episode_id} did not exist)")
|
|
1441
|
+
episode_id = new_id
|
|
1442
|
+
|
|
1430
1443
|
result = end_session(
|
|
1431
1444
|
episode_id=episode_id,
|
|
1432
1445
|
narrative=arguments["narrative"],
|
|
@@ -993,6 +993,13 @@ class RememberService:
|
|
|
993
993
|
"relationships_stored": 0,
|
|
994
994
|
}
|
|
995
995
|
|
|
996
|
+
# Validate episode exists before any DB operations
|
|
997
|
+
episode = self.db.get_one("episodes", where="id = ?", where_params=(episode_id,))
|
|
998
|
+
if not episode:
|
|
999
|
+
result["error"] = f"Episode {episode_id} not found. Call memory.buffer_turn first to create an episode."
|
|
1000
|
+
logger.warning(f"end_session called with non-existent episode_id={episode_id}")
|
|
1001
|
+
return result
|
|
1002
|
+
|
|
996
1003
|
# 1. Store narrative in episode
|
|
997
1004
|
update_data = {
|
|
998
1005
|
"narrative": narrative,
|
|
@@ -160,6 +160,43 @@ class TestEndSession:
|
|
|
160
160
|
db.close()
|
|
161
161
|
|
|
162
162
|
|
|
163
|
+
def test_end_session_nonexistent_episode(self):
|
|
164
|
+
"""end_session with a non-existent episode_id should return error, not raise."""
|
|
165
|
+
db, tmpdir = _make_db()
|
|
166
|
+
try:
|
|
167
|
+
svc = _make_service(db)
|
|
168
|
+
|
|
169
|
+
# Call end_session with an episode_id that was never created
|
|
170
|
+
result = svc.end_session(
|
|
171
|
+
episode_id=9999,
|
|
172
|
+
narrative="This episode does not exist."
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
assert result["episode_id"] == 9999
|
|
176
|
+
assert result["narrative_stored"] is False
|
|
177
|
+
assert "error" in result
|
|
178
|
+
assert "not found" in result["error"].lower()
|
|
179
|
+
finally:
|
|
180
|
+
db.close()
|
|
181
|
+
|
|
182
|
+
def test_end_session_episode_zero(self):
|
|
183
|
+
"""end_session with episode_id=0 should return error (AUTOINCREMENT starts at 1)."""
|
|
184
|
+
db, tmpdir = _make_db()
|
|
185
|
+
try:
|
|
186
|
+
svc = _make_service(db)
|
|
187
|
+
|
|
188
|
+
result = svc.end_session(
|
|
189
|
+
episode_id=0,
|
|
190
|
+
narrative="Default zero episode."
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
assert result["episode_id"] == 0
|
|
194
|
+
assert result["narrative_stored"] is False
|
|
195
|
+
assert "error" in result
|
|
196
|
+
finally:
|
|
197
|
+
db.close()
|
|
198
|
+
|
|
199
|
+
|
|
163
200
|
class TestUnsummarized:
|
|
164
201
|
"""Tests for get_unsummarized_turns functionality."""
|
|
165
202
|
|