+
    lHàjZ ã            
       óü  a € Rˆ tS0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHtHt ]P<                  ! ]4      t ]! 4       R,          t!]!t"R	 R
 lt#Rt$Rt%Rt&Rt'Rt(Rt)Rt*Rt+. RNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NR8NR9NR:NR;NR<NR=NR>NR?NR@NRANRBNRCNRDNt,]-! ^
].! ^<]! RE^4      4      4      t/] ^ k RFt0]Pb                  ! RG4      t2RH RI lt3RJ RK lt4RL RM lt5RN RO lt6R‰RP RQ llt7RR RS lt8RT RU lt9RV RW lt:RX RY lt;RZ R[ lt<R\ R] lt=R^ R_ lt>R` Ra lt?Rb Rc lt@Rd Re ltAR‰Rf Rg lltB]/RRR3Rh Ri lltCR‰Rj Rk lltDRl Rm ltERn Ro ltFRp Rq ltGRr Rs ltHRt Ru ltIRv Rw ltJRx Ry ltKRz R{ ltLR| R} ltMR~ R ltNR€ R� ltOR‚ Rƒ ltP ! R„ R…4      tQR† R‡ ltRR# )Šuœ	  
Checkpoint Manager â€” Transparent filesystem snapshots via a single shared
shadow git store.

Creates automatic snapshots of working directories before file-mutating
operations (``write_file``, ``patch``, ``terminal`` with destructive flags),
triggered once per conversation turn.  Provides rollback to any previous
checkpoint.

This is NOT a tool â€” the LLM never sees it.  It's transparent infrastructure
controlled by the ``checkpoints`` config flag or ``--checkpoints`` CLI flag.

Storage layout (single shared store, git objects deduplicated across projects)
-----------------------------------------------------------------------------

    ~/.hermes/checkpoints/
        store/                          â€” single bare-ish git repo
            HEAD, config, objects/      â€” standard git internals (shared)
            refs/hermes/<hash16>        â€” per-project branch tip
            indexes/<hash16>            â€” per-project git index
            projects/<hash16>.json      â€” {workdir, created_at, last_touch}
            info/exclude                â€” default excludes (shared)
        .last_prune                     â€” auto-prune idempotency marker
        legacy-<timestamp>/             â€” archived pre-v2 per-project shadow
                                          repos (auto-migrated on first init)

Why a single store?
-------------------

The pre-v2 design kept a full shadow repo per working directory.  Each one
re-stored most of the project's files under its own ``objects/`` tree, with
zero sharing across worktrees of the same project.  A single user with a
dozen worktrees of the same repo burned ~40 MB each (~500 MB total) storing
the same blobs over and over.  A single shared store lets git's content-
addressable object DB deduplicate across projects and across turns, so adding
a new worktree costs near-zero.

The shadow store uses ``GIT_DIR`` + ``GIT_WORK_TREE`` + ``GIT_INDEX_FILE``
so no git state leaks into the user's project directory.

Auto-maintenance (``tools.checkpoint_maintenance``)
---------------------------------------------------

Shadow state accumulates over time.  ``prune_checkpoints`` deletes refs whose
recorded working directory no longer exists (orphan) or whose last touch is
older than ``retention_days`` (stale), then runs ``git gc --prune=now`` to
reclaim object storage.  A size-cap pass drops the oldest checkpoints per
project until total store size is under ``max_total_size_mb``.
N)ÚPathÚPurePosixPath)Úget_hermes_home)Úselected_git_envÚwindows_hide_flags)Úclear_stale_tmp_packs)ÚDictÚListÚOptionalÚSetÚTuple)Úenv_intÚrmtree_readonlyÚcheckpointsc                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn©r   )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/checkpoint_manager.pyÚ__annotate__r   N   s   € ÷ sñ s¤$ñ só    c                 óN   € \         \        8w  d   \         # \        4       R,          # )u>  Active profile's checkpoint root at call time: the patched ``CHECKPOINT_BASE`` when a test
changed it, else live profile-scoped HERMES_HOME â€” under the multiplexed gateway one process
serves every profile, so the import-time constant would write every profile's code-edit
checkpoints into the launch profile's store.r   )ÚCHECKPOINT_BASEÚ_CHECKPOINT_BASE_AT_IMPORTr   © r   r   Ú_resolve_checkpoint_baser   N   s!   € ô
 .Ô1KÔKŒ?ÐrÔQ`ÓQbÐerÕQrÐrr   Ústorezrefs/hermesÚindexesÚprojectsÚledgerszlegacy-z.last_pruneiÐ  znode_modules/zdist/zbuild/ztarget/zout/z.next/z.nuxt/z__pycache__/z*.pycz*.pyoz.cache/z.pytest_cache/z.mypy_cache/z.ruff_cache/z	coverage/z	.coveragez.venv/zvenv/zenv/z.git/z.hg/z.svn/z.worktrees/z*.soz*.dylibz*.dllz*.oz*.az*.jarz*.classz*.exez*.objz*.mp4z*.movz*.mkvz*.webmz*.zipz*.tarz*.tar.gzz*.tgzz*.7zz*.rarz*.isoz.envz.env.*z
.env.localz.env.*.localz	.DS_Storez	Thumbs.dbz*.logÚHERMES_CHECKPOINT_TIMEOUTiPÃ  z^[0-9a-fA-F]{4,64}$c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Úcommit_hashr   ©Ústrr
   )r   s   "r   r   r   ®   s   € ÷ ñ ¤sð ¬x¼­}ñ r   c                óÂ   € V '       d   V P                  4       '       g   R# V P                  R4      '       d   RV : 2# \        P                  V 4      '       g   RV : 2# R# )záValidate a commit hash to prevent git argument injection.

Returns an error string if invalid, None if valid.
Values starting with '-' would be interpreted as git flags
(e.g., '--patch', '-p') instead of revision specifiers.
zEmpty commit hashÚ-z/Invalid commit hash (must not start with '-'): z4Invalid commit hash (expected 4-64 hex characters): N)ÚstripÚ
startswithÚ_COMMIT_HASH_REÚmatch)r$   s   &r   Ú_validate_commit_hashr-   ®   sW   € ÷ ˜k×/Ñ/×1Ò1Ù"Ø×Ñ˜c×"Ò"Ø@ÀÁÐPÐPÜ× Ñ  ×-Ò-ØEÀkÁ_ÐUÐUÙr   c                óR   € V ^8„  d   QhR\         R\         R\        \         ,          /# )r   Ú	file_pathÚworking_dirr   r%   )r   s   "r   r   r   ¾   s%   € ÷ ñ ¤3ð ´Sð ¼XÄc½]ñ r   c                ó0  € V '       d   V P                  4       '       g   R# \        P                  P                  V 4      '       d   RV : 2# \	        V4      pW ,          P                  4       p VP                  V4       R#   \         d
    RT : 2u # i ; i)z‚Validate a file path to prevent path traversal outside the working directory.

Returns an error string if invalid, None if valid.
zEmpty file pathz/File path must be relative, got absolute path: z7File path escapes the working directory via traversal: N)r)   ÚosÚpathÚisabsÚ_normalize_pathÚresolveÚrelative_toÚ
ValueError)r/   r0   Úabs_workdirÚresolveds   &&  r   Ú_validate_file_pathr;   ¾   sŠ   € ÷
 ˜IŸO™O×-Ò-Ù Ü	‡w�w‡}�}�Y×ÒØ@ÀÁÐNÐNÜ! +Ó.€KØÕ'×0Ñ0Ó2€HðWØ×Ñ˜[Ô)ñ øô ô WØHÈÉÐVÒVðWús   Á.B ÂBÂBc                ó0   € V ^8„  d   QhR\         R\        /# )r   Ú
path_valuer   )r&   r   )r   s   "r   r   r   Ô   s   € ÷ 3ñ 3¤ð 3¬ñ 3r   c                óP   € \        V 4      P                  4       P                  4       # )z;Return a canonical absolute path for checkpoint operations.)r   Ú
expanduserr6   )r=   s   &r   r5   r5   Ô   s   € ä�
Ó×&Ñ&Ó(×0Ñ0Ó2Ð2r   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r0   r   ©r&   )r   s   "r   r   r   Ù   s   € ÷ >ñ >œsð >¤sñ >r   c                óœ   € \        \        V 4      4      p\        P                  ! VP	                  4       4      P                  4       R,          # )z6Deterministic per-project hash: sha256(abs_path)[:16].:Né   N)r&   r5   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r0   Úabs_paths   & r   Ú_project_hashrJ   Ù   s5   € ä”? ;Ó/Ó0€HÜ�>Š>˜(Ÿ/™/Ó+Ó,×6Ñ6Ó8¸Õ=Ð=r   c                óF   € V ^8„  d   QhR\         \        ,          R\        /# ©r   Úbaser   )r
   r   )r   s   "r   r   r   ß   s"   € ÷ Añ A”hœt•nð A´ñ Ar   c                ó@   € T ;'       g    \        4       \        ,          # )z+Return the single shared shadow store path.)r   Ú_STORE_DIRNAME)rM   s   &r   Ú_store_pathrP   ß   s   € à×.Ð.Ô,Ó.´.Õ@Ð@r   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   r   r   ©r   Úbool)r   s   "r   r   r   ä   s   € ÷ %ñ %œ4ð %¤Dñ %r   c                 ó0   € V R ,          P                  4       # )ÚHEAD©Úexists)r   s   &r   Ú_store_has_headrY   ä   s   € Ø�F�N×"Ñ"Ó$Ð$r   c                ó<   € V ^8„  d   QhR\         R\        R\         /# ©r   r   Údir_hashr   ©r   r&   )r   s   "r   r   r   è   s!   € ÷ /ñ /”tð /¤sð /¬tñ /r   c                 ó*   € V \         ,          V,          # ©N)Ú_INDEXES_DIRNAME©r   r\   s   &&r   Ú_index_pathrb   è   s   € ØÔ#Õ# hÕ.Ð.r   c                ó<   € V ^8„  d   QhR\         R\        R\         /# r[   r]   )r   s   "r   r   r   ì   s!   € ÷ 9ñ 9œð 9¬ð 9´ñ 9r   c                 ó0   € V \         ,          V R 2,          # ©z.json)Ú_LEDGERS_DIRNAMEra   s   &&r   Ú_ledger_pathrg   ì   s   € ØÔ#Õ#¨¨
°%Ð&8Õ8Ð8r   c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r   r3   r   )r   r
   r&   )r   s   "r   r   r   ð   s   € ÷ 	ñ 	”Tð 	œh¤s�mñ 	r   c                ó$  a€  \         P                  ! 4       p\        V R4      ;_uu_ 4       o\        V3R lR4       F  pVP	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     L ; i  \         d     R# i ; i)z?Streaming sha256 of a file's bytes. None if unreadable/missing.Úrbc                  ó&   <€ S P                  R4      # )é   i   )Úread)Úfhs   €r   Ú<lambda>Ú_hash_file.<locals>.<lambda>õ   s   ø€  b§g¡g¨gÔ&6r   r   N)rE   rF   ÚopenÚiterÚupdaterH   ÚOSError)r3   ÚhÚchunkro   s   &  @r   Ú
_hash_filerx   ð   so   ø€ ðÜ�NŠNÓˆÜ�$˜×Ô ÜÔ6¸Ö<�Ø—‘˜–ñ =÷ ð �{‰{‹}Ð÷ ×ûô ô Úðús(   ƒ)B  ¬)A-ÁB  Á-A=	Á8B  Â BÂBc                ó^   € V ^8„  d   QhR\         R\        R\        \        \        3,          /# r[   ©r   r&   Údict)r   s   "r   r   r   ü   s)   € ÷ ñ œð ¬ð ´´S¼$°Yµñ r   c                óÌ   €  \        W4      P                  RR7      p\        P                  ! V4      p\	        V\
        4      '       d   V# / #   \        \        3 d    / u # i ; i)a  Load the agent-write ledger: {relpath: {"sha256": ..., "ts": ...}}.

The ledger records the content hash of every file the last successful
``write_file`` / ``patch`` produced, so restores can tell "Hermes wrote
this" apart from "the user hand-edited this afterwards".
ú	utf-8-sig©Úencoding)rg   Ú	read_textÚjsonÚloadsÚ
isinstancer{   ru   r8   )r   r\   ÚrawÚdatas   &&  r   Ú_load_ledgerr†   ü   s\   € ðÜ˜5Ó+×5Ñ5¸{Ð5ÓKˆÜ�zŠz˜#‹ˆÜ! $¬×-Ò-ˆtÐ5°2Ð5øÜ”ZÐ ô ØŠ	ðús   ‚AA ÁA ÁA#Á"A#c                ób   € V ^8„  d   QhR\         R\        R\        \        \        3,          RR/# )r   r   r\   Úledgerr   Nrz   )r   s   "r   r   r     s6   € ÷ Zñ Zœð Z¬ð Z´T¼#¼t¸)µ_ð ZÈñ Zr   c                óÄ  €  \        V4      \        8”  d0   \        VP                  4       R RR7      R\         p\	        V4      p\        W4      pVP                  P                  RRR7       VP                  R4      pVP                  \        P                  ! V4      RR7       VP                  V4       R#   \         d    \        P                  R	TRR
7        R# i ; i)z=Persist the agent-write ledger, capped to the newest entries.c                 ór   € \        V ^,          \        4      '       d   V ^,          P                  R^ 4      # ^ # )rm   Úts)rƒ   r{   Úget)Úkvs   &r   rp   Ú_save_ledger.<locals>.<lambda>  s,   € ´ZÀÀ1ÅÄt×5LÒ5L˜r !�uŸy™y¨¨qÓ1ÐSÐRSÐSr   T©ÚkeyÚreverseN©ÚparentsÚexist_okz	.json.tmpúutf-8r~   z(Failed to save agent-write ledger for %s©Úexc_info)ÚlenÚ_LEDGER_MAX_ENTRIESÚsortedÚitemsr{   rg   ÚparentÚmkdirÚwith_suffixÚ
write_textr�   ÚdumpsÚreplaceru   ÚloggerÚdebug)r   r\   rˆ   Únewestr3   Útmps   &&&   r   Ú_save_ledgerr¦     sÁ   € ðZÜˆv‹;Ô,Ô,ÜØ—‘“ÙSØôð #Ô"ð	$ˆFô
 ˜&“\ˆFÜ˜EÓ,ˆØ�‰×Ñ $°ÐÔ6Ø×Ñ˜{Ó+ˆØ�‰”t—z’z &Ó)°GˆÔ<Ø�‰�DÖøÜô ZÜ�‰Ð?ÀÐTXˆ×YðZús   ‚B4B8 Â8#CÃCc                ó0   € V ^8„  d   QhR\         R\         /# )r   r\   r   rB   )r   s   "r   r   r     s   € ÷ (ñ (œð (¤ñ (r   c                 ó   € \          R V  2# )Ú/)Ú_REFS_PREFIX)r\   s   &r   Ú	_ref_namer«     s   € Üˆ^˜1˜X˜JÐ'Ð'r   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Ú	ls_tree_zr   )r&   Úlist)r   s   "r   r   r   "  s   € ÷ ñ œcð ¤d¬3¥iñ r   c                óÀ   € V P                  R4       Uu. uF>  pVP                  R4      '       g   K  RV9   g   K%  VP                  R^4      ^,          NK@  	  up# u upi )zvPaths of gitlinks (nested repositories stored as a commit reference, not
their files) in ``git ls-tree -r -z`` output.Ú z160000 commit Ú	)Úsplitr*   )r­   Úrecords   & r   Ú_gitlink_pathsr´   "  sb   € ð
  —o‘o fÔ-óá-ˆFØ×ÑÐ-×.ô 	!à37¸6±>ô 	!ˆ�‰�T˜1Ó˜a× Ð Ù-ñð ùò s   ”A²A»Ac                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   Únested_reposr   )r®   r&   )r   s   "r   r   r   ,  s   € ÷ >ñ >¤4¬¥9ð >´ñ >r   c                ó’   € RP                  V R,          4      p\        V 4      ^8”  d   R\        V 4      ^,
           R2MRpRV V R2# )z|Checkpoint-message suffix naming nested repositories whose files were
not captured, so every /rollback listing discloses it.ú, :Né   Nz (+Ú)Ú z! [nested git repos not captured: Ú])Újoinr˜   )r¶   ÚshownÚmores   &  r   Ú_uncaptured_noterÀ   ,  sQ   € ð �I‰I�l 2Õ&Ó'€EÜ-0°Ó->ÀÔ-BˆS”�\Ó" QÕ&Ð' qÑ)È€DØ.¨u¨g°d°V¸1Ð=Ð=r   c                ó<   € V ^8„  d   QhR\         R\        R\         /# r[   r]   )r   s   "r   r   r   4  s!   € ÷ :ñ :œdð :¬cð :´dñ :r   c                 ó0   € V \         ,          V R 2,          # re   )Ú_PROJECTS_DIRNAMEra   s   &&r   Ú_project_meta_pathrÄ   4  s   € ØÔ$Õ$¨(¨°5Ð'9Õ9Ð9r   c                ó^   € V ^8„  d   QhR\         R\        R\        \         ,          R\        /# )r   r   r0   Ú
index_filer   )r   r&   r
   r{   )r   s   "r   r   r   <  s4   € ÷ &ñ &Üð&äð&ô œ•ð&ô 
ñ	&r   c                ón  € \        V4      p^ RIHp \        V! RRR7      4      p\	        V 4      VR&   \	        V4      VR&   VP                  RR4       VP                  RR4       Ve   \	        V4      VR	&   MVP                  R	R4       \        P                  VR
&   \        P                  VR&   RVR&   V# )u  Build env dict that redirects git to the shared store.

The shared store is internal Hermes infrastructure â€” it must NOT inherit
the user's global or system git config.  User-level settings like
``commit.gpgsign = true``, signing hooks, or credential helpers would
either break background snapshots or, worse, spawn interactive prompts
(pinentry GUI windows) mid-session every time a file is written.

Isolation strategy:
* ``GIT_CONFIG_GLOBAL=<os.devnull>`` â€” ignore ``~/.gitconfig`` (git 2.32+).
* ``GIT_CONFIG_SYSTEM=<os.devnull>`` â€” ignore ``/etc/gitconfig`` (git 2.32+).
* ``GIT_CONFIG_NOSYSTEM=1`` â€” legacy belt-and-suspenders for older git.

``index_file``, if given, forces git to use a per-project index under
``store/indexes/<hash>`` so projects don't race on a shared index.
©Úbuild_subprocess_envF©Úscrub_secretsÚinherit_profile_homeÚGIT_DIRÚGIT_WORK_TREEÚGIT_NAMESPACENÚ GIT_ALTERNATE_OBJECT_DIRECTORIESÚGIT_INDEX_FILEÚGIT_CONFIG_GLOBALÚGIT_CONFIG_SYSTEMÚ1ÚGIT_CONFIG_NOSYSTEM)r5   Útools.environments.localrÉ   r   r&   Úpopr2   Údevnull)r   r0   rÆ   Únormalized_working_dirrÉ   Úenvs   &&&   r   Ú_git_envrÛ   <  s³   € ô* -¨[Ó9Ðõ >ä
Ñ/¸eÐZ_Ô`Ó
a€CÜ˜“Z€Cˆ	�NÜÐ5Ó6€CˆÑØ‡G�GˆO˜TÔ"Ø‡G�GÐ.°Ô5ØÒÜ # J£ˆÐÒà�‰Ð  $Ô'Ü!Ÿz™z€CÐÑÜ!Ÿz™z€CÐÑØ!$€CÐÑØ€Jr   c                ó4  € V ^8„  d   QhR\         \        ,          R\        R\        R\        R\        \
        \        ,          ,          R\        \        ,          R\        \        \        \        3,          ,          R\        \        \        \        3,          /# )	r   Úargsr   r0   ÚtimeoutÚallowed_returncodesrÆ   Ú	extra_envr   )	r®   r&   r   Úintr
   Úsetr{   ÚtuplerT   )r   s   "r   r   r   e  s‹   € ÷ J#ñ J#Ü
Œs�)ðJ#äðJ#ô ðJ#ô ð	J#ô
 "¤#¤c¥(Õ+ðJ#ô œ•ðJ#ô œœS¤#˜X�Õ'ðJ#ô Œ4””cˆ>ÕñJ#r   c                ó"  € \        V4      pVP                  4       '       gB   RV 2p\        P                  RRP	                  R.\        V 4      ,           4      V4       RRV3# VP                  4       '       gB   RV 2p\        P                  RRP	                  R.\        V 4      ,           4      V4       RRV3# \        V\        V4      VR7      p	V'       d   V	P                  V4       \        P                  ! RV	P                  R	R4      R
7      p
V
f   R## V
.V OpT;'       g    \        4       p RV 9   d   / MRRRRRR/p\        P                  ! V3RR/VBRVRV	R\        V4      R\        P                   R\#        4       RR/B pVP$                  ^ 8H  pRV 9   d!   \&        P(                  ! VP*                  4      MVP*                  P-                  4       pRV 9   d,   VP.                  P1                  RRR7      P-                  4       MVP.                  P-                  4       pV'       gC   VP$                  V9  d2   \        P                  RRP	                  V4      VP$                  V4       WïV3#   \        P2                   d7    RT RRP	                  T4       2p\        P                  TRR7       RRT3u # \4         d   p\7        TRR4      pTR8X  d/   \        P                  R RP	                  T4      RR7       R$u Rp?# RT 2p\        P                  R!RP	                  T4      TRR7       RRT3u Rp?# Rp?i\8         dA   p\        P                  R"RP	                  T4      TRR7       RR\        T4      3u Rp?# Rp?ii ; i)%a%  Run a git command against the shared store.  Returns (ok, stdout, stderr).

``allowed_returncodes`` suppresses error logging for known/expected non-zero
exits while preserving the normal ``ok = (returncode == 0)`` contract.
Example: ``git diff --cached --quiet`` returns 1 when changes exist.
zworking directory not found: zGit command skipped: %s (%s)Ú ÚgitFr»   z&working directory is not a directory: ©rÆ   ÚPATH©r3   Nú-zÚtextTr   r•   Úerrorsr¡   Úcapture_outputrÞ   rÚ   ÚcwdÚstdinÚcreationflagsÚcheck)rì   z(Git command failed: %s (rc=%d) stderr=%szgit timed out after zs: r–   ÚfilenamezGit executable not found: %sz,Git command failed before execution: %s (%s)z#Unexpected git error running %s: %s)Fr»   z#git is not installed or not on PATH)Fr»   zgit not found)r5   rX   r¢   Úerrorr½   r®   Úis_dirrÛ   r&   rt   ÚshutilÚwhichrŒ   râ   Ú
subprocessÚrunÚDEVNULLr   Ú
returncoder2   ÚfsdecodeÚstdoutr)   ÚstderrÚdecodeÚTimeoutExpiredÚFileNotFoundErrorÚgetattrÚ	Exception)rÝ   r   r0   rÞ   rß   rÆ   rà   rÙ   ÚmsgrÚ   ræ   ÚcmdÚtext_optionsÚresultÚokrü   rý   ÚexcÚmissing_targets   &&&&&&&            r   Ú_run_gitr
  e  sS  € ô -¨[Ó9ÐØ!×(Ñ(×*Ò*Ø-Ð.DÐ-EÐFˆÜ�‰Ð3°S·X±X¸u¸gÌÈTË
Õ>RÓ5SÐUXÔYØ�b˜#ˆ~ÐØ!×(Ñ(×*Ò*Ø6Ð7MÐ6NÐOˆÜ�‰Ð3°S·X±X¸u¸gÌÈTË
Õ>RÓ5SÐUXÔYØ�b˜#ˆ~Ðä
�5œ#Ð4Ó5À*Ô
M€CßØ�
‰
�9ÔÜ
�,Š,�u 3§7¡7¨6°2Ó#6Ô
7€CØ
‚{Ø?Ð?Øˆ,�ˆ,€CØ-×6Ð6´³Ðð(#à! Tœ\‘r°¸¸jÈ'ÐS[Ð]fÐ/gˆÜ—’Øñ
àð
ð ñ
ð ð	
ð
 ð
ô Ð*Ó+ð
ô ×$Ñ$ð
ô -Ó.ð
ð ò
ˆð ×Ñ !Ñ#ˆØ/3°t¬|”—’˜VŸ]™]Ô+ÀÇÁ×ATÑATÓAVˆØLPÐTXÌL�—‘×%Ñ% g°iÐ%Ó@×FÑFÔHÐ^d×^kÑ^k×^qÑ^qÓ^sˆß�f×'Ñ'Ð/BÔBÜ�L‰LØ:Ø—‘˜“˜v×0Ñ0°&ôð ˜6Ð!Ð!øÜ×$Ñ$ô Ø$ W I¨S°·±¸#³°Ð@ˆÜ�‰�S 4ˆÔ(Ø�b˜#ˆ~ÒÜô Ü   j°$Ó7ˆØ˜UÔ"Ü�L‰LÐ7¸¿¹À#»ÐQUˆLÔVØ-Õ-Ø-Ð.DÐ-EÐFˆÜ�‰ÐCÀSÇXÁXÈcÃ]ÐTWÐbfˆÔgØ�b˜#ˆ~ÕûÜô #Ü�‰Ð:¸C¿H¹HÀS»MÈ3ÐY]ˆÔ^Ø�bœ#˜c›(Ð"Õ"ûð#úsW   Ä2C:I3 È-AI3 É3ANÊ=NËNË<M ÌNÌ	1M Ì:NÍ NÍNÍ5N	ÎNÎ	Nc          
      ó–   € V ^8„  d   QhR\         \        ,          R\        R\        R\        \        \
        ,          ,          R\        /# )r   rÝ   r   r0   Úrcr   )r®   r&   r   r
   râ   rá   )r   s   "r   r   r   ²  s=   € ÷ ñ ”4œ•9ð ¤Tð ¼ð ÄÌ#ÌcÍ(ÕASð Ô_bñ r   c                ó:   € \        WW#R7      w  rEpV'       d   V# R# )z-stdout of a successful git call, else ``""``.©rß   r»   )r
  )rÝ   r   r0   r  r  ÚoutÚ_s   &&&&   r   Ú_git_outr  ²  s   € ä˜$ {ÔK�J€BˆQßˆ3Ð˜"Ðr   c          	      ó^   € V ^8„  d   QhR\         R\        R\        R\        \        ,          /# )r   r   r0   Úrefr   ©r   r&   r
   )r   s   "r   r   r   ¸  s2   € ÷ eñ e”Dð e¤sð e´ð e¼Ä#½ñ er   c                óF   € \        RRVR,           .W^€04      ;'       g    R# )z?Commit sha at ``ref``, or None when the ref does not exist yet.ú	rev-parseú--verifyú	^{commit}N)r  )r   r0   r  s   &&&r   Ú_ref_tipr  ¸  s*   € ä�[ *¨c°KÕ.?Ð@À%ÐWZÐV[Ó\×dÐdÐ`dÐdr   c                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# ©r   r   r0   r   )r   r&   r®   )r   s   "r   r   r   ½  s%   € ÷ 6ñ 6œdð 6´ð 6¼¼c½ñ 6r   c                 ó¤   € \        R R\        .W^€04      pVP                  4        Uu. uF  q3P                  4       '       g   K  VNK  	  up# u upi )zfor-each-refz--format=%(refname))r  rª   Ú
splitlinesr)   )r   r0   r  Úrs   &&  r   Ú_list_project_refsr  ½  sE   € Ü
�NÐ$9¼<ÐHÈ%Ð_bÐ^cÓ
d€CØ—~‘~Ô'Ó5Ñ'�!¯7©7¯9�AˆAÑ'Ñ5Ð5ùÒ5s   ¨AÁAc                ó(   € V ^8„  d   QhR\         RR/# )r   r3   r   Nr   )r   s   "r   r   r   Â  s   € ÷ ñ œð  ñ r   c                 óP   €  V P                  R R7       R#   \         d     R# i ; i)T)Ú
missing_okN)Úunlinkru   ré   s   &r   Ú_unlink_quietr$  Â  s'   € ðØ�‰˜tˆÖ$øÜô Úðús   ‚ –%¤%c                óF   € V ^8„  d   QhR\         R\        \         ,          /# rL   )r   r
   )r   s   "r   r   r   Í  s   € ÷ -ñ -¤ð -¬´$­ñ -r   c                óà  € V P                  4       '       g   R# \        V 4      pRp\        \        0p\	        V P                  4       4       F£  pVP                  pWS9   g   VP                  \        4      '       d   K2  Vf<   \        P                  ! R4      pV \         V 2,          p VP                  RRR7       W%,          p \        P                   ! \#        V4      \#        V4      4       K¥  	  Tp	Ve   \        P%                  RV4       V#   \         d#   p\        P                  RT4        Rp? R# Rp?ii ; i  \         d#   p\        P                  RYG4        Rp?EK  Rp?ii ; i)a  Move pre-v2 per-project shadow repos into a ``legacy-<ts>/`` dir.

The pre-v2 layout had one shadow git repo per working directory directly
under ``CHECKPOINT_BASE``.  The v2 layout wants a single ``store/`` dir.
Rather than delete the old data (users might want to recover), rename
everything except our own v2 entries into ``legacy-<timestamp>/``.  The
legacy dir is subject to the same retention sweep and can be manually
cleared with ``hermes checkpoints clear-legacy``.

Returns the legacy-archive path, or None if nothing to migrate.
Nz%Y%m%d-%H%M%STr’   z'Could not create legacy archive dir: %sz*Could not archive legacy checkpoint %s: %sz_Migrated pre-v2 checkpoint repos to %s. Clear with `hermes checkpoints clear-legacy` when safe.)rX   rP   rO   Ú_PRUNE_MARKER_NAMEr®   ÚiterdirÚnamer*   Ú_LEGACY_PREFIXÚtimeÚstrftimer�   ru   r¢   Úwarningrõ   Úmover&   Úinfo)
rM   r   Úlegacy_rootÚreservedÚchildr)  Ústampr  Údestr  s
   &         r   Ú_migrate_legacy_storer5  Í  s<  € ð �;‰;�=Š=ÙÜ˜Ó€EØ"&€KäÔ 2Ð3€HÜ�d—l‘l“nÖ%ˆØ�z‰zˆØÔ˜tŸ™¬~×>Ò>Ùð ÒÜ—M’M /Ó2ˆEØ¤NÐ#3°E°7Ð!;Õ;ˆKðØ×!Ñ!¨$¸Ð!Ô>ð Õ!ˆð	UÜ�KŠKœ˜E›
¤C¨£IÖ.ñ! &ð( 	€AØÒÜ�‰ðFàô	
ð
 Ðøô! ô Ü—‘ÐHÈ#ÔNÞûðûô ô 	UÜ�N‰NÐGÈ×TÓTûð	Uús0   Â)DÃ)E ÄD=ÄD8Ä8D=Å E-ÅE(Å(E-c                óR   € V ^8„  d   QhR\         R\        R\        \        ,          /# r  r  )r   s   "r   r   r   ý  s*   € ÷ Gñ G”tð G¬#ð G´(¼3µ-ñ Gr   c                óh  € V P                   pV P                  4       '       g     VP                  RRR7       \	        T4       V R,          P                  4       '       d   R# T P                  RRR7       V \
        ,          P                  RR7       V \        ,          P                  RR7       ^ RIHp \        V! RRR	7      4      p\        P                  VR
&   \        P                  VR&   RVR&   R F  pVP                  VR4       K  	   \        P                  ! RVP                  RR4      R7      pVf   R# \         P"                  ! VRR\%        V 4      .RRRRV\&        \         P(                  \+        4       RR7
      pVP,                  ^ 8w  d   RVP.                  P1                  4        2#  \%        T4      p	\7        . ROY	4       \7        . R OY	4       \7        . R!OY	4       \7        . R"OY	4       \7        . R#OY	4       T R,          p
T
P                  RR7       T
R,          P9                  RP;                  \<        4      R,           RR7       \>        PA                  RT 4       R#   \         d   pRT 2u Rp?# Rp?ii ; i  \         P2                  \4        3 d   pRT 2u Rp?# Rp?ii ; i)$z«Initialise the shared shadow store if needed.  Returns error or None.

Also performs one-time migration of pre-v2 per-directory shadow repos
into ``legacy-<timestamp>/``.
Tr’   z"Could not create checkpoint base: NrV   )r”   rÈ   FrÊ   rÒ   rÓ   rÔ   rÕ   ræ   rè   r»   ré   z=Shadow store init failed: git is not installed or not on PATHÚinitz--barer•   r¡   )	rí   rë   r   rì   rÚ   rÞ   rï   rð   rñ   zShadow store init failed: r/  ÚexcludeÚ
r~   z"Initialised checkpoint store at %s)rÍ   rÎ   rÑ   rÏ   rÐ   )Úconfigz
user.emailzhermes@local)r;  z	user.namezHermes Checkpoint)r;  zcommit.gpgsignÚfalse)r;  ztag.gpgSignr<  )r;  zgc.autoÚ0)!rœ   rX   r�   ru   r5  r`   rÃ   rÖ   rÉ   r   r2   rØ   r×   rõ   rö   rŒ   r÷   rø   r&   Ú_GIT_TIMEOUTrù   r   rú   rý   r)   rÿ   r   r
  rŸ   r½   ÚDEFAULT_EXCLUDESr¢   r£   )r   r0   rM   r  rÉ   Úinit_envÚkræ   r  Úcfg_wdÚinfo_dirs   &&         r   Ú_init_storerD  ý  s`  € ð �<‰<€Dà�<‰<�>Š>ð	>Ø�J‰J˜t¨dˆJÔ3ô
 	˜dÔ#à��×Ñ× Ò Ùà	‡K�K˜ t€KÔ,Ø
ÔÕ×$Ñ$¨dÐ$Ô3Ø
ÔÕ×%Ñ%¨tÐ%Ô4õ
 >äÑ 4À5Ð_dÔ eÓf€HÜ$&§J¡J€HÐ Ñ!Ü$&§J¡J€HÐ Ñ!Ø&)€HÐ"Ñ#ó2ˆà�‰�Q˜Öñ2ð2Ü�lŠl˜5 x§|¡|°F¸BÓ'?Ô@ˆØŠ;ÙRÜ—’Ø�&˜(¤C¨£JÐ/Ø d°WÀYØ¤,Ü×$Ñ$Ü,Ó.Øô
ˆð ×Ñ Ô!Ø/°·±×0CÑ0CÓ0EÐ/FÐGÐGð "ô �‹Y€FÜÒ5°uÔEÜÒ9¸5ÔIÜÒ2°EÔBÜÒ/°Ô?ÜÒ'¨Ô7à�v�~€HØ‡N�N˜D€NÔ!Ø�	Õ×%Ñ%Ø�	‰	Ô"Ó# dÕ*°Wð &ô ô ‡L�LÐ5°uÔ=Ùøôy ô 	>Ø7¸°uÐ=Õ=ûð	>ûôP ×%Ñ%Ô'8Ð9ô 2Ø+¨C¨5Ð1Õ1ûð2úsB   ¤I* Ä,J Ä<A4J É*JÉ5I?É9JÉ?JÊJ1Ê"J,Ê&J1Ê,J1c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úworkdirr   )r   r{   )r   s   "r   r   r   G  s   € ÷ ñ œdð ¤tñ r   c                ó  €  V P                  4       '       g   / # V P                  P                  4       pVP                  '       d   VP                  '       g   / # RVP                  RVP                  /#   \
         d    / u # i ; i)u  Record the identity of ``workdir``'s parent while the project is live.

``(st_dev, st_ino)`` of the parent directory, captured at a moment when
the workdir itself is reachable, identifies the *directory* â€” not just
the path.  A mount point resolves to the mounted filesystem's root while
the volume is attached and to the underlying (underlay) directory after
unmount: same path, different directory, different ``(st_dev, st_ino)``.
Orphan pruning uses this to distinguish "the project was deleted out of
the directory we knew" from "a different directory is now visible at
that path because the volume is detached".

Returns ``{}`` when the workdir is not currently reachable, when the
filesystem does not provide a usable directory identity (a zero
``st_dev`` or ``st_ino`` â€” e.g. Windows filesystems without file IDs and
some network shares), or when the probe fails â€” callers treat all of
these as "no evidence recorded" and orphan pruning stays conservative
for the project (never classified as orphan; retention still applies).
Úworkdir_parent_devÚworkdir_parent_ino)rX   rœ   ÚstatÚst_devÚst_inoru   )rF  Ústs   & r   Ú_volume_evidencerN  G  ss   € ð&Ø�~‰~×ÒØˆIØ�^‰^× Ñ Ó"ˆØ�y�yˆy §	§	 	ØˆIà  "§)¡)Ø  "§)¡)ð
ð 	
øô ô ØŠ	ðús-   ‚A4 ˜A4 š+A4 ÁA4 ÁA4 ÁA4 Á4BÂBc                ó4   € V ^8„  d   QhR\         R\        RR/# ©r   r   r0   r   Nr]   )r   s   "r   r   r   h  s&   € ÷ Pñ PœTð P´ð P¸ñ Pr   c                ó  € \        V4      p\        W4      p\        P                  ! 4       pR\        \	        V4      4      RVRV/p\        \	        V4      4      pV'       d   VP                  V4       VP                  4       '       dv    \        P                  ! VP                  RR7      4      p\        V\        4      '       d9   VP                  RV4      VR&   V'       g   R F  pW‡9   g   K  Wx,          WX&   K  	   VP                   P#                  RRR7       VP%                  \        P&                  ! V4      RR7       R
#   \        \        3 d     LZi ; i  \         d"   p	\(        P+                  R	Y94        R
p	?	R
# R
p	?	ii ; i)zDCreate or update ``projects/<hash>.json`` with workdir + timestamps.rF  Ú
created_atÚ
last_touchr}   r~   Tr’   r•   z'Could not write project metadata %s: %sN)rH  rI  )rJ   rÄ   r+  r&   r5   rN  rt   rX   r�   r‚   r€   rƒ   r{   rŒ   ru   r8   rœ   r�   rŸ   r    r¢   r£   )
r   r0   r\   Ú	meta_pathÚnowÚmetaÚevidenceÚexistingr�   r  s
   &&        r   Ú_register_projectrY  h  sH  € ä˜[Ó)€HÜ" 5Ó3€IÜ
�)Š)‹+€CØœS¤°Ó!=Ó>Ø  \°3ð8€Dä¤°Ó <Ó=€HßØ�‰�HÔØ×Ñ×Òð	Ü—z’z )×"5Ñ"5¸{Ð"5Ó"KÓLˆHÜ˜(¤D×)Ò)Ø%-§\¡\°,ÀÓ%D��\Ñ"ßó
  L˜Øž?Ø(0­˜D›Iñ  Lð
PØ×Ñ×Ñ t°dÐÔ;Ø×ÑœTŸZšZ¨Ó-¸ÐÖ@øô	 œÐ$ô 	Ùð	ûô
 ô PÜ�‰Ð>À	×OÒOûðPús8   Â
AE Ã#E Ã0E Ã?AE ÅEÅEÅFÅ'FÆFc                ó4   € V ^8„  d   QhR\         R\        RR/# rP  r]   )r   s   "r   r   r   ˆ  s&   € ÷ Qñ Qœ$ð Q¬Sð Q°Tñ Qr   c                óÀ  € \        V4      p\        W4      pVP                  4       '       g   \        W4       R#  \        P
                  ! VP                  RR7      4      p\        V\        4      '       g   / p\        \        V4      4      VR&   \        P                  ! 4       VR&   VP                  RVR,          4       \        \        V4      4      pV'       d   VP!                  V4        VP#                  \        P$                  ! V4      RR7       R#   \        \        3 d    / p LÌi ; i  \         d"   p\&        P)                  RY64        Rp?R# Rp?ii ; i)	z7Update last_touch for a project, preserving created_at.Nr}   r~   rF  rS  rR  r•   z(Could not update project metadata %s: %s)rJ   rÄ   rX   rY  r�   r‚   r€   ru   r8   rƒ   r{   r&   r5   r+  Ú
setdefaultrN  rt   rŸ   r    r¢   r£   )r   r0   r\   rT  rV  rW  r  s   &&     r   Ú_touch_projectr]  ˆ  s  € ä˜[Ó)€HÜ" 5Ó3€IØ×Ñ×ÒÜ˜%Ô-ÙðÜ�zŠz˜)×-Ñ-°{Ð-ÓCÓDˆô �dœD×!Ò!ØˆÜœ/¨+Ó6Ó7€Dˆ�OÜŸš›€DˆÑØ‡O�O�L $ |Õ"4Ô5ô
  ¤°Ó <Ó=€HßØ�‰�HÔðQØ×ÑœTŸZšZ¨Ó-¸ÐÖ@øô ”ZÐ ô ØŠðûô  ô QÜ�‰Ð?À×PÒPûðQús)   »&D Ã/'D1 ÄD.Ä-D.Ä1EÄ<EÅEc                óF   € V ^8„  d   QhR\         R\        \        ,          /# rR   ©r   r®   r{   )r   s   "r   r   r   ¥  s   € ÷ ñ œ$ð ¤4¬¥:ñ r   c                ót  € V \         ,          pVP                  4       '       g   . # . pVP                  R4       Fc  pVP                  p \        P
                  ! VP                  RR7      4      p\        T\        4      '       g   KN  YER&   TP                  T4       Ke  	  V#   \        \        3 d     K}  i ; i)z/Return all registered projects under the store.z*.jsonr}   r~   Ú_hash)rÃ   rX   ÚglobÚstemr�   r‚   r€   ru   r8   rƒ   r{   Úappend)r   Úprojects_dirr  rT  r\   rV  s   &     r   Ú_list_projectsrf  ¥  sª   € àÔ,Õ,€LØ×Ñ× Ò Øˆ	Ø€CØ!×&Ñ& xÖ0ˆ	Ø—>‘>ˆð	Ü—:’:˜i×1Ñ1¸;Ð1ÓGÓHˆDô ˜$¤×%Ò%ÙØ ˆW‰Ø�
‰
�4Öñ 1ð €Jøô œÐ$ô 	Úð	ús   Á	&B"Â"B7Â6B7c                óF   € V ^8„  d   QhR\         R\        \        ,          /# rL   r_  )r   s   "r   r   r   ¸  s   € ÷ #ñ #œtð #¬¬T­
ñ #r   c                ó’  € . pV P                  4       '       g   V# V P                  4        Fý  pVP                  4       '       g   K  VP                  \        8X  g&   VP                  P                  \        4      '       d   KW  VR,          P                  4       '       g   Kv  RpRpVR,          pVP                  4       '       d"    VP                  RR7      P                  4       pTP                  RTR	TR
\        V4      ;'       d    \        V4      P                  4       RV/4       Kÿ  	  V#   \        \        3 d    RpRp L`i ; i)a`  Return pre-v2 per-project shadow repos still directly under ``base``.

Pre-v2 layout kept one shadow git repo per working directory directly
under ``CHECKPOINT_BASE`` (identified by a ``HEAD`` file).  This is the
single source of truth for that scan so a preview built from it (e.g.
``store_status``) always matches what ``prune_checkpoints`` deletes.
rV   NFÚHERMES_WORKDIRr}   r~   Tr3   rF  rX   Úmarker_unreadable)rX   r(  rô   r)  rO   r*   r*  r€   r)   ru   ÚUnicodeDecodeErrorrd  rT   r   )rM   r  r2  rF  rj  Ú	wd_markers   &     r   Ú_pre_v2_shadow_reposrm  ¸  s"  € ð €CØ�;‰;�=Š=Øˆ
Ø—‘–ˆØ�|‰|�~Š~ÙØ�:‰:œÔ'¨5¯:©:×+@Ñ+@Ä×+PÒ+PÙØ˜•×&Ñ&×(Ò(ÙØ!%ˆØ!ÐØÐ,Õ,ˆ	Ø×Ñ×Òð)Ø#×-Ñ-°{Ð-ÓC×IÑIÓK�ð 	�
‰
Ø�EØ�wØ”d˜7“m×>Ð>¬¨W«×(<Ñ(<Ó(>ØÐ!2ð	
ö 	ñ%  ð0 €Jøô Ô/Ð0ô )ð �Ø$(Ò!ð	)ús   Ã D.Ä.EÅEc                ó0   € V ^8„  d   QhR\         R\        /# ri   )r&   rá   )r   s   "r   r   r   Þ  s   € ÷ 
ñ 
œ#ð 
¤#ñ 
r   c                ó®   € ^ p \        V 4      P                  R4       F  pV^,          pV\        8”  g   K  Vu # 	  V#   \        \        3 d     T# i ; i)z;Quick file count estimate (stops early if over _MAX_FILES).Ú*)r   ÚrglobÚ
_MAX_FILESÚPermissionErrorru   )r3   Úcountr  s   &  r   Ú_dir_file_countru  Þ  s`   € à€EðÜ�d“×!Ñ! #Ö&ˆAØ�Q�JˆEØ”zÖ!Ø’ñ 'ð €Løô œWÐ%ô ØØ€Lðús   „.? ·? »? ¿AÁAc                ó0   € V ^8„  d   QhR\         R\        /# ri   )r   rá   )r   s   "r   r   r   ë  s   € ÷ ñ œ$ð ¤3ñ r   c                óö   € ^ p V P                  R4       F<  p VP                  4       '       d#   WP                  4       P                  ,          pK<  K>  	  V#   \         d     KP  i ; i  \         d     T# i ; i)z9Best-effort recursive size in bytes.  Returns 0 on error.rp  )rq  Úis_filerJ  Úst_sizeru   )r3   ÚtotalÚps   &  r   Ú_dir_size_bytesr|  ë  sx   € à€EðØ—‘˜C–ˆAðØ—9‘9—;’;ØŸV™V›X×-Ñ-Õ-’Eñ ñ !ð €Løô	 ô Úðûäô ØØ€Lðús4   „A) ™6AÁA) ÁA&Á"A) Á%A&Á&A) Á)A8Á7A8c                   ó®  a € ] tR tRt o RtR/V 3R lR lltV 3R lR ltR0V 3R lR lltV 3R	 lR
 ltV 3R lR lt	R1V 3R lR llt
V 3R lR ltV 3R lR lt]V 3R lR l4       tV 3R lR ltV 3R lR ltV 3R lR ltR2V 3R lR lltV 3R lR ltV 3R  lR! ltV 3R" lR# ltR$R%/V 3R& lR' lltV 3R( lR) ltV 3R* lR+ ltV 3R, lR- ltR.tV tR# )3ÚCheckpointManageriþ  aþ  Manages automatic filesystem checkpoints.

Designed to be owned by AIAgent.  Call ``new_turn()`` at the start of
each conversation turn and ``ensure_checkpoint(dir, reason)`` before
any file-mutating tool call.  The manager deduplicates so at most one
snapshot is taken per directory per turn.

Parameters
----------
enabled : bool
    Master switch (from config / CLI flag).
max_snapshots : int
    Keep at most this many checkpoints per directory.
max_total_size_mb : int
    Hard ceiling on total store size.  Oldest checkpoints per project
    are dropped when the store exceeds this after a commit.
max_file_size_mb : int
    Skip adding any single file larger than this to a checkpoint.
    (Implemented via ``.gitignore`` excludes + a post-stage size check.)
c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )r   ÚenabledÚmax_snapshotsÚmax_total_size_mbÚmax_file_size_mb)rT   rá   )r   Ú__classdict__s   "€r   r   ÚCheckpointManager.__annotate__  s3   ø€ ÷ 2ñ 2áð2ñ ð2ñ ð	2ñ
 ñ2r   c                óÌ   € Wn         \        ^\        V4      4      V n        \        ^ \        V4      4      V n        \        ^ \        V4      4      V n        \        4       V n        R# )rm   N)r€  Úmaxrá   r�  r‚  rƒ  râ   Ú_checkpointed_dirs)Úselfr€  r�  r‚  rƒ  s   &&&&&r   Ú__init__ÚCheckpointManager.__init__  sQ   € ð ŒÜ  ¤C¨Ó$6Ó7ˆÔÜ!$ Q¬Ð,=Ó(>Ó!?ˆÔÜ # A¤sÐ+;Ó'<Ó =ˆÔÜ,/«EˆÖr   c                ó   <€ V ^8„  d   QhRR/# )r   r   Nr   )r   r„  s   "€r   r   r…  %  s   ø€ ÷ (ñ (˜$ñ (r   c                ó:   € V P                   P                  4        R# )zAReset per-turn dedup.  Call at the start of each agent iteration.N)rˆ  Úclear)r‰  s   &r   Únew_turnÚCheckpointManager.new_turn%  s   € à×Ñ×%Ñ%Ö'r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# )r   Útask_idr   r%   )r   r„  s   "€r   r   r…  )  s   ø€ ÷ 
ñ 
±#ð 
ÁhÉsÅmñ 
r   c                ó6   € ^ RI Hp V! V4      pVf   R# RV R2# )zóExplain why host checkpoints are off limits for a container-backed session.

Classifies the task's backend at call time (nothing is remembered), so /rollback is
refused before the first mutation and follows a backend change within the session.)Úcontainer_backend_for_taskNz/Checkpoints are not taken for terminal.backend=z4: file paths belong to the container, not this host.)Útools.file_tools_pathsr”  )r‰  r’  r”  Úbackends   &&  r   Úunsupported_backend_reasonÚ,CheckpointManager.unsupported_backend_reason)  s3   € õ
 	FÙ,¨WÓ5ˆØŠ?Ùà=¸g¸Yð GAð Að	
r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r/   r   NrB   )r   r„  s   "€r   r   r…  ;  s   ø€ ÷ Qñ Q©Cð Q°Dñ Qr   c                óü  € V P                   '       g   R#  ^ RIHp \        V4      p\	        V4      pVf   R# V! \        4       4      ;_uu_ 4        \        4       pV P                  \        V4      4      p\        WV4      pRVR\        P                  ! 4       /V\        V4      &   \        WVV4       RRR4       R#   + '       g   i     R# ; i  \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)up  Record the content hash of a file Hermes just successfully wrote.

Feeds the agent-write ledger used by :meth:`restore` in safe mode:
at restore time, a file whose current content no longer matches the
recorded hash was hand-edited by the user after Hermes last touched
it, and is skipped instead of clobbered.

Never raises â€” the ledger is best-effort bookkeeping.
N©Ú
store_lockrF   r‹   z$record_agent_write failed for %s: %s)r€  Útools.checkpoint_pruningrœ  r5   rx   r   rP   Ú_ledger_keyr&   r†   r+  r¦   r  r¢   r£   )	r‰  r/   rœ  r3   Údigestr   r\   rˆ   r  s	   &&       r   Úrecord_agent_writeÚ$CheckpointManager.record_agent_write;  sÄ   € ð �|�|ˆ|Ùð	QÝ;ä" 9Ó-ˆDÜ Ó%ˆFØŠ~ÙÙÔ4Ó6×7Õ7Ü#›�Ø×+Ñ+¬C°«IÓ6�Ü% eÓ6�Ø%-¨v°t¼T¿YºY»[Ð$I�”s˜4“yÑ!Ü˜U¨fÔ5÷ 8×7×7Ò7ûô ô 	QÜ�L‰LÐ?À×PÒPûð	Qús;   – C ¸C ÁA!B;Â1C Â;C	ÃC ÃC ÃC;ÃC6Ã6C;c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# ©r   r0   r$   r   ©r&   r{   )r   r„  s   "€r   r   r…  W  s'   ø€ ÷ ?Iñ ?I©cð ?IÁð ?IÉñ ?Ir   c                óÄ  € \        V4      pV'       d   RRRV/# \        \        V4      4      p\        4       pVR,          P	                  4       '       g   RRRR/# \        V4      p\        WV4      p\        RR.WT\        ^,          VR7       \        R	R
RVR.WTVR7      w  r‰p
\        R\        V4      .WTV^€0R7       V'       g
   RRRRV
 2/# \        WPP                  V4      4      pV'       g   RRR. R. RR/# . p. p\        RV	P                  R4      4       F¼  p\        V4      V,          pVP                  \        V4      4      p\!        V\"        4      '       d   VP                  R4      MRpVf   VP%                  V4       Ko  \'        V4      pVf   VP%                  V4       K‘  VV8X  d   VP%                  V4       K«  VP%                  V4       K¾  	  RRRVRV/# )aq  Classify files changed since ``commit_hash`` for a safe restore.

Returns ``{"success", "restore": [rel...], "skipped": [rel...],
"error"?}`` where ``restore`` lists files whose current content
still matches what Hermes last wrote (per the agent-write ledger)
and ``skipped`` lists files the user hand-edited after Hermes'
last write or that Hermes never wrote at all.
ÚsuccessFró   rV   ú'No checkpoints exist for this directoryÚaddú-A©rÞ   rÆ   Údiffz--name-onlyrê   ú--cachedrç   ú	read-tree©rÆ   rß   z!Could not compute changed files: TÚrestoreÚskippedÚledger_emptyNr°   rF   )r-   r&   r5   rP   rX   rJ   rb   r
  r>  r«   r†   rž  Úfilterr²   r   rŒ   rƒ   r{   rd  rx   )r‰  r0   r$   Úhash_errÚabs_dirr   r\   rÆ   r  Ú	names_outÚerrrˆ   r¯  r°  ÚrelrI   ÚentryÚrecordedÚcurrents   &&&                r   Ú_safe_restore_planÚ$CheckpointManager._safe_restore_planW  sé  € ô )¨Ó5ˆßØ˜u g¨xÐ8Ð8ä”o kÓ2Ó3ˆÜ“ˆØ˜•×&Ñ&×(Ò(Ø˜u gÐ/XÐYÐYä  Ó)ˆÜ  Ó1ˆ
ô 	�%˜� Ü%¨Õ)°jõ	Bä%Ø�] D¨+°zÐBØ zô
Ñˆ�sô
 	�+œy¨Ó2Ð3°UØ&¸S¸Eõ	CçØ˜u gÐ1RÐSVÐRWÐ/XÐYÐYô ˜e×%5Ñ%5°gÓ%>Ó?ˆßð
 ˜t Y°°I¸rØ" Dð*ð *àˆØˆÜ˜$ 	§¡°Ó 7Ö8ˆCÜ˜G“} sÕ*ˆHØ—J‘Jœs 8›}Ó-ˆEÜ.8¸Ä×.EÒ.E�u—y‘y Ô*È4ˆHØÒð —‘˜sÔ#ÙÜ  Ó*ˆGØŠð —‘˜sÖ#Ø˜HÔ$Ø—‘˜sÖ#à—‘˜sÖ#ñ# 9ð$ ˜4 ¨G°YÀÐHÐHr   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# )r   r0   Úreasonr   ©r&   rT   )r   r„  s   "€r   r   r…  ˜  s"   ø€ ÷ ñ ©Sð ¹#ð É4ñ r   c                ó"  € V P                   '       g   R# \        \        V4      4      pVR\        \        P                  ! 4       4      09   d   \
        P                  RV4       R# W0P                  9   d   R# T P                  P                  V4        ^ RI	H
p V! \        4       4      ;_uu_ 4        V P                  W24      uuRRR4       #   + '       g   i     R# ; i  \         d"   p\
        P                  RT4        Rp?R# Rp?ii ; i)u¨   Take a checkpoint if enabled and not already done this turn.

Returns True if a checkpoint was taken, False otherwise.
Never raises â€” all errors are silently logged.
Fr©   z,Checkpoint skipped: directory too broad (%s)r›  Nz!Checkpoint failed (non-fatal): %s)r€  r&   r5   r   Úhomer¢   r£   rˆ  r¨  r�  rœ  r   Ú_taker  )r‰  r0   r¾  r´  rœ  Úes   &&&   r   Úensure_checkpointÚ#CheckpointManager.ensure_checkpoint˜  sÁ   € ð �|�|ˆ|Ùä”o kÓ2Ó3ˆð �sœC¤§	¢	£Ó,Ð-Ô-Ü�L‰LÐGÈÔQÙà×-Ñ-Ô-Ùà×Ñ×#Ñ# GÔ,ð	Ý;áÔ4Ó6×7Õ7Ø—z‘z 'Ó2÷ 8×7×7Ó7ûäô 	Ü�L‰LÐ<¸aÔ@Ýûð	ús6   ÂC" Â2CÃ
C" ÃC	ÃC" ÃC" Ã"DÃ-D	Ä	Dc                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# rA   )r&   r®   r{   )r   r„  s   "€r   r   r…  ¶  s   ø€ ÷ 'ñ '©Cð '±D¹µJñ 'r   c                ó¨  € \        \        V4      4      p\        4       pVR,          P                  4       '       g   . # \	        \        V4      4      p\        RVRR\        V P                  4      .W2^€^�0R7      w  rVpV'       d	   V'       g   . # . pVP                  4        F­  p	V	P                  R^4      p
\        V
4      ^8X  g   K'  RV
^ ,          RV
^,          R	V
^,          R
V
^,          R^ R^ R^ /p\        RRV
^ ,           R2V
^ ,          .W2^€^�0R7      w  rÍpV'       d   V'       d   V P                  WÛ4       VP                  V4       K¯  	  V# )z?List available checkpoints for a directory (most recent first).rV   Úlogz--format=%H|%h|%aI|%sz-nr  Ú|ÚhashÚ
short_hashÚ	timestampr¾  Úfiles_changedÚ
insertionsÚ	deletionsr«  z--shortstatz~1)r&   r5   rP   rX   r«   rJ   r
  r�  r  r²   r˜   Ú_parse_shortstatrd  )r‰  r0   r´  r   r  r  rü   r  ÚresultsÚlineÚpartsr¸  Ústat_okÚstat_outs   &&            r   Úlist_checkpointsÚ"CheckpointManager.list_checkpoints¶  sG  € ä”o kÓ2Ó3ˆÜ“ˆà˜•×&Ñ&×(Ò(ØˆIäœ gÓ.Ó/ˆÜ Ø�CÐ0°$¼¸D×<NÑ<NÓ8OÐPØØ!$ c 
ô
‰ˆ�A÷ ŸØˆIà ˆØ×%Ñ%Ö'ˆDØ—J‘J˜s AÓ&ˆEÜ�5‹z˜QŽà˜E !�HØ  %¨¥(Ø  q¥Ø˜e A�hØ# QØ  !Ø ð�ô (0Ø˜]¨u°Q­x¨j¸¨O¸UÀ1½XÐFØØ),¨c¨
ô(Ñ$� 1÷
 ŸxØ×)Ñ)¨(Ô:Ø—‘˜uÖ%ñ' (ð( ˆr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r   )r®   r{   )r   r„  s   "€r   r   r…  ß  s   ø€ ÷ ñ ¡d©4¥jñ r   c                óL  € \        4       pVR,          P                  4       '       g   . # . p\        V4       FU  pVP                  R4      ;'       g    RpV'       g   K(  V P	                  V4       F  pWER&   VP                  V4       K  	  KW  	  VP                  R RR7       V# )ao  List checkpoints across every registered project (most recent first).

Surgical reapply of PR #10633 by @nightq (#10505) onto the v2
single-store layout: iterate ``projects/<hash>.json`` metadata via
``_list_projects`` instead of the pre-v2 per-shadow-dir scan. Each
entry carries the extra ``workdir`` key so callers can label which
project a checkpoint belongs to.
rV   rF  r»   c                 ó&   € V P                  R R4      # )rÌ  r»   )rŒ   )Úxs   &r   rp   Ú8CheckpointManager.list_all_checkpoints.<locals>.<lambda>ó  s   €  1§5¡5¨°bÔ#9r   Tr�   )rP   rX   rf  rŒ   rÖ  rd  Úsort)r‰  r   rÑ  rV  rF  r¸  s   &     r   Úlist_all_checkpointsÚ&CheckpointManager.list_all_checkpointsß  s”   € ô “ˆØ˜•×&Ñ&×(Ò(ØˆIØ ˆÜ" 5Ö)ˆDØ—h‘h˜yÓ)×/Ð/¨RˆGßÙØ×.Ñ.¨wÖ7�Ø#*�iÑ Ø—‘˜uÖ%ó 8ñ	 *ð 	�‰Ñ9À4ˆÔHØˆr   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   Ú	stat_liner¸  r   Nr¤  )r   r„  s   "€r   r   r…  ÷  s"   ø€ ÷ 
1ñ 
1¡Cð 
1±ð 
1¸ñ 
1r   c                ór  € \         P                  ! RV 4      pV'       d   \        VP                  ^4      4      VR&   \         P                  ! RV 4      pV'       d   \        VP                  ^4      4      VR&   \         P                  ! RV 4      pV'       d    \        VP                  ^4      4      VR&   R# R# )z-Parse git --shortstat output into entry dict.z
(\d+) filerÍ  z(\d+) insertionrÎ  z(\d+) deletionrÏ  N)ÚreÚsearchrá   Úgroup)rá  r¸  Úms   && r   rÐ  Ú"CheckpointManager._parse_shortstatö  s†   € ô �IŠI�m YÓ/ˆßÜ%(¨¯©°«£_ˆE�/Ñ"Ü�IŠIÐ(¨)Ó4ˆßÜ"% a§g¡g¨a£j£/ˆE�,ÑÜ�IŠIÐ'¨Ó3ˆßÜ!$ Q§W¡W¨Q£Z£ˆE�+Óñ r   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# r£  r¤  )r   r„  s   "€r   r   r…    s"   ø€ ÷ 9ñ 9¡ð 9±#ð 9¹$ñ 9r   c                óö   € ^ RI HpHp  V! \        4       4      ;_uu_ 4        V P	                  W4      uuRRR4       #   + '       g   i     R# ; i  T\
        3 d   pRRR\        T4      /u Rp?# Rp?ii ; i)z<Show diff between a checkpoint and the current working tree.©Ú
PruneErrorrœ  Nr¦  Fró   )r�  rë  rœ  r   Ú_diffru   r&   )r‰  r0   r$   rë  rœ  r  s   &&&   r   r«  ÚCheckpointManager.diff  s[   € çCð	9ÙÔ4Ó6×7Õ7Ø—z‘z +Ó;÷ 8×7×7Ó7ûàœGÐ$ô 	9Ø˜u g¬s°3«xÐ8Õ8ûð	9ús7   ŠA ¢>³
A ¾A	Á	A ÁA ÁA8ÁA3Á-A8Á3A8c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# r£  r¤  )r   r„  s   "€r   r   r…    s"   ø€ ÷ /
ñ /
¡ð /
±3ð /
¹4ñ /
r   c                óV  € \        V4      pV'       d   R RRV/# \        \        V4      4      p\        4       pVR,          P	                  4       '       g   R RRR/# \        RRV.WT4      w  rgpV'       g   R RRRV R2/# \        V4      p	\        WY4      p
\        R	R
.WT\        ^,          V
R7       \        RRVR.WTV
R7      w  r¼p\        RVRR.WTV
R7      w  rÞp\        V	4      p\        RV.WTV
^€0R7       V'       g   V'       g   R RRR/# R RRV'       d   TMRRV'       d   V/# R/# )r¦  Fró   rV   r§  úcat-fileú-túCheckpoint 'ú' not foundr¨  r©  rª  r«  z--statr¬  rç   z
--no-colorr­  r®  zCould not generate diffTrJ  r»   )
r-   r&   r5   rP   rX   r
  rJ   rb   r>  r«   )r‰  r0   r$   r³  r´  r   r  r  Ú_errr\   rÆ   Úok_statrÕ  Úok_diffÚdiff_outr  s   &&&             r   rì  ÚCheckpointManager._diff  so  € Ü(¨Ó5ˆßØ˜u g¨xÐ8Ð8ä”o kÓ2Ó3ˆÜ“ˆà˜•×&Ñ&×(Ò(Ø˜u gÐ/XÐYÐYäØ˜˜{Ð+¨Uó
‰ˆˆt÷ Ø˜u g°¸k¸]È+Ð/VÐWÐWä  Ó)ˆÜ  Ó1ˆ
ô 	�%˜� Ü%¨Õ)°jõ	Bô  (Ø�X˜{¨JÐ7Ø zô 
Ñˆ˜1ô  (Ø�[ *¨lÐ;Ø zô 
Ñˆ˜1ô ˜Ó!ˆÜ�+˜sÐ# UØ&Ø&) Uõ	,÷ ŸwØ˜u gÐ/HÐIÐIð �tØ§‘H¨RØ§�Hð
ð 	
ð .0ð
ð 	
r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rA   r¤  )r   r„  s   "€r   r   r…  >  s   ø€ ÷ ñ ©ð ±ñ r   c                ój  € V P                  V4      pV'       g   RRRRRRRR/# VR	,          P                  R4      ;'       g    RpV P                  W4      pVP                  R4      '       dF   VP                  RV4       VP                  R4      '       g   VP                  R4      '       g   RVR&   V# )
uÖ  Show the cumulative diff of everything changed in this directory.

This powers ``/diff session``.  It answers "what has Hermes changed
here?" by diffing the *earliest retained checkpoint* â€” the snapshot
taken before the first recorded edit â€” against the current working
tree.  Because checkpoints are captured just before each file-mutating
tool call, that baseline is the pre-edit state, so the diff covers the
first edit and everything after it.

Note: checkpoints are a persistent per-project ref, so the earliest
*retained* checkpoint may predate the current session (or, after
pruning, postdate its true start).  It is an approximation of "what
Hermes changed", not an exact per-session ledger.

Returns the same shape as :meth:`diff` (``{"success", "stat",
"diff"}``).  When no checkpoints exist yet â€” nothing has been edited â€”
the call still *succeeds* with empty output and ``"empty": True`` so
callers can show a friendly "no changes" message rather than an error.
r¦  TrJ  r»   r«  ÚemptyrÊ  Úbaselineéÿÿÿÿ)rÖ  rŒ   r«  r\  )r‰  r0   r   rü  r  s   &&   r   Úsession_diffÚCheckpointManager.session_diff>  s¢   € ð( ×+Ñ+¨KÓ8ˆßØ˜t V¨R°¸¸WÀdÐKÐKà˜r•?×&Ñ& vÓ.×4Ð4°"ˆØ—‘˜;Ó1ˆØ�:‰:�i× Ò Ø×Ñ˜j¨(Ô3Ø—:‘:˜f×%Ò%¨f¯j©j¸×.@Ò.@Ø"&��w‘Øˆr   Nc          
      óF   <€ V ^8„  d   QhRS[ RS[ RS[ R,          RS[RS[/# ©r   r0   r$   r/   NÚsafer   ©r&   rT   r{   )r   r„  s   "€r   r   r…  ^  sA   ø€ ÷ 9ñ 9áð9ñ ð9ñ ˜•:ð	9ñ
 ð9ñ 
ñ9r   c                óø   € ^ RI HpHp  V! \        4       4      ;_uu_ 4        V P	                  WW44      uuRRR4       #   + '       g   i     R# ; i  T\
        3 d   pRRR\        T4      /u Rp?# Rp?ii ; i)uü  Restore files to a checkpoint state.

With ``safe=True`` (full-directory restores only), files the user
hand-edited after Hermes' last write â€” per the agent-write ledger â€”
are left untouched, and only Hermes-authored changes are reverted.
The result gains ``skipped_user_edits`` listing the preserved paths,
``skipped_oversize`` listing paths kept because the size cap excluded
them from every checkpoint, and â€” only when a delete failed â€”
``failed_deletes`` listing paths that could not be removed.
rê  Nr¦  Fró   )r�  rë  rœ  r   Ú_restoreru   r&   )r‰  r0   r$   r/   r  rë  rœ  r  s   &&&&&   r   r¯  ÚCheckpointManager.restore^  s`   € ÷" 	Dð	9ÙÔ4Ó6×7Õ7Ø—}‘} [¸yÓO÷ 8×7×7Ó7ûàœGÐ$ô 	9Ø˜u g¬s°3«xÐ8Õ8ûð	9ús7   ŠA ¢?´
A ¿A	Á
A ÁA ÁA9Á A4Á.A9Á4A9c          
      óF   <€ V ^8„  d   QhRS[ RS[ RS[ R,          RS[RS[/# r  r  )r   r„  s   "€r   r   r…  w  s=   ø€ ÷ oñ o¡Cð o±cð oÁcÈDÅjð oÑX\ð oÑaeñ or   c                óò  a.€ \        V4      pV'       d   R RRV/# \        \        V4      4      pV'       d   \        W64      pV'       d   R RRV/# \	        4       pVR,          P                  4       '       g   R RRR/# \        RRV.W†4      w  ršpV	'       g   R RRRV R2R	T;'       g    R
/# \        RRRV.W†4      w  rœpV	'       g
   R RRRV 2/# \        V4      pR
pV'       Edù   TpV'       EdÉ   \        V4      p\        \        P                  P                  VV,          4      4      p VP                  V4      p\        VP                  4      o.R V.3R llpV Uu. uF  pV! V4      '       g   K  VNK  	  ppV'       Eg5   \         P"                  ! RVR7      ;_uu_ 4       p\        V4      R,          p\        RV.W†VR7      w  ršpV	'       d   \        RRRRRV.W†VR7      w  p	ppV	'       g   R RRRV 2/uuR
R
R
4       #  R
R
R
4       XP%                  R4       Uu. uF>  pVP'                  R4      '       g   K  RV9   g   K%  VP%                  R^4      ^,          NK@  	  ppVP%                  R4       Uu. uF%  pRV9   g   K  VP%                  R^4      ^,          NK'  	  ppV'       g
   R RRRV 2/# V'       d   RP)                  V4      pR RRR V R!2R"V/# . p. p. pR
pV'       d’   V'       gŠ   V P+                  Wb4      pVP-                  R 4      '       g   R RRVP-                  RR#4      /# VP-                  R$4      '       d   R
pM1VR%,          pVR&,          pV'       g   R R'R(VR),          R*R+R,VR-. R.VR/. /# V P/                  VR0VR),           R12RR27       \1        V4      p\3        VV4      p VEe   . p!. p"V F…  p#\        RR3V R4V# 2.W†^^€0R57      w  p$ p
V$'       d   V!P5                  V#4       K:  V P7                  \        V4      V#,          4      '       d   VP5                  V#4       Kt  V"P5                  V#4       K‡  	  V" FT  p# \        V4      V#,          p%V%P9                  4       '       g   V%P;                  4       '       d   V%P=                  4        KT  KV  	  V!'       g   R'R7R7pp'p	Mß\        R8VR.V!OW†\D        ^,          V R97      w  p	p'pM»VeŒ   \         P"                  ! R:VR7      ;_uu_ 4       p\        V4      R;,          p(V(PG                  R<P)                  R= V 4       4      4       \        R8VR>V( 2R?.W†\D        ^,          V R@RA/RB7      w  p	p'pR
R
R
4       M,\        R8TRV'       d   TMRC.W†\D        ^,          V R97      w  p	p'pV	'       g   R RRRDV 2R	T;'       g    R
/# \        RERFRGV.W†4      w  p)p*p
V)'       d   T*MRHp+R R'R(VR),          R*V+R,V/p,V'       d   VV,RI&   VeQ   \I        V4      \I        V4      ,          p-V U#u. uF  p#V#V-9  g   K  V#NK  	  up#V,R-&   VV,R.&   VV,R/&   V'       d   VV,RJ&   V PK                  W†\M        V4      4       V,#   \         d    \        T4      p EL9i ; iu upi   + '       g   i     EL�; iu upi u upi   \>         d5   p&\@        PC                  R6T#T&4       TP5                  T#4        R
p&?&EKŒ  R
p&?&ii ; i  + '       g   i     EL_; iu up#i )Kr¦  Fró   rV   r§  rð  rñ  rò  ró  r£   Núls-treeú-rrê   zCould not inspect checkpoint: c                ó0   € V ^8„  d   QhR\         R\        /# )r   Ú	repo_pathr   r¿  )r   s   "r   r   Ú0CheckpointManager._restore.<locals>.__annotate__¥  s   € ÷ ñ ¼Sð ÄTñ r   c                 ó”   <€ \        \        V 4      P                  4      pSR \        V4       V8H  ;'       g    VR \        S4       S8H  # r_   )rã   r   rÓ  r˜   )r  Ú
repo_partsÚrequested_partss   & €r   Ú_scope_intersects_nested_repoÚACheckpointManager._restore.<locals>._scope_intersects_nested_repo¥  sR   ø€ Ü!&¤}°YÓ'?×'EÑ'EÓ!F�Jà'Ð(8¬¨Z«Ð9¸ZÑG÷ Pð PØ%Ð&;¤s¨?Ó';Ð<ÀÑOðr   zrestore-inspect-)ÚprefixÚdirÚindexr­  rç   úls-filesz--stagez--error-unmatchú--z%Could not inspect restore selection: r°   z160000 r±   z2Restore selection matched no files in checkpoint: r¸   zDCheckpoint contains nested git repositories that were not captured (z); rollback was not performedÚnested_repositorieszSafe-restore plan failedr±  r¯  r°  TÚrestored_toºNé   Nr¾  z7nothing to restore (all changed files were user-edited)Ú	directoryÚrestored_filesÚskipped_user_editsÚskipped_oversizez$pre-rollback snapshot (restoring to rº   )Úprunez-eÚ:r  z%Safe restore: could not remove %s: %sr»   Úcheckoutrª  zrestore-select-Úpathspecr   c              3   ó\   "  € T F"  p\         P                  ! V4      R ,           x € K$  	  R# 5i)ó    N)r2   Úfsencode)Ú.0r{  s   & r   Ú	<genexpr>Ú-CheckpointManager._restore.<locals>.<genexpr>5  s    é € Ð.^É~È!¬r¯{ª{¸1«~À×/EÒ/EË~ùs   ‚*,z--pathspec-from-file=z--pathspec-file-nulÚGIT_LITERAL_PATHSPECSrÔ   )rÞ   rÆ   rà   Ú.zRestore failed: rÈ  z--format=%sz-1ÚunknownÚfileÚfailed_deletes)'r-   r&   r5   r;   rP   rX   r
  r´   r   r2   r3   Únormpathr7   r8   rã   rÓ  ÚtempfileÚTemporaryDirectoryr²   r*   r½   r»  rŒ   rÂ  rJ   rb   rd  Ú_exceeds_size_caprx  Ú
is_symlinkr#  ru   r¢   r-  r>  Úwrite_bytesrâ   Ú_pruner«   )/r‰  r0   r$   r/   r  r³  r´  Úpath_errr   r  r  r¶  Útree_outr¶   Úselected_pathsÚblocked_reposÚ	root_pathÚrequested_pathÚrequested_relr  ÚrepoÚscratchÚinspect_indexÚselectedr³   Úpathsr  Úkept_oversizer.  Úrestore_pathsÚplanr\   rÆ   Úcheckout_targetsÚdelete_targetsr·  Úok_in_commitÚtargetr  Ú_stdoutÚ	spec_fileÚok2Ú
reason_outr¾  r  Únot_restoredr  s/   &&&&&                                         @r   r  ÚCheckpointManager._restorew  s£  ø€ Ü(¨Ó5ˆßØ˜u g¨xÐ8Ð8ä”o kÓ2Ó3ˆçÜ*¨9Ó>ˆHßØ! 5¨'°8Ð<Ð<ä“ˆà˜•×&Ñ&×(Ò(Ø˜u gÐ/XÐYÐYäØ˜˜{Ð+¨Uó
‰
ˆˆs÷ Ø˜u g°¸k¸]È+Ð/VØ˜SŸ[˜[ Dð*ð *ô %Ø˜˜d KÐ0°%ó
Ñˆ�c÷ Ø˜u gÐ1OÐPSÈuÐ/UÐVÐVÜ% hÓ/ˆØ.2ˆßˆ<Ø(ˆMßˆyô
 ! ›M�	Ü!%¤b§g¡g×&6Ñ&6°yÀ9Õ7LÓ&MÓ!N�ð4Ø$2×$>Ñ$>¸yÓ$I�Mô #(¨×(;Ñ(;Ó"<�÷ð ñ &2ó!Ù%1˜TÙ4°T×:÷ �D¡\ð ð !÷ %�}Ü!×4Ò4Ð<NÐTY×ZÕZÐ^eÜ(,¨W«¸Õ(?˜Ü%-Ø(¨+Ð6¸Ø'4ô&™
˜˜s÷ Ü08Ø!+¨YÐ8IÈ4ÐQUÐW`Ð aØ %¸=ô1Ñ-˜B ¨#÷  "Ø$-¨u°gÐAfÐgjÐfkÐ?lÐ#m÷ [ÒZð  "÷ [ð '/§n¡n°VÔ&<ó%á&<˜FØ!×,Ñ,¨Y×7ô 1à<@ÀF¹Nô 1˜Ÿ™ T¨1Ó-¨a×0Ð0Ù&<ð "ð %ð '/§n¡n°VÔ&<ó&á&<˜FØ 6™>ô 1˜Ÿ™ T¨1Ó-¨a×0Ð0Ù&<ð #ð &÷
 *ð
 & uØ#Ð'YÐZcÐYdÐ%eð ð ÷
 ØŸ	™	 -Ó0�à˜uØðØ!˜7Ð"?ðAð *¨=ðð ð )+ÐØ#%ˆØ$&ˆØ-1ˆßŸ	Ø×*Ñ*¨7Ó@ˆDØ—8‘8˜I×&Ò&Ø! 5¨'°4·8±8¸GÐE_Ó3`ÐaÐaØ�x‰x˜×'Ò'ð !%‘à $ Y¥�Ø%)¨)¥_Ð"ß$à! 4Ø% {°2¥Ø Ð"[Ø# WØ(¨"Ø,Ð.@Ø*¨Bðð ð 	�
‰
�7ÐBÀ;ÈrÅ?ÐBSÐSTÐUÐ]bˆ
Ôcä  Ó)ˆÜ  ¨Ó1ˆ
àÓ$ð +-ÐØ(*ˆNÛ$�Ü%-Ø ¨+¨°a¸°uÐ'=Ð>Ø¸¸C¸ô&Ñ"�˜a ÷  Ø$×+Ñ+¨CÖ0Ø×+Ñ+¬D°«M¸CÕ,?×@Ò@ð "×(Ñ(¨Ö-à"×)Ñ)¨#Ö.ñ% %ó& &�ð/Ü! '›]¨SÕ0�FØ—~‘~×'Ò'¨6×+<Ñ+<×+>Ò+>ØŸ™žñ ,?ñ &÷ $Ø#'¨¨R˜S�G�˜Sä#+Ø ¨dÐFÐ5EÐFØ¬L¸1Õ,<Ø)ô$Ñ ��G™Sð
 Ò'ô ×,Ò,Ð4EÈ5×QÕQÐU\Ü  ›M¨JÕ6�	Ø×%Ñ% c§h¡hÑ.^É~Ó.^Ó&^Ô_Ü#+Ø Ð0EÀiÀ[Ð.QØ*ð,à¬L¸1Õ,<Ø)Ø6¸Ð<ô$Ñ ��G˜S÷ RÐQô  (Ø˜[¨$¿Y±	ÈCÐPØ¬°qÕ(8Ø%ô ÑˆB�˜÷ Ø˜u gÐ1AÀ#ÀÐ/GØ˜SŸ[˜[ Dð*ð *ô &Ø�M 4¨Ð5°uó
ÑˆˆZ˜÷  #‘¨	ˆð �tØ˜; r�?Ø�fØ˜ð	
ˆ÷ Ø&ˆF�6‰NØÒ$ô ˜}Ó-´°NÓ0CÕCˆLá,ó(Ù,˜°¸<Ñ0G—�™}ñ(ˆFÐ#Ñ$ð ,>ˆFÐ'Ñ(Ø)6ˆFÐ%Ñ&ßØ+9�Ð'Ñ(ð 	�‰�E¤I¨hÓ$7Ô8ØˆøôK "ô 4Ü$(¨£O“Mð4üò!÷ [×ZÐZüò%ùò
&øôl ô /Ü—N‘NØ?ÀÀcôð #×)Ñ)¨#×.Ó.ûð	/ú÷& R×QÐQüòR(s†   Ä-Y Å Y;Å5Y;Æ&AZ Ç4Z È#ZÉZÉ
ZÉ<	ZÊ
ZÑ=ZÒZÓ;A"[ Ø	[4Ø[4ÙY8Ù7Y8Ú Z	Ú[Ú)([Û[Û [1	c                ó&   <€ V ^8„  d   QhRS[ RS[ /# ri   rB   )r   r„  s   "€r   r   r…  h  s   ø€ ÷ Bñ B¡ð B©ñ Br   c                ó6   € \        V P                  V4      4      # )z[Agent-write ledger key: hash of the marker-walked project dir, for writer and reader alike.)rJ   Úget_working_dir_for_path)r‰  r3   s   &&r   rž  ÚCheckpointManager._ledger_keyh  s   € ä˜T×:Ñ:¸4Ó@ÓAÐAr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   r/   r   rB   )r   r„  s   "€r   r   r…  l  s   ø€ ÷ ñ ±#ð ¹#ñ r   c                ó  a€ \        V4      pVP                  4       '       d   TpMVP                  p\        \	        4       4       Uu. uF-  qDP                  R4      '       g   K  \        VR,          4      NK/  	  ppV Uu. uF  qcP                  V4      '       g   K  VNK  	  ppV'       d   \        \        VR R7      4      # 0 Rmp\        P                  ! 4       P                  4       p	V	0V	P                  mp
VoSSP                  8w  da   SV
9  dZ   \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   \        S4      # SP                  oKq  \        V4      # u upi u upi )z?Resolve a file path to its working directory for checkpointing.rF  c                 ó,   € \        V P                  4      # r_   )r˜   rÓ  )Úroots   &r   rp   Ú<CheckpointManager.get_working_dir_for_path.<locals>.<lambda>y  s   € ´C¸¿
¹
´Or   )r�   c              3   óR   <"  € T F  pSV,          P                  4       x € K  	  R # 5ir_   rW   )r'  ræ  rñ   s   & €r   r(  Ú=CheckpointManager.get_working_dir_for_path.<locals>.<genexpr>€  s!   øé € Ð9±¨A�E˜A•I×%Ñ%×'Ð'³ùs   ƒ$'TF>	   ÚGemfileÚMakefileú.hgú.gitúgo.modúpom.xmlú
Cargo.tomlúpackage.jsonúpyproject.toml)r5   rô   rœ   rf  rP   rŒ   r   Úis_relative_tor&   r‡  rÁ  r6   r“   Úany)r‰  r/   r3   Ú	candidaterV  ÚrootsrV  ÚownersÚmarkersrÁ  Úbroadrñ   s   &&         @r   rQ  Ú*CheckpointManager.get_working_dir_for_pathl  s!  ø€ ä˜yÓ)ˆØ�;‰;�=Š=Ø‰IàŸ™ˆIô 4BÄ+Ã-Ô3PÓhÑ3P¨4×T\ÑT\Ð]f×TgÔ&”�d˜9•oÖ&Ñ3PˆÐhÙ#(ÓK¡5˜4×,DÑ,DÀT×,J—$�$¡5ˆÐKßÜ”s˜6Ñ'CÔDÓEÐEòGˆä�yŠy‹{×"Ñ"Ó$ˆØÐ%˜Ÿ™Ð%ˆØˆØ�u—|‘|Ô#¨°UÔ(:ß‹sÔ9±Ó9�s�sŠsÔ9±Ó9×9Ò9Ü˜5“zÐ!Ø—L‘LŠEä�9‹~Ðùò iùÚKs   ÁE8Á$E8Â E=ÂE=r   Tc                ó2   <€ V ^8„  d   QhRS[ RS[ RS[RS[/# )r   r0   r¾  r   r   r¿  )r   r„  s   "€r   r   r…  Š  s/   ø€ ÷ Pñ P¡ð P©cð P¹Tð PÉTñ Pr   c               óº  € \        4       p\        WA4      pV'       d   \        P                  RV4       R# \	        WA4       \        V4      \        8”  d   \        P                  R\        V4       R# \        V4      p\        WF4      p\        V4      pVP                  4       '       dR   \        RRVR,           .WA^€0R7      w  ršpV	'       d   V
'       d   \        RV
.WAV^€0R	7       M/ VP                  4        MVP                  P                  R
R
R7       \        RR.WA\         ^,          VR7      w  rËpV'       g   \        P                  RV4       R# V P"                  ^ 8”  d   V P%                  WAV4       \        RRVR,           .WA^€0R7      w  ršpT	;'       d    \'        V
4      pV'       d:   \        RRRV
.WA^0VR7      w  p pV'       d   \        P                  RV4       R# MJ\        RR.WAVR7      w  pppV'       d/   VP)                  4       '       g   \        P                  RV4       R# \        R.WAVR7      w  pppV'       d	   V'       g   \        P                  RV4       R# \        RRRV.WA4      w  pppV'       d   \+        V4      M. pV'       d]   \        P-                  RVRP/                  V4      4       RP/                  R  VP1                  4        4       4      \3        V4      ,           pR!VR"VR#.pV'       d
   R!VR$V
R"VR#.p\        VWAVR7      w  pppV'       d	   V'       g   \        P                  R%V4       R# R&VV.pV'       d   R&VVV
.p\        VWA4      w  prµV'       g   \        P                  R'V4       R# \        P                  R(WVR),          4       V'       d   V P5                  WAV4       R
#   \         d     ELÂi ; i)*z*Take a snapshot.  Returns True on success.z Checkpoint store init failed: %sFz#Checkpoint skipped: >%d files in %sr  r  r  r  r­  r®  Tr’   r¨  r©  rª  zCheckpoint git-add failed: %sz
diff-indexr¬  ú--quiet)rß   rÆ   z$Checkpoint skipped: no changes in %sr  rç   z$Checkpoint skipped: empty tree in %sz
write-treez Checkpoint write-tree failed: %sr	  r
  rê   z=Checkpoint of %s does not capture nested git repositories: %sr¸   rå   c              3   óp   "  € T F,  qP                  4       '       g   K  VP                  4       x € K.  	  R # 5ir_   )r)   )r'  rÒ  s   & r   r(  Ú*CheckpointManager._take.<locals>.<genexpr>ù  s$   é € ð Ù)< Ç
Á
Ç”�—
‘
—�Ó)<ùs   ‚6ž6zcommit-treez-mz--no-gpg-signz-pz!Checkpoint commit-tree failed: %sz
update-refz Checkpoint update-ref failed: %szCheckpoint taken in %s: %s (%s)r  )rP   rD  r¢   r£   r]  ru  rr  rJ   rb   r«   rX   r
  r#  ru   rœ   r�   r>  rƒ  Ú_drop_oversize_from_indexrT   r)   r´   r/  r½   r  rÀ   r5  )r‰  r0   r¾  r   r   r¶  r\   rÆ   r  Úok_refÚ
ref_commitr  r  Úhas_refrö  Úok_lsÚls_outÚok_treeÚtree_shar7  r¶   Úcommit_argsÚ	ok_commitÚnew_shaÚupdate_argsÚ	ok_updates   &&&$                      r   rÂ  ÚCheckpointManager._takeŠ  s®  € ä“ˆä˜%Ó-ˆßÜ�L‰LÐ;¸SÔAÙä�uÔ*ô ˜;Ó'¬*Ô4Ü�L‰LÐ>Ä
ÈKÔXÙä  Ó-ˆÜ  Ó1ˆ
Ü˜Ó!ˆð
 ×Ñ×Òä$,Ø˜j¨#°Õ*;Ð<ØØ%( Eô%Ñ!ˆF ÷
 Ÿ*ÜØ  *Ð-ØØ)Ø),¨ö	ðØ×%Ñ%Õ'ð
 ×Ñ×#Ñ#¨D¸4Ð#Ô@ô Ø�DˆM˜5Ü  1Õ$°ô
‰
ˆˆs÷ Ü�L‰LÐ8¸#Ô>Ùà× Ñ  1Ô$Ø×*Ñ*¨5¸zÔJô
 !)Ø˜* c¨KÕ&7Ð8ØØ!$ ô!
Ñˆ˜Að
 ×-Ð-œT *Ó-ˆçÜ$Ø˜z¨9°jÐAØØ%& CØ%ô	‰MˆG�Q˜÷ Ü—‘ÐCÀ[ÔQÙð ô
  (Ø˜ZÐ(ØØ%ô ÑˆE�6˜1÷
 ˜VŸ\™\Ÿ^š^Ü—‘ÐCÀ[ÔQÙô "*ØˆN˜EØ!ô"
Ñˆ�˜3÷ ŸhÜ�L‰LÐ;¸SÔAÙô & y°$¸¸hÐ&GÈÓ\Ñˆˆx˜ß38”~ hÔ/¸bˆßÜ�K‰KÐWØ# T§Y¡Y¨|Ó%<ô>ð
 —X‘Xñ Ø)/×):Ñ):Ô)<óó ä  Ó.õ/ˆFð
 % h°°f¸oÐNˆßØ(¨(°D¸*ÀdÈFÐTcÐdˆKÜ"*Ø˜Ø!ô#
Ñˆ	�7˜C÷ §Ü�L‰LÐ<¸cÔBÙð $ S¨'Ð2ˆßØ'¨¨g°zÐBˆKÜ$Ø˜ó
Ñˆ	�1÷ Ü�L‰LÐ;¸SÔAÙä�‰Ð6¸ÈWÐUWÍ[ÔY÷ Ø�K‰K˜¨CÔ0áøôQ ô Úðús   Ã)O ÏOÏOc                ó&   <€ V ^8„  d   QhRS[ RS[/# ri   rS   )r   r„  s   "€r   r   r…    s   ø€ ÷ ñ ¡dð ©tñ r   c                ó¨   € V P                   R,          R,          pV^ 8:  d   R#  VP                  4       P                  V8„  #   \         d     R# i ; i)a5  Whether *path* is larger than ``max_file_size_mb``.

The same test :meth:`_drop_oversize_from_index` applies when building a
checkpoint, so "excluded from the checkpoint" and "refused deletion at
restore" agree on one definition. A cap of 0 disables it, and an
unstattable path is not claimed to be oversize.
é   F)rƒ  rJ  ry  ru   )r‰  r3   Úcaps   && r   r2  Ú#CheckpointManager._exceeds_size_cap  sQ   € ð ×#Ñ# dÕ*¨TÕ1ˆØ�!Œ8Ùð	Ø—9‘9“;×&Ñ&¨Ñ,Ð,øÜô 	Úð	ús   ¥A ÁAÁAc                ó0   <€ V ^8„  d   QhRS[ RS[RS[ RR/# )r   r   r0   rÆ   r   Nr]   )r   r„  s   "€r   r   r…  ,  s-   ø€ ÷ )ñ )Ùð)Ù(+ð)Ù9=ð)à	ñ)r   c           	     ó<  € V P                   ^ 8:  d   R# \        . ROWVR7      w  rEpV'       d	   V'       g   R# VP                  R4       Uu. uF  qw'       g   K  VNK  	  pp\        V4      p	V U
u. uF#  q P	                  Wš,          4      '       g   K!  V
NK%  	  pp
V'       g   R# \
        P                  R\        V4      V P                   4       ^Èp\        ^ \        V4      V4       F&  pW½WÜ,            p\        . ROV,           WV^€0R7       K(  	  R# u upi u up
i )zÊRemove any staged file larger than ``max_file_size_mb`` from the index.

Lets the agent keep snapshotting source code while refusing to
swallow generated assets (datasets, model weights, logs, videos).
Nrç   r°   z<Checkpoint: dropping %d oversize file(s) (>%d MB) from indexr®  )r  r¬  rê   )Úrmr¬  rm  r  )	rƒ  r
  r²   r5   r2  r¢   r£   r˜   Úrange)r‰  r   r0   rÆ   r  rü   r  r{  rA  r9   r·  ÚoversizeÚBATCHÚirw   s   &&&&           r   rp  Ú+CheckpointManager._drop_oversize_from_index,  s  € ð × Ñ  AÔ%ÙÜ Ú*Ø¨:ô
‰ˆ�A÷ ŸÙà"ŸL™L¨Ô0Ó6Ñ0�q³A—�Ñ0ˆÐ6Ü% kÓ2ˆñ !ó
Ù �C×$:Ñ$:¸;Õ;L×$M�CˆC™5ð 	ð 
÷ ÙÜ�‰ØJÜ�‹M˜4×0Ñ0ô	
ð ˆÜ�qœ#˜h›-¨Ö/ˆAØ˜q�yÐ)ˆEÜÚ3°eÕ;Ø¨zØ%( E÷ó 0ùò% 7ùò
s   Á	DÁDÁ1DÂDc                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r   r   r0   r  r   Nr]   )r   r„  s   "€r   r   r…  W  s/   ø€ ÷ Bñ B™Dð B©sð B¹ð BÀñ Br   c                óŠ  € ^ RI HpHp V! \        W\        \
        \        4      p VP                  W0P                  4       VP                  V P                  R,          R,          4      '       d#   \        P                  RV P                  4       R# R#   T\        3 d"   p\        P                  RT4        Rp?R# Rp?ii ; i)uª   Checkpoint-take path: snapshot-count budget plus one size round, gc deferred to the
periodic prune â€” a repack here held the tool call for the whole gc on a large store.)ÚPrunerrë  r€  uq   Checkpoint store exceeded %d MB â€” dropped the oldest snapshot per project; space is reclaimed by the next prunezCheckpoint pruning stopped: %sN)r�  r�  rë  r
  r>  r|  rª   Útrimr�  Údrop_one_roundr‚  r¢   r/  ru   r-  )r‰  r   r0   r  r�  rë  Úprunerr  s   &&&&    r   r5  ÚCheckpointManager._pruneW  s¡   € ÷ 	@áœ %´lÄOÔUaÓbˆð	BØ�K‰K˜×/Ñ/Ô0Ø×$Ñ$ T×%;Ñ%;¸dÕ%BÀTÕ%I×JÒJÜ—‘ð CØDH×DZÑDZö\ñ Køð œGÐ$ô 	BÜ�N‰NÐ;¸S×AÒAûð	Bús   ¦A*B ÂCÂ!B=Â=C)rˆ  r€  rƒ  r�  r‚  )Fé   iô  é
   )Údefault)Úauto)NF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rŠ  r�  r—  r   r»  rÄ  rÖ  rÞ  ÚstaticmethodrÐ  r«  rì  rþ  r¯  r  rž  rQ  rÂ  r2  rp  r5  Ú__static_attributes__Ú__classdictcell__)r„  s   @r   r~  r~  þ  s÷   ø‡ € ñ÷*2ò 2÷"(ð (÷
ò 
÷$Qð Q÷8?Ið ?I÷Bò ÷<'ð '÷Rð ð. ÷
1ó ð
1÷9ð 9÷/
ð /
÷bð ÷@9ò 9÷2oð o÷bBð B÷ð ð<PÀD÷ Pò P÷dð ÷ )ð )÷VBö Br   r~  c                óR   € V ^8„  d   QhR\         \        ,          R\        R\        /# )r   r   r  r   )r®   r{   r&   )r   s   "r   r   r   f  s%   € ÷ #ñ #¬¬T­
ð #¼sð #Äsñ #r   c                óÔ  € V '       g   RV 2# RV R2.p\        V ^4       EF€  w  r4VR,          pRV9   dr   VP                  R4      ^,          P                  R4      ^ ,          P                  R4      ^ ,          R,          pVR,          P                  R4      ^ ,          pV R	V 2pVP                  R
^ 4      pVP                  R^ 4      pVP                  R^ 4      p	V'       d   RT RV^8w  d   RMR RV RV	 R2	p
MRp
VP                  RR4      pV'       dZ   VR8X  dS   \        V4      P                  ;'       g    TpVP                  RV RVR,           RV RV RVR,           V
 24       EKS  VP                  RV RVR,           RV RVR,           V
 2	4       EKƒ  	  VP                  R4       VP                  R4       VP                  R4       RP                  V4      # ) z+Format checkpoint list for display to user.zNo checkpoints found for u   ðŸ“¸ Checkpoints for z:
rÌ  ÚTÚ+r(   :Né   Nrå   rÍ  rÎ  rÏ  z  (z fileÚsr»   z, +z/-rº   rF  zall directoriesz  z. rË  z  [z]  r¾  z4
  /rollback <N>             restore to checkpoint Nz>  /rollback diff <N>        preview changes since checkpoint NzC  /rollback <N> <file>      restore a single file from checkpoint Nr:  )Ú	enumerater²   rŒ   r   r)  rd  r½   )r   r  Úlinesr‰  Úcpr‹   ÚdateÚfilesÚinsÚdelerJ  rF  Úworkdir_shorts   &&           r   Úformat_checkpoint_listr¬  f  så  € çØ*¨9¨+Ð6Ð6à$ Y K¨sÐ3Ð4€EÜ˜;¨×*‰ˆØ��_ˆØ�"Œ9Ø—‘˜#“˜qÕ!×'Ñ'¨Ó,¨QÕ/×5Ñ5°cÓ:¸1Õ=¸bÕAˆBØ�k•?×(Ñ(¨Ó-¨aÕ0ˆDØ�6˜˜2˜$�ˆBà—‘�¨Ó*ˆØ�f‰f�\ 1Ó%ˆØ�v‰v�k 1Ó%ˆßØ˜˜˜u¨E°Q¬J¡S¸BÐ$?¸sÀ3À%ÀrÈ$ÈÈqÐQ‰DàˆDð —&‘&˜ BÓ'ˆß�yÐ$5Ô5Ü  ›M×.Ñ.×9Ð9°'ˆMØ�L‰LØ�Q�C�r˜"˜\Õ*Ð+¨2¨b¨T°°]°OÀ3ÀrÈ(Å|ÀnÐUYÐTZÐ[÷ð �L‰L˜2˜a˜S  2 lÕ#3Ð"4°B°r°d¸"¸RÀ½\¸NÈ4È&ÐQ×Rñ1 +ð4 
‡L�LÐHÔIØ	‡L�LÐQÔRØ	‡L�LÐVÔWØ�9‰9�UÓÐr   c                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r   r>  )Ú__conditional_annotations__rá   )r   s   "r   r   r      s!   € ÷ 0ñ 0÷@ OÒ NŒcÑ NòA0r   r_   )Tr®  rš  rE   r�   Úloggingr2   rã  rõ   r÷   r0  r+  Úpathlibr   r   Úhermes_constantsr   Úhermes_cli._subprocess_compatr   r   Úhermes_cli.gitlockr   Útypingr   r	   r
   r   r   Úutilsr   r   Ú	getLoggerr–  r¢   r   r   r   rO   rª   r`   rÃ   rf   r*  r'  r™   r?  r‡  Úminr>  rr  Úcompiler+   r-   r;   r5   rJ   rP   rY   rb   rg   rx   r†   r¦   r«   r´   rÀ   rÄ   rÛ   r
  r  r  r  r$  r5  rD  rN  rY  r]  rf  rm  ru  r|  r~  r¬  r   )r®  s   @r   Ú<module>r¹     sÅ  øðö0ód Û Û Û 	Û 	Û Û Û Û ß 'Ý ,ß NÝ 4ß 3Õ 3ç *à	×	Ò	˜8Ó	$€ñ "Ó# mÕ3€Ø,Ð õsð €Ø€ØÐ ØÐ ØÐ Ø€Ø"Ð ð Ð ð=àð=ð ð=ð ð	=ð
 ð=ð ð=ð ð=ð ð=ð ð=ð ð=ð ð=ð ð=ð ð=ð ð=ð  ð!=ð" ð#=ð$ ð%=ð( ð)=ð* ð+=ð, ð-=ð0 ð1=ð2 ð3=ð4 ð5=ð8 ð9=ð< ð==ð> ð?=ð@ ðA=ðB 
ðC=ðD 
ðE=ðF ðG=ðH ðI=ðJ ðK=ðL ðM=ðP ðQ=ðR ðS=ðT ðU=ðV ðW=ðX ðY=ðZ ð[=ð\ ð]=ð^ ð_=ð` ða=ðb ðc=ðd ðe=ðh ði=ðj ðk=ðl ðm=ðn ðo=ðr ðs=ðt ðu=ðx ðy=Ð ñ@ ˜™C ¡GÐ,GÈÓ$LÓMÓN€Ó Nð €
ð —*’*Ð3Ó4€õõ õ,3õ
>÷Aõ
%õ/õ9õ	õõZõ&(õõ>õ:÷&ðZ  Ø.2Ø!%Ø*.÷J#÷Zõeõ
6õ
õ-õ`GõTõBPõ@Qõ:õ&#õL
õ÷&eBñ eB÷P#r   