"""Uniform stdin parsing for the memory plugin hooks (deep module). Replaces four inline stdin parsers and the python3-vs-jq inconsistency with a single read_input() returning a HookInput dataclass. Fail-open: malformed or empty stdin yields empty-string fields, never an exception. Per-hook fallback semantics (e.g. 'unknown' defaults, PID fallback) are applied by each hook, not here, to stay faithful to the original bash behavior. """ from __future__ import annotations import json import sys from dataclasses import dataclass @dataclass(frozen=True) class HookInput: session_id: str cwd: str file_path: str reason: str source: str raw: dict def read_input() -> "HookInput": data = {} try: raw = sys.stdin.read() data = json.loads(raw) if raw.strip() else {} except Exception: data = {} if not isinstance(data, dict): data = {} tool_input = data.get("tool_input") or {} if not isinstance(tool_input, dict): tool_input = {} return HookInput( session_id=str(data.get("session_id", "") or ""), cwd=str(data.get("cwd", "") or ""), file_path=str(tool_input.get("file_path", "") or ""), reason=str(data.get("reason", "") or ""), source=str(data.get("source", "") or ""), raw=data, )