§
    øžyj*  ã                  ó¢   — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d„ZdS )!a   `hermes checkpoints` CLI subcommand.

Gives users direct visibility and control over the filesystem checkpoint
store at ``~/.hermes/checkpoints/``.  Actions:

    hermes checkpoints               # same as `status`
    hermes checkpoints status        # total size, project count, breakdown
    hermes checkpoints list          # per-project checkpoint counts + workdir
    hermes checkpoints prune [opts]  # force a sweep (ignores the 24h marker)
    hermes checkpoints clear [-f]    # nuke the entire base (asks first)
    hermes checkpoints clear-legacy  # delete just the legacy-* archives

Examples::

    hermes checkpoints
    hermes checkpoints prune --retention-days 3 --max-size-mb 200
    hermes checkpoints clear -f

None of these require the agent to be running.  Safe to call any time.
é    )ÚannotationsN)Údatetime)ÚPath)ÚAnyÚOptional)Úformat_bytesÚtsr   ÚreturnÚstrc                óœ   — 	 t          j        t          | ¦  «        ¦  «                             d¦  «        S # t          t
          f$ r Y dS w xY w)Nz%Y-%m-%d %H:%Mõ   â€”)r   ÚfromtimestampÚfloatÚstrftimeÚ	TypeErrorÚ
ValueError)r	   s    ú</home/ragecks/.hermes/hermes-agent/hermes_cli/checkpoints.pyÚ_fmt_tsr   !   sT   € ðÝÔ%¥e¨B¡i¤iÑ0Ô0×9Ò9Ð:JÑKÔKÐKøÝ•zÐ"ð ð ð Øˆuˆuðøøøs   ‚36 ¶AÁ
Ac                óR  — 	 t          j         ¦   «         t          | ¦  «        z
  }n# t          t          f$ r Y dS w xY w|dk     rdS |dk     rt	          |¦  «        › d�S |dk     rt	          |dz  ¦  «        › d�S |dk     rt	          |dz  ¦  «        › d	�S t	          |dz  ¦  «        › d
�S )Nr   r   Únowé<   zs agoi  zm agoi€Q zh agozd ago)Útimer   r   r   Úint)r	   Úages     r   Ú_fmt_ager   (   sÑ   € ðÝŒi‰kŒk�E "™IœIÑ%ˆˆøÝ•zÐ"ð ð ð Øˆuˆuðøøøà
ˆQ‚w€wØˆuØ
ˆR‚x€xÝ�c‘(”(Ð!Ð!Ð!Ð!Ø
ˆT‚z€zÝ�c˜B‘h‘-”-Ð&Ð&Ð&Ð&Ø
ˆU‚{€{Ý�c˜D‘j‘/”/Ð(Ð(Ð(Ð(Ý�#˜‘+ÑÔÐ%Ð%Ð%Ð%s   ‚#& ¦;º;Úargsúargparse.Namespacer   c                óê  — ddl m}  |¦   «         }|d         }t          d|› �¦  «         t          dt          |d         ¦  «        › �¦  «         t          dt          |d         ¦  «        › �¦  «         t          d	t          |d
         ¦  «        › �¦  «         t          d|d         › �¦  «         t	          |d         d„ d¬¦  «        }|rýt          ¦   «          t          ddd›ddd›ddd›d�¦  «         |d t          | d¦  «        r| j        r| j        nd…         D ]ª}|                     d¦  «        pd}t          |¦  «        dk    rd|dd …         z   }|                     d ¦  «        }|rd!nd"}|                     d#d¦  «        }	t          |                     d$¦  «        ¦  «        }
t          d|d›d|	d›d|
d›d|› �¦  «         Œ«|                     d%g ¦  «        }|r‘t          ¦   «          t          d&t          |¦  «        › d'�¦  «         t	          |d(„ d¬¦  «        D ]2}t          d|d)         d*›dt          |d+         ¦  «        d,›�¦  «         Œ3t          ¦   «          t          d-¦  «         dS ).Nr   )Ústore_statusÚbasezCheckpoint base: zTotal size:      Útotal_size_bytesz  store/         Ústore_size_bytesz  legacy-*       Úlegacy_size_byteszProjects:        Úproject_countÚprojectsc                ó0   — |                       d¦  «        pdS )NÚ
last_touchr   ©Úget)Úps    r   ú<lambda>zcmd_status.<locals>.<lambda>E   s   € �q—u’u˜\Ñ*Ô*Ð/¨a€ ó    T)ÚkeyÚreverseú  ÚWORKDIRz<60ÚCOMMITSz>7z
LAST TOUCHz>12z  STATEÚlimité   Úworkdirú	(unknown)r   u   â€¦iÅÿÿÿÚexistsÚliveÚorphanÚcommitsr'   Úlegacy_archiveszLegacy archives (z):c                ó.   — |                       dd¦  «        S )NÚmtimer   r(   )Úas    r   r+   zcmd_status.<locals>.<lambda>Y   s   € °·²°wÀÑ1BÔ1B€ r,   Únameú<40Ú
size_bytesú>10z+Clear with: hermes checkpoints clear-legacy)
Útools.checkpoint_managerr   ÚprintÚ
_fmt_bytesÚsortedÚhasattrr2   r)   Úlenr   )r   r   Úinfor    r%   r*   Úwdr6   Ústater9   ÚlastÚlegacyÚarchs                r   Ú
cmd_statusrN   8   sé  € Ø5Ð5Ð5Ð5Ð5Ð5àˆ<‰>Œ>€DØ�Œ<€DÝ	Ð
$˜dÐ
$Ð
$Ñ%Ô%Ð%Ý	Ð
D�j¨Ð.@Ô)AÑBÔBÐ
DÐ
DÑEÔEÐEÝ	Ð
D�j¨Ð.@Ô)AÑBÔBÐ
DÐ
DÑEÔEÐEÝ	Ð
E�j¨Ð.AÔ)BÑCÔCÐ
EÐ
EÑFÔFÐFÝ	Ð
5˜d ?Ô3Ð
5Ð
5Ñ6Ô6Ð6åØˆZÔØ0Ð0Øðñ ô €Hð
 ð DÝ‰ŒˆÝÐM�9ÐMÐMÐM IÐMÐMÐM°LÐMÐMÐMÐMÑNÔNÐNØÐW­'°$¸Ñ*@Ô*@ÐWÀTÄZÐW˜DœJ˜JÐUWÐWÔXð 	Dð 	DˆAØ—’�yÑ!Ô!Ð0 [ˆBÝ�2‰wŒw˜Š|ˆ|Ø˜R   œXÑ%�Ø—U’U˜8‘_”_ˆFØ$Ð2�F�F¨(ˆEØ—e’e˜I qÑ)Ô)ˆGÝ˜AŸEšE ,Ñ/Ô/Ñ0Ô0ˆDÝÐB�rÐBÐBÐB ÐBÐBÐB¨tÐBÐBÐB¸5ÐBÐBÑCÔCÐCÐCà�XŠXÐ'¨Ñ,Ô,€FØð =Ý‰ŒˆÝÐ1¥# f¡+¤+Ð1Ð1Ð1Ñ2Ô2Ð2Ý˜6Ð'BÐ'BÈDÐQÑQÔQð 	Qð 	QˆDÝÐO�t˜F”|ÐOÐOÐO­:°d¸<Ô6HÑ+IÔ+IÐOÐOÐOÑPÔPÐPÐPÝ‰ŒˆÝÐ;Ñ<Ô<Ð<Øˆ1r,   c                ó    — t          | ¦  «        S )N)rN   )r   s    r   Úcmd_listrP   `   s   € å�dÑÔÐr,   c           
     ó:  — ddl m}m} | j        }| j        }| j         }d }|�r�| j        �sˆ |¦   «         }d„ |                     dg ¦  «        D ¦   «         }d„ |                     dg ¦  «        D ¦   «         }	|s|	�rt          dt          |¦  «        t          |	¦  «        z   › d�¦  «         t          ¦   «          |D ]C}
|
                     d	¦  «        pd
}t          d|› d|
                     dd¦  «        › d�¦  «         ŒD|	D ],}
|
                     d	¦  «        pd
}t          d|› d�¦  «         Œ-t          ¦   «          t          d¦  «         t          d¦  «         t          d¦  «         t          d¦  «        st          d¦  «         dS d„ |D ¦   «         }|                     d„ |	D ¦   «         ¦  «         t          d¦  «         t          d|› �¦  «         t          d|› �¦  «         t          d|› �¦  «         t          ¦   «           |||||¬¦  «        }t          d|d         › �¦  «         t          d|d          › �¦  «         t          d!|d"         › �¦  «         t          d#|d$         › �¦  «         t          d%t          |d&         ¦  «        › �¦  «         dS )'Nr   )Úprune_checkpointsr   c                ó<   — g | ]}|                      d ¦  «        °|‘ŒS ©r6   r(   ©Ú.0r*   s     r   ú
<listcomp>zcmd_prune.<locals>.<listcomp>t   s8   € ð 
ð 
ð 
ØØ—5’5˜‘?”?ð
Øð
ð 
ð 
r,   r%   c                ó<   — g | ]}|                      d ¦  «        °|‘ŒS rT   r(   rU   s     r   rW   zcmd_prune.<locals>.<listcomp>x   s8   € ð 
ð 
ð 
ØØ—5’5˜‘?”?ð
Øð
ð 
ð 
r,   Úpre_v2_projectszThis will permanently delete zG orphan checkpoint project(s) whose workdir is not currently reachable:r4   r5   r/   z  (r9   z commit(s))z  (pre-v2 shadow repo)z=A workdir can be unreachable because the project was deleted,z<or because an external volume / network share / VPN is down.z0Pass --keep-orphans to prune stale entries only.zDelete these orphan projects?úAborted.é   c                ó   — h | ]
}|d          ’ŒS )Úhash© rU   s     r   ú	<setcomp>zcmd_prune.<locals>.<setcomp>”   s   € Ð7Ð7Ð7¨!˜A˜fœIÐ7Ð7Ð7r,   c              3  ó&   K  — | ]}|d          V — ŒdS )ÚpathNr^   rU   s     r   ú	<genexpr>zcmd_prune.<locals>.<genexpr>•   s&   è è € ÐBÐB¨a  &¤	ÐBÐBÐBÐBÐBÐBr,   u   Pruning checkpoint storeâ€¦z  retention_days:    z  delete_orphans:    z  max_total_size_mb: )Úretention_daysÚdelete_orphansÚmax_total_size_mbÚorphan_allowlistzScanned:         ÚscannedzDeleted orphan:  Údeleted_orphanzDeleted stale:   Údeleted_stalezErrors:          ÚerrorszBytes reclaimed: Úbytes_freed)rB   rR   r   rc   Úmax_size_mbÚkeep_orphansÚforcer)   rC   rG   Ú_confirmÚupdaterD   )r   rR   r   rc   rl   rd   rf   rH   ÚorphansÚpre_v2_orphansr*   rI   Úresults                r   Ú	cmd_prunert   e   s[  € ØHÐHÐHÐHÐHÐHÐHÐHàÔ(€NØÔ"€KØÔ*Ð*€Nð '+Ðàñ #C˜dœjñ #CØˆ|‰~Œ~ˆð
ð 
Ø—x’x 
¨BÑ/Ô/ð
ñ 
ô 
ˆð
ð 
Ø—x’xÐ 1°2Ñ6Ô6ð
ñ 
ô 
ˆð ð 	�nñ 	Ýð [µ#°g±,´,ÅÀ^ÑATÔATÑ2Tð [ð [ð [ñ \ô \ð \å‰GŒGˆGØð Dð D�Ø—U’U˜9Ñ%Ô%Ð4¨�ÝÐB˜2ÐBÐB !§%¢%¨	°1Ñ"5Ô"5ÐBÐBÐBÑCÔCÐCÐCØ#ð 7ð 7�Ø—U’U˜9Ñ%Ô%Ð4¨�ÝÐ5˜2Ð5Ð5Ð5Ñ6Ô6Ð6Ð6Ý‰GŒGˆGÝÐQÑRÔRÐRÝÐPÑQÔQÐQÝÐDÑEÔEÐEÝÐ;Ñ<Ô<ð Ý�jÑ!Ô!Ð!Ø�qð 8Ð7¨wÐ7Ñ7Ô7ÐØ×ÒÐBÐB°>ÐBÑBÔBÑBÔBÐBå	Ð
'Ñ(Ô(Ð(Ý	Ð
2 .Ð
2Ð
2Ñ3Ô3Ð3Ý	Ð
2 .Ð
2Ð
2Ñ3Ô3Ð3Ý	Ð
/ +Ð
/Ð
/Ñ0Ô0Ð0Ý	�G„G€GàÐØ%Ø%Ø%Ø)ð	ñ ô €Fõ 
Ð
1˜f YÔ/Ð
1Ð
1Ñ2Ô2Ð2Ý	Ð
8˜fÐ%5Ô6Ð
8Ð
8Ñ9Ô9Ð9Ý	Ð
7˜f _Ô5Ð
7Ð
7Ñ8Ô8Ð8Ý	Ð
0˜f XÔ.Ð
0Ð
0Ñ1Ô1Ð1Ý	Ð
A�j¨°Ô)>Ñ?Ô?Ð
AÐ
AÑBÔBÐBØˆ1r,   ÚpromptÚboolc                óÆ   — 	 t          | › d�¦  «                             ¦   «                              ¦   «         }n&# t          t          f$ r t          ¦   «          Y dS w xY w|dv S )Nz [y/N]: F>   ÚyÚyes)ÚinputÚstripÚlowerÚEOFErrorÚKeyboardInterruptrC   )ru   Úresps     r   ro   ro   «   su   € ðÝ˜Ð(Ð(Ð(Ñ)Ô)×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9ˆˆøÝÕ'Ð(ð ð ð Ý‰ŒˆØˆuˆuðøøøð �<ÐÐs   ‚69 ¹AÁAc           	     óÔ  — ddl m}m}m}  |¦   «         }|d         dk    r2t	          |¦  «                             ¦   «         st          d¦  «         dS t          d|d         › �¦  «         t          dt          |d         ¦  «        › �¦  «         t          d|d	         › �¦  «         t          d
t          | 	                    dg ¦  «        ¦  «        › �¦  «         t          ¦   «          t          d¦  «         | j
        s t          d¦  «        st          d¦  «         dS  |¦   «         }|d         r(t          dt          |d         ¦  «        › d�¦  «         dS t          d¦  «         dS )Nr   )ÚCHECKPOINT_BASEÚ	clear_allr   r!   u4   Nothing to clear â€” checkpoint base does not exist.z/This will delete the ENTIRE checkpoint base at r    z  size:        z  projects:    r$   z  legacy dirs: r:   z?All /rollback history for every working directory will be lost.zProceed?rZ   r[   ÚdeletedzCleared. Reclaimed rk   ú.z+Could not clear checkpoint base (see logs).é   )rB   r�   r‚   r   r   r6   rC   rD   rG   r)   rn   ro   )r   r�   r‚   r   rH   rs   s         r   Ú	cmd_clearr†   ´   s�  € ØQÐQÐQÐQÐQÐQÐQÐQÐQÐQàˆ<‰>Œ>€DØÐÔ 1Ò$Ð$­T°/Ñ-BÔ-B×-IÒ-IÑ-KÔ-KÐ$ÝÐDÑEÔEÐEØˆqå	Ð
J¸DÀ¼LÐ
JÐ
JÑKÔKÐKÝ	Ð
B�J tÐ,>Ô'?Ñ@Ô@Ð
BÐ
BÑCÔCÐCÝ	Ð
3˜D Ô1Ð
3Ð
3Ñ4Ô4Ð4Ý	Ð
B�C §¢Ð):¸BÑ ?Ô ?Ñ@Ô@Ð
BÐ
BÑCÔCÐCÝ	�G„G€GÝ	Ð
KÑLÔLÐLØŒ:ð �h zÑ2Ô2ð ÝˆjÑÔÐØˆqàˆY‰[Œ[€FØˆiÔð ÝÐH¥J¨v°mÔ/DÑ$EÔ$EÐHÐHÐHÑIÔIÐIØˆqÝ	Ð
7Ñ8Ô8Ð8Øˆ1r,   c           
     ó®  — ddl m}m}  |¦   «         }|                     dg ¦  «        }|st	          d¦  «         dS t          d„ |D ¦   «         ¦  «        }t	          dt          |¦  «        › dt          |¦  «        › d�¦  «         |D ]2}t	          d	|d
         d›d	t          |d         ¦  «        d›�¦  «         Œ3t	          ¦   «          t	          d¦  «         t	          d¦  «         t	          d¦  «         | j        s t          d¦  «        st	          d¦  «         dS  |¦   «         }t	          d|d         › dt          |d         ¦  «        › d�¦  «         dS )Nr   )Úclear_legacyr   r:   zNo legacy archives to clear.c              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS )r@   r   Nr(   )rV   r=   s     r   rb   z#cmd_clear_legacy.<locals>.<genexpr>×   s0   è è € Ð7Ð7¨1�—’�l AÑ&Ô&Ð7Ð7Ð7Ð7Ð7Ð7r,   zFound z legacy archive(s), total ú:r/   r>   r?   r@   rA   zALegacy archives hold pre-v2 per-project shadow repos, moved asidez?during the single-store migration. Delete when you're confidentz)you don't need the old /rollback history.zDelete all legacy archives?rZ   r[   zDeleted rƒ   z archive(s), reclaimed rk   r„   )
rB   rˆ   r   r)   rC   ÚsumrG   rD   rn   ro   )r   rˆ   r   rH   rL   ÚtotalrM   rs   s           r   Úcmd_clear_legacyr�   Î   s“  € ØCÐCÐCÐCÐCÐCÐCÐCàˆ<‰>Œ>€DØ�XŠXÐ'¨Ñ,Ô,€FØð ÝÐ,Ñ-Ô-Ð-ØˆqåÐ7Ð7°Ð7Ñ7Ô7Ñ7Ô7€EÝ	Ð
N•3�v‘;”;Ð
NÐ
N½*ÀUÑ:KÔ:KÐ
NÐ
NÐ
NÑOÔOÐOØð Mð MˆÝÐK�4˜”<ÐKÐKÐK¥z°$°|Ô2DÑ'EÔ'EÐKÐKÐKÑLÔLÐLÐLÝ	�G„G€GÝ	Ð
MÑNÔNÐNÝ	Ð
KÑLÔLÐLÝ	Ð
5Ñ6Ô6Ð6ØŒ:ð �hÐ'DÑEÔEð ÝˆjÑÔÐØˆqàˆ\‰^Œ^€FÝ	Ð
c�V˜IÔ&Ð
cÐ
c½zÈ&ÐQ^ÔJ_Ñ?`Ô?`Ð
cÐ
cÐ
cÑdÔdÐdØˆ1r,   Úparserúargparse.ArgumentParserÚNonec                ó  — |                       t          ¬¦  «         |                      dd¬¦  «        }|                     dd¬¦  «        }|                     dt
          d	d
¬¦  «         |                      t          ¬¦  «         |                     dd¬¦  «        }|                     dt
          d	¬¦  «         |                      t          ¬¦  «         |                     dd¬¦  «        }|                     dt
          dd¬¦  «         |                     dt
          dd¬¦  «         |                     ddd¬¦  «         |                     dddd¬¦  «         |                      t          ¬¦  «         |                     dd¬¦  «        }|                     dddd ¬¦  «         |                      t          ¬¦  «         |                     d!d"¬¦  «        }|                     dddd ¬¦  «         |                      t          ¬¦  «         d#S )$z8Wire subcommands onto the ``hermes checkpoints`` parser.)ÚfuncÚcheckpoints_commandÚCOMMAND)ÚdestÚmetavarÚstatusz9Show total size, project count, and per-project breakdown)Úhelpz--limitr3   z!Max projects to list (default 20))ÚtypeÚdefaultr˜   ÚlistzAlias for 'status')r™   rš   Úprunez0Delete orphan/stale checkpoints and GC the storez--retention-daysé   z?Drop projects whose last_touch is older than N days (default 7)z--max-size-mbiô  z`After orphan/stale prune, drop oldest commits per project until total size <= this (default 500)z--keep-orphansÚ
store_truez5Skip deleting projects whose workdir no longer exists)Úactionr˜   z-fz--forcez,Skip the orphan-deletion confirmation promptÚclearz9Delete the entire checkpoint base (all /rollback history)zSkip confirmation promptzclear-legacyz7Delete only the legacy-<ts>/ archives from v1 migrationN)
Úset_defaultsrN   Úadd_subparsersÚ
add_parserÚadd_argumentr   rP   rt   r†   r�   )rŽ   ÚsubsÚp_statusÚp_listÚp_pruneÚp_clearÚp_legacys          r   Úregister_clir«   è   s…  € à
×Ò�ZÐÑ(Ô(Ð(Ø× Ò Ð&;ÀYÐ ÑOÔO€Dà�ŠØØHð ñ ô €Hð ×Ò˜)­#°rØBð ñ Dô Dð Dà×Ò�zÐÑ*Ô*Ð*à�_Š_ØØ!ð ñ ô €Fð ×Ò˜	­°RÐÑ8Ô8Ð8Ø
×Ò�XÐÑ&Ô&Ð&à�oŠoØØ?ð ñ ô €Gð ×ÒÐ+µ#¸qØ_ð ñ aô að aà×Ò˜­s¸CðSð ñ Tô Tð Tð ×ÒÐ)°,ØUð ñ Wô Wð Wà×Ò˜˜y°ØLð ñ Nô Nð Nà×Ò�iÐÑ(Ô(Ð(à�oŠoØØHð ñ ô €Gð ×Ò˜˜y°Ø8ð ñ :ô :ð :à×Ò�iÐÑ(Ô(Ð(à�ŠØØFð ñ ô €Hð ×Ò˜$ 	°,Ø9ð ñ ;ô ;ð ;à×ÒÕ/ÐÑ0Ô0Ð0Ð0Ð0r,   )r	   r   r
   r   )r   r   r
   r   )ru   r   r
   rv   )rŽ   r�   r
   r�   )Ú__doc__Ú
__future__r   Úargparser   r   Úpathlibr   Útypingr   r   Úhermes_cli.sizefmtr   rD   r   r   rN   rP   rt   ro   r†   r�   r«   r^   r,   r   ú<module>r²      sG  ððð ð* #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à 9Ð 9Ð 9Ð 9Ð 9Ð 9ðð ð ð ð&ð &ð &ð &ð %ð %ð %ð %ðPð ð ð ð
Cð Cð Cð CðL ð  ð  ð  ðð ð ð ð4ð ð ð ð411ð 11ð 11ð 11ð 11ð 11r,   