
    i!                        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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Dictnintreturnstrc                    d}t          | pd          }|D ]?}|dk     s||d         k    r&|dk    rt          |           d| c S |dd| c S |dz  }@|ddS )	N)BKBMBGBTBr   i   r    z.1fz TB)floatr	   )r   unitssizeunits       ;/home/piyush/.hermes/hermes-agent/hermes_cli/checkpoints.py
_fmt_bytesr      s    )Ea==D  $;;$%)++s{{d)),,d,,,,,''''''''    tsr   c                    	 t          j        t          |                                         d          S # t          t
          f$ r Y dS w xY w)Nz%Y-%m-%d %H:%M   —)r   fromtimestampr   strftime	TypeError
ValueError)r   s    r   _fmt_tsr"   +   sT    %eBii0099:JKKKz"   uu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 agoiQ zh agozd ago)timer   r    r!   r	   )r   ages     r   _fmt_ager(   2   s    ikkE"II%z"   uu
Qwwu
Rxxc((!!!!
TzzcBh--&&&&
U{{cDj//((((#+%%%%s   #& ;;argsargparse.Namespacec                   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          }|rt                       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           }|rt                       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>O   s    quu\**/a r   T)keyreverse  WORKDIRz<60COMMITSz>7z
LAST TOUCHz>12z  STATElimit   workdirz	(unknown)r%   u   …iexistsliveorphancommitsr4   legacy_archiveszLegacy archives (z):c                .    |                      dd          S )Nmtimer   r5   )as    r   r8   zcmd_status.<locals>.<lambda>c   s    w1B1B r   name<40
size_bytes>10z+Clear with: hermes checkpoints clear-legacy)
tools.checkpoint_managerr,   printr   sortedhasattrr>   r6   lenr(   )r)   r,   infor-   r2   r7   wdrA   staterD   lastlegacyarchs                r   
cmd_statusrX   B   s   555555<>>D<D	
$d
$
$%%%	
Dj.@)ABB
D
DEEE	
Dj.@)ABB
D
DEEE	
Ej.A)BCC
E
EFFF	
5d?3
5
5666Z00  H
  DM9MMMIMMMLMMMMNNNW'$*@*@WTZWDJJUWWX 	D 	DAy!!0[B2ww||RX%UU8__F$2FF(EeeIq))GAEE,//00DBrBBBBBBtBBB5BBCCCCXX',,F =1#f++1112226'B'BDQQQ 	Q 	QDOtF|OOO:d<6H+I+IOOOPPPP;<<<1r   c                     t          |           S )N)rX   )r)   s    r   cmd_listrZ   j   s    dr   c                   ddl m} | j        }| j        }t	          d           t	          d|            t	          d| j                     t	          d|            t	                        ||| j         |          }t	          d|d	                     t	          d
|d                     t	          d|d                     t	          d|d                     t	          dt          |d                               dS )Nr   )prune_checkpointsu   Pruning checkpoint store…z  retention_days:    z  delete_orphans:    z  max_total_size_mb: )retention_daysdelete_orphansmax_total_size_mbzScanned:         scannedzDeleted orphan:  deleted_orphanzDeleted stale:   deleted_stalezErrors:          errorszBytes reclaimed: bytes_freed)rM   r\   r]   max_size_mbrN   keep_orphansr   )r)   r\   r]   re   results        r   	cmd_prunerh   o   sI   ::::::(N"K	
'(((	
2.
2
2333	
9d&7"7
9
9:::	
/+
/
/000	GGG%,,%  F
 

1fY/
1
1222	
8f%56
8
8999	
7f_5
7
7888	
0fX.
0
0111	
Aj)>??
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KeyboardInterruptrN   )ri   resps     r   _confirmrt      su    ((())//117799'(   uu <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:    r1   z  legacy dirs: rE   z?All /rollback history for every working directory will be lost.zProceed?Aborted.   deletedzCleared. Reclaimed rd   .z+Could not clear checkpoint base (see logs).   )rM   rv   rw   r,   r   rA   rN   r   rQ   r6   forcert   )r)   rv   rw   r,   rR   rg   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	
JDL
J
JKKK	
BJt,>'?@@
B
BCCC	
3D1
3
3444	
BC):B ? ?@@
B
BCCC	GGG	
KLLL: hz22 jqY[[Fi HJvm/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,   rE   zNo legacy archives to clear.c              3  B   K   | ]}|                     d d          V  dS )rK   r   Nr5   ).0rH   s     r   	<genexpr>z#cmd_clear_legacy.<locals>.<genexpr>   s0      771lA&&777777r   zFound z legacy archive(s), total :r;   rI   rJ   rK   rL   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?rx   ry   zDeleted rz   z archive(s), reclaimed rd   r{   )
rM   r   r,   r6   rN   sumrQ   r   r}   rt   )r)   r   r,   rR   rV   totalrW   rg   s           r   cmd_clear_legacyr      s   CCCCCCCC<>>DXX',,F ,---q7777777E	
N3v;;
N
N*U:K:K
N
N
NOOO M MK4<KKKz$|2D'E'EKKKLLLL	GGG	
MNNN	
KLLL	
5666: h'DEE jq\^^F	
cVI&
c
cz&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           |                     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--limitr?   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   clearz9Delete the entire checkpoint base (all /rollback history)z-fz--forcezSkip confirmation promptzclear-legacyz7Delete only the legacy-<ts>/ archives from v1 migrationN)
set_defaultsrX   add_subparsers
add_parseradd_argumentr	   rZ   rh   r~   r   )r   subsp_statusp_listp_prunep_clearp_legacys          r   register_clir      s\   
Z(((  &;Y OODH   H )#rB  D D Dz***__!   F 	R888
X&&&oo?   G +#q_  a a asCS  T T T ),U  W W Wi(((ooH   G y8  : : :i(((F   H $	,9  ; ; ;/00000r   )r   r	   r
   r   )r   r   r
   r   )r)   r*   r
   r	   )ri   r   r
   rj   )r   r   r
   r   )__doc__
__future__r   argparser&   r   pathlibr   typingr   r   r   r"   r(   rX   rZ   rh   rt   r~   r   r    r   r   <module>r      sD   * # " " " " "                      	 	 	 	   & & & & % % % %P   
   2          4   4/1 /1 /1 /1 /1 /1r   