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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "get-claudia",
3
- "version": "1.28.1",
3
+ "version": "1.28.2",
4
4
  "description": "An AI assistant who learns how you work.",
5
5
  "keywords": [
6
6
  "claudia",