""" Baked-in build metadata for Hermes Agent. Source installs report their git revision live via ``git rev-parse`` (see ``hermes_cli/dump.py`` and ``hermes_cli/banner.py``). That doesn't work inside the published Docker image because ``.dockerignore`` excludes ``.git``, so those callsites fall back to ``"(unknown)"`` / drop the banner suffix entirely. To make ``hermes dump`` and the startup banner identify the exact commit the image was built from, the Docker build writes the build-time ``$HERMES_GIT_SHA`` arg into ``/.hermes_build_sha``. This module is the single read-side helper consumed by both callsites — keeping the lookup in one place so the file path and missing-file behaviour stay consistent. Behaviour: - Returns ``None`` when the file is absent. Source installs and dev images built without the ``HERMES_GIT_SHA`` build-arg fall through to live-git resolution in the caller, so non-Docker installs are unaffected. - Returns ``None`` on any IO / decoding error. The build-sha is a nice-to-have for support triage; nothing in the CLI is allowed to crash because of it. - Truncates to ``short`` characters (default 8) to match the format used by ``git rev-parse --short=8`` throughout the codebase. """ from __future__ import annotations from pathlib import Path from typing import Optional # Path is resolved relative to this module so it works regardless of cwd — # matches the pattern used by ``banner._resolve_repo_dir``. _BUILD_SHA_FILE = Path(__file__).parent.parent / ".hermes_build_sha" def get_build_sha(short: int = 8) -> Optional[str]: """Return the baked-in build SHA, truncated to ``short`` chars, or None. Reads ``/.hermes_build_sha`` if present. The file is written by the Dockerfile's ``HERMES_GIT_SHA`` build-arg and contains the full 40-character commit hash on a single line. """ try: if not _BUILD_SHA_FILE.is_file(): return None sha = _BUILD_SHA_FILE.read_text(encoding="utf-8").strip() except Exception: return None if not sha: return None return sha[:short] if short and short > 0 else sha