Coverage for src/lilbee/server/routes/sessions.py: 100%
29 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-14 11:46 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-14 11:46 +0000
1"""Session routes: list, get, create, append, summary, rename, delete.
3Every route requires the token, reads included: a transcript is at least as
4personal as the memory store next door.
5"""
7from __future__ import annotations
9from litestar import delete, get, patch, post, put
10from litestar.params import FromPath
12from lilbee.server.handlers.sessions import (
13 add_session_message,
14 claim_session,
15 create_session,
16 delete_session,
17 get_session,
18 list_sessions,
19 rename_session,
20 set_session_summary,
21)
22from lilbee.server.models import (
23 SessionCreateRequest,
24 SessionDeleteResponse,
25 SessionDetailResponse,
26 SessionListResponse,
27 SessionMessageCreateRequest,
28 SessionRenameRequest,
29 SessionRenameResponse,
30 SessionSummaryRequest,
31)
34@get("/api/sessions")
35async def sessions_list_route() -> SessionListResponse:
36 """List saved conversations, newest first."""
37 return await list_sessions()
40@get("/api/sessions/{session_id:str}")
41async def session_get_route(session_id: FromPath[str]) -> SessionDetailResponse:
42 """Return a conversation's metadata and full transcript."""
43 return await get_session(session_id)
46@post("/api/sessions")
47async def session_create_route(data: SessionCreateRequest) -> SessionDetailResponse:
48 """Start a new conversation."""
49 return await create_session(data)
52@post("/api/sessions/{session_id:str}/messages")
53async def session_add_message_route(
54 session_id: FromPath[str], data: SessionMessageCreateRequest
55) -> SessionDetailResponse:
56 """Append a turn to a conversation."""
57 return await add_session_message(session_id, data)
60@post("/api/sessions/{session_id:str}/claim")
61async def session_claim_route(session_id: FromPath[str]) -> SessionDetailResponse:
62 """Claim a conversation for this surface so it can append."""
63 return await claim_session(session_id)
66@put("/api/sessions/{session_id:str}/summary")
67async def session_set_summary_route(
68 session_id: FromPath[str], data: SessionSummaryRequest
69) -> SessionDetailResponse:
70 """Replace a conversation's compaction summary."""
71 return await set_session_summary(session_id, data)
74@patch("/api/sessions/{session_id:str}")
75async def session_rename_route(
76 session_id: FromPath[str], data: SessionRenameRequest
77) -> SessionRenameResponse:
78 """Rename a conversation."""
79 return await rename_session(session_id, data.title)
82@delete("/api/sessions/{session_id:str}", status_code=200)
83async def session_delete_route(session_id: FromPath[str]) -> SessionDeleteResponse:
84 """Delete a conversation."""
85 return await delete_session(session_id)