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

1"""Session routes: list, get, create, append, summary, rename, delete. 

2 

3Every route requires the token, reads included: a transcript is at least as 

4personal as the memory store next door. 

5""" 

6 

7from __future__ import annotations 

8 

9from litestar import delete, get, patch, post, put 

10from litestar.params import FromPath 

11 

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) 

32 

33 

34@get("/api/sessions") 

35async def sessions_list_route() -> SessionListResponse: 

36 """List saved conversations, newest first.""" 

37 return await list_sessions() 

38 

39 

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) 

44 

45 

46@post("/api/sessions") 

47async def session_create_route(data: SessionCreateRequest) -> SessionDetailResponse: 

48 """Start a new conversation.""" 

49 return await create_session(data) 

50 

51 

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) 

58 

59 

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) 

64 

65 

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) 

72 

73 

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) 

80 

81 

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)