11"""Parsed session shapes from jsonl_parser."""
22
3- from typing import Any , Literal , NotRequired , TypedDict
3+ from typing import Any , Literal , NotRequired , TypedDict , Union
44
55from models .record_data import RecordDataUnion
66from models .tool_results import ToolNameLiteral , ToolResultUnion
@@ -26,32 +26,66 @@ class MessageUsageDict(TypedDict, total=False):
2626SystemSubtypeLiteral = Literal ["compact_boundary" , "init" ]
2727
2828
29- class MessageDict (TypedDict ):
30- role : RoleLiteral
31- uuid : NotRequired [str | None ]
32- parent_uuid : NotRequired [str | None ]
33- timestamp : NotRequired [str | None ]
29+ class BaseMessageDict (TypedDict , total = False ):
30+ """Fields shared across every parsed message role."""
31+
32+ uuid : str | None
33+ parent_uuid : str | None
34+ timestamp : str | None
35+ is_sidechain : bool
36+
37+
38+ class UserMessageDict (BaseMessageDict ):
39+ role : Literal ["user" ]
3440 text : NotRequired [str ]
35- content : NotRequired [str ]
3641 images : NotRequired [list [Any ] | None ]
37- is_sidechain : NotRequired [bool ]
3842 tool_result : NotRequired [ToolResultUnion | None ]
3943 tool_result_parsed : NotRequired [dict [str , object ] | None ]
4044 slug : NotRequired [str | None ]
45+
46+
47+ class AssistantMessageDict (BaseMessageDict ):
48+ role : Literal ["assistant" ]
49+ text : NotRequired [str ]
4150 model : NotRequired [str ]
4251 stop_reason : NotRequired [str ]
4352 thinking : NotRequired [str | None ]
4453 tool_uses : NotRequired [list [ToolUseDict ] | None ]
4554 is_api_error : NotRequired [bool ]
4655 usage : NotRequired [MessageUsageDict ]
56+
57+
58+ class SystemMessageDict (BaseMessageDict ):
59+ role : Literal ["system" ]
60+ text : NotRequired [str ]
4761 subtype : NotRequired [str ]
62+ content : NotRequired [str ]
4863 level : NotRequired [str ]
49- data : NotRequired [RecordDataUnion ]
64+
65+
66+ class ResultMessageDict (BaseMessageDict ):
67+ role : Literal ["result" ]
68+ text : NotRequired [str ]
69+ content : NotRequired [str ]
70+
71+
72+ class ProgressMessageDict (BaseMessageDict ):
73+ role : Literal ["progress" ]
5074 progress_type : NotRequired [str ]
75+ data : NotRequired [RecordDataUnion ]
5176 tool_use_id : NotRequired [str | None ]
5277 parent_tool_use_id : NotRequired [str | None ]
5378
5479
80+ MessageDict = Union [
81+ UserMessageDict ,
82+ AssistantMessageDict ,
83+ SystemMessageDict ,
84+ ResultMessageDict ,
85+ ProgressMessageDict ,
86+ ]
87+
88+
5589class SessionMetadataDict (TypedDict ):
5690 """Metadata accumulated while parsing a Claude Code JSONL session.
5791
0 commit comments