
    `gj!                        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	 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y)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)Anyc                    d}t        | xs d      }|D ]5  }|dk  s||d   k(  r!|dk(  rt        |       d| c S |dd| c S |dz  }7 |ddS )	N)BKBMBGBTBr   i   r    z.1fz TB)floatint)nunitssizeunits       I/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/checkpoints.py
_fmt_bytesr      s~    )Ea=D $;$%)+s{d)AdV,,3Zq'' 3Zs    c                    	 t        j                  t        |             j                  d      S # t        t
        f$ r Y yw xY w)Nz%Y-%m-%d %H:%M   —)r   fromtimestampr   strftime	TypeError
ValueError)tss    r   _fmt_tsr   +   s?    %%eBi099:JKKz" s   ,/ A Ac                   	 t        j                          t        |       z
  }|dk  ry|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 # t        t        f$ r Y yw xY w)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    iikE"I% Qw
Rxc(5!!
TzcBh-&&
U{cDj/"%((#+u%% z" s    A8 8B
	B
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      }|rt                t        dddddddddd       |d t        | d      r| j                  r| j                  nd D ]  }|j                  d      xs d}t        |      dkD  rd|dd  z   }|j                  d       }|rd!nd"}|j                  d#d      }	t        |j                  d$            }
t        d|dd|	dd|
dd|         |j                  d%g       }|rmt                t        d&t        |       d'       t	        |d( d      D ]$  }t        d|d)   d*dt        |d+         d,       & t                t        d-       y).Nr   )store_statusbasezCheckpoint base: zTotal size:      total_size_bytesz  store/         store_size_bytesz  legacy-*       legacy_size_byteszProjects:        project_countprojectsc                ,    | j                  d      xs 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commitsr/   legacy_archiveszLegacy archives (z):c                &    | j                  dd      S )Nmtimer   r0   )as    r   r3   zcmd_status.<locals>.<lambda>c   s    w1B r   name<40
size_bytes>10z+Clear with: hermes checkpoints clear-legacy)
tools.checkpoint_managerr'   printr   sortedhasattrr9   r1   lenr%   )argsr'   infor(   r-   r2   wdr<   stater?   lastlegacyarchs                r   
cmd_statusrT   B   s   5>D<D	dV
$%	j.@)ABC
DE	j.@)ABC
DE	j.A)BCD
EF	d?34
56Z0H
 9S/Ib>L3EWMNW'$*@TZZDJJUWX 	DAy!0[B2w|RX%UU8_F$F(EeeIq)GAEE,/0DBr#hbBtCj5'BC	D XX',F!#f+b126'BDQ 	QDBtF|C(:d<6H+I#*NOP	Q;<r   c                    t        |       S )N)rT   )rM   s    r   cmd_listrV   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                 y)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)rH   rX   rY   max_size_mbrI   keep_orphansr   )rM   rX   rY   ra   results        r   	cmd_prunerd   o   s    :((N""K	
'(	!.!1
23	!d&7&7"7!8
9:	!+
/0	G%,,,%F
 
fY/0
12	f%567
89	f_56
78	fX./
01	j)>?@
ABr   c                    	 t        |  d      j                         j                         }|dv S # t        t        f$ r t                Y yw xY w)Nz [y/N]: F>   yyes)inputstriplowerEOFErrorKeyboardInterruptrI   )promptresps     r   _confirmro      sV    xx()//1779 < '( s   *0 AAc           	        ddl m}m}m}  |       }|d   dk(  r%t	        |      j                         st        d       yt        d|d           t        dt        |d                 t        d|d	           t        d
t        |j                  dg                     t                t        d       | j                  st        d      st        d       y |       }|d   rt        dt        |d          d       yt        d       y)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?Aborted.   deletedzCleared. Reclaimed r`   .z+Could not clear checkpoint base (see logs).   )rH   rq   rr   r'   r   r<   rI   r   rL   r1   forcero   )rM   rq   rr   r'   rN   rc   s         r   	cmd_clearry      s    QQ>D1$T/-B-I-I-KDE	;DL>
JK	OJt,>'?@A
BC	OD12
34	OC):B ?@A
BC	G	
KL::hz2j[Fi#Jvm/D$E#FaHI	
78r   c           
        ddl m}m}  |       }|j                  dg       }|st	        d       yt        d |D              }t	        dt        |       dt        |       d       |D ]$  }t	        d	|d
   dd	t        |d         d       & t	                t	        d       t	        d       t	        d       | j                  st        d      st	        d       y |       }t	        d|d    dt        |d          d       y)Nr   )clear_legacyr'   r@   zNo legacy archives to clear.c              3  @   K   | ]  }|j                  d d        yw)rF   r   Nr0   ).0rC   s     r   	<genexpr>z#cmd_clear_legacy.<locals>.<genexpr>   s     71lA&7s   zFound z legacy archive(s), total :r6   rD   rE   rF   rG   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?rs   rt   zDeleted ru   z archive(s), reclaimed r`   rv   )
rH   r{   r'   r1   rI   sumrL   r   rx   ro   )rM   r{   r'   rN   rR   totalrS   rc   s           r   cmd_clear_legacyr      s   C>DXX',F,-777E	F3v;-9*U:K9LA
NO M4<$Bz$|2D'Ec&JKLM	G	
MN	
KL	
56::h'DEj^F	HVI&''>z&Q^J_?`>aab
cdr   c                2   | j                  t               | j                  dd      }|j                  dd      }|j	                  dt
        d	d
       |j                  t               |j                  dd      }|j	                  dt
        d	       |j                  t               |j                  dd      }|j	                  dt
        dd       |j	                  dt
        dd       |j	                  ddd       |j                  t               |j                  dd      }|j	                  dddd       |j                  t               |j                  d d!      }|j	                  dddd       |j                  t               y")#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_defaultsrT   add_subparsers
add_parseradd_argumentr   rV   rd   ry   r   )parsersubsp_statusp_listp_prunep_clearp_legacys          r   register_clir      s   
Z(  &;Y ODH  H )#rB  Dz*__!  F 	R8
X&oo?  G +#q_  asCS  T ),U  Wi(ooH  G y8  :i(F  H $	,9  ;/0r   )r   r   returnstr)r   r   r   r   )rM   zargparse.Namespacer   r   )rm   r   r   bool)r   zargparse.ArgumentParserr   None)__doc__
__future__r   argparser#   r   pathlibr   typingr   r   r   r%   rT   rV   rd   ro   ry   r   r    r   r   <module>r      sQ   * #     	& %P
2 44/1r   