Parse Claude Code JSONL records.
ParsedMessage(session_id, message_id, role, raw_type, timestamp, text, cwd, project, file_operations=())
dataclass
session_id
instance-attribute
message_id
instance-attribute
raw_type
instance-attribute
timestamp
instance-attribute
project
instance-attribute
file_operations = ()
class-attribute
instance-attribute
parse_record(payload, source, line)
Source code in src/locallore/indexing/parser.py
| def parse_record(payload: object, source: Path, line: int) -> ParsedMessage | None:
if not isinstance(payload, dict):
return None
message = payload.get("message")
if not isinstance(message, dict):
return None
role = message.get("role")
if role not in {"user", "assistant", "tool"}:
return None
session_id = payload.get("sessionId") or payload.get("session_id")
if not isinstance(session_id, str) or not session_id:
session_id = source.stem
content = message.get("content")
text = _text(content)
if not text:
return None
raw_id = message.get("id") or payload.get("uuid")
if not isinstance(raw_id, str) or not raw_id:
raw_id = hashlib.sha256(f"{source}:{line}:{text}".encode()).hexdigest()
cwd = payload.get("cwd")
project = payload.get("project") or payload.get("projectName")
return ParsedMessage(
session_id=session_id,
message_id=raw_id,
role=role,
raw_type=str(payload.get("type", role)),
timestamp=payload.get("timestamp")
if isinstance(payload.get("timestamp"), str)
else None,
text=text,
cwd=cwd if isinstance(cwd, str) else None,
project=project if isinstance(project, str) else None,
file_operations=_file_operations(content),
)
|
decode_line(raw)
Source code in src/locallore/indexing/parser.py
| def decode_line(raw: bytes) -> object:
return json.loads(raw.decode("utf-8"))
|