
    PmjŸ                     \    d Z ddlZddlZddlmZ d Zd Zd Zd Zd Z	d	e
d
efdZddZdS )uR  ``hermes sessions`` command — extracted from ``hermes_cli/main.py``.

Mechanical move (main.py decomposition): ``cmd_sessions`` was a ``def`` nested
inside ``main()``'s body; its dispatch on ``args.sessions_action`` is lifted
byte-identical. A symtable/AST closure check found exactly two free variables:

* ``_confirm_prompt`` — a sibling nested def with zero captures of its own;
  moved here to module level, byte-identical.
* ``sessions_parser`` — a ``main()``-local (the argparse subparser, used only
  for ``sessions_parser.print_help()`` in the fallthrough branch). It is
  threaded as a keyword parameter via ``functools.partial`` at the
  ``set_defaults(func=...)`` wiring site in ``main()``.

Helpers that stay in ``hermes_cli.main`` (``get_hermes_home``,
``_relative_time``, ``_session_browse_picker``, ``_size_delta_label``) are
delegated through call-time wrappers below so existing test monkeypatches on
``hermes_cli.main.<name>`` keep reaching this code path, and so imports stay
one-way (main.py imports this module; the reverse happens only lazily at call
time — no import cycle).
    N)Pathc                      ddl m}  | S )zFLazy ``hermes_cli.main`` reference (call-time, keeps patches working).r   main)
hermes_clir   r   s    =/home/thesage/.hermes/hermes-agent/hermes_cli/sessions_cmd.py_mr	      s    K    c                  B    t                                                      S N)r	   get_hermes_home r
   r   r   r   "   s    44!!!r
   c                 D    t                                          |           S r   )r	   _relative_time)tss    r   r   r   &   s    44r"""r
   c                 D    t                                          |           S r   )r	   _session_browse_picker)sessionss    r   r   r   *   s    44&&x000r
   c                 D    t                                          |           S r   )r	   _size_delta_label)saved_mbs    r   r   r   .   s    44!!(+++r
   promptreturnc                     	 t          |                                                                           dv S # t          t          f$ r Y dS w xY w)z?Prompt for y/N confirmation, safe against non-TTY environments.>   yyesF)inputstriplowerEOFErrorKeyboardInterrupt)r   s    r   _confirm_promptr"   2   sX    V}}""$$**,,<<'(   uus   47 AAc                 \M   yz{|}~ dd l } j        }|dk    rddlm}m}m} |}|                                st          d| d           d S  ||          }|t          d| d           d S t          d| d	|            t           d
d          rd S t          d            ||t           dd                     }	|		                    d          r|		                    d          rt          d|	d                     t          d|		                    d                      	 ddlm
}
  |
            j                            d                                          d         }t          d| d           n# t          $ r t          d           Y nw xY wt          d|		                    d                      |		                    d          rt          d|	d                     t          d           t          d           t          d           |		                    d          p|}t          d| d            t          d!           t          d"           t          d#           t          d| d            t          d$           d S |d%k    rdd l}dd&lm}m}m}m}  j        }t           d'd           }t-          t           d(d                    }t-          t           d)d                    }t           d*d           }|r|t          d+           d,S |r|rt          d-           d,S |s|t          d.           d,S |s||                    |j        d/z             }|Et2          j                            |                                          rt          d0|            d,S 	 |r ||t           d1d           2          }	n]d3d ifd4}t          d5            |||t           d1d           t           d6d7          ||8          }	d3         t                       nA# |t:          |j        f$ r,}t          d9|            t          d:           Y d }~d;S d }~ww xY w|R	  |||	          }n1# t>          t:          f$ r}t          d<|            Y d }~d;S d }~ww xY wt          d=|            n%t          |                     |	d,d>?                     |r|		                    d@          rdnd;S |		                    dA          r2t          dB|            t          dC           t          dD           dS |r|		                    dE          r|		                    dFi           	                    dGi           }t          dH|            t          dItC          |	                    dJ          pd          dKdLtC          |	                    dM          pd          dKdN           t          dC           t          dO           dS t          dP           t          dQ           d;S 	 ddlm
}
  |
            n*# t          $ r}t          dR|            Y d }~d S d }~ww xY wt           dSd           }|rd ndTg}|dUk    r4ddVlm"} #                     j        | j$        W          }t           dXd           pd%                                }|r(|&                                {{}fdYyyfdZ|D             }|st          d[           d S }fd\} t-          |          ptO          }fd]|D                       }!tO          d^ |D                       }"|!r+|"r-t          d_d`dadbdcdadddedadf            t          dg           n0t          dhdidadbdcdadddedadjdkdadf 	           t          dl           |D ]}#tQ          |#	                    dm                    }$ | |#          d dn         }%|"rC|#	                    do          pdpd dq         }&t          |&d`da|%dcda|$deda|#dr                     ||#	                    dsd          d dt         }'t          |'dida|%dcda|$deda|#dS         dkda|#dr          	           d S |"r-t          d_dudadhdvdadddedadf            t          dg           n,t          dhdwdadddedadjdkdadf            t          dx           |D ]}#tQ          |#	                    dm                    }$|"r|#	                    dsd          d dy         n|#	                    dsd          d dz         }'|"rE|#	                    do          pdpd d{         }&|#dr         }(t          |&duda|'dvda|$deda|(            |#dr         }(t          |'dwda|$deda|#dS         dkda|(            Րn|d|k    rdd}l)m*})m+ d~}*tO           fd|*D                       }+d |+r<	  |)           n*# tX          $ r}t          d|            Y d }~d S d }~ww xY wd d<    fd|| fd},t           dd           rC j-        dvrt          d           d S ddl.m/}-m0}.  |,            }|1                                 d S  |.| j-        dk    rdnd j2                  }/ j3        r j3        dk    r5th          j5        6                    |/           1                                 d S to           j3        dd          5 }0|06                    |/           d d d            n# 1 swxY w Y    |-| j2                  \  }1}2|1d;k    rdnd}3t          d|1 da|2 |3 d j3                    1                                 d S  j-        dk    r j3        r j3        dk    rt          d           d S ddl8m9}4m:}5  |,            }|1                                 d S tw          |          d;k    r |4|d                   }6n |5|          }6to           j3        dd          5 }0|06                    |6           d d d            n# 1 swxY w Y   tw          |          d;k    rdnd}3t          dtw          |           d|3 d j3         d           1                                 d S  j-        dk    rt           dd           r%t          d           1                                 d S  j<        s_s]#                    d;d>          }7|7r|7d         	                    dr          nd s%t          d           1                                 d S r>=                              s)t          d d           1                                 d S ddl>m?}8m@mA}9 t           dd           t           dd          rs%t          d           1                                 d S =                              }:1                                  |9|:dt           dd                     };t          |;           d S  fd}< |<            }=|=1                                 d S fd}>	 tw          |=          d;k    r |>|=d                   }?|?s/t          d|=d          d           1                                 d S  j3        r j3        dk    r!th          j5        6                    |?           nto           j3        dd          5 }0|06                    |?           d d d            n# 1 swxY w Y   t          d j3                    n j3        r1 j3        dk    r&t           j3                                                  nt                      dz  }@|@D                    d>d>           d}A|=D ]2}( |>|(          }?|?s|@|( dz  E                    |?d           |Ad;z  }A3t          d|A d|@            n# |8$ r t          d           Y nw xY w1                                 d S  j-        dk    r# j3        st          d           d S  j<        r=                     j<                  }B|Bst          d j<         d           d S  |F                    |B                    }C|Cst          d j<         d           d S |                     |Cd          dz   }D j3        dk    r!th          j5        6                    |D           nKto           j3        dd          5 }0|06                    |D           d d d            n# 1 swxY w Y   t          d j3                    nr jG        d[i }E jH        rt          dtw          |E           d            d           |Ed d         D ]>}Ft          d|F	                    dr           d|F	                    dSd                      ?tw          |E          dk    r#t          dtw          |E          dz
   d           d S d fd|ED             D             }n. jH        rt          d           d S I                    d           } j3        dk    rF|D ]B}#th          j5        6                    |                      ||#          d          dz              Cnto           j3        dd          5 }0|D ]8}#|06                    |                      ||#          d          dz              9	 d d d            n# 1 swxY w Y   t          dtw          |           d j3                    d S ddlJmK~mL}GmM  j3        dk    r%t          d           1                                 d S  j3        r&t           j3                                                  nt                      dz  dddt          dt,          f|~ fdÄ}H jO        r, jP        s%t          dĦ           1                                 d S  jO        r, j<        s%t          dŦ           1                                 d S t           ddǦ          dk    }I j<        r~=                     j<                  }B|Bs.t          d j<         d           1                                 d S |Bg}J jO        rQ                    |B          }Jg }K|JD ]}L	  |H|L|L|Bk    o|I          \  }C}Mn@# t>          $ r3}t          d| dʝ           1                                 Y d }~ d S d }~ww xY w|Cr|Ms*t          d|L d˝           1                                  d S |KR                    |C|Mf           t          d̄ |KD                       }N|Nd;k    rdnd}3tw          |K          d;k    r%t          d|N d|3 d|Kd         d;                     n(t          dtw          |K           d|N d|3 dω             jO        r|KD ]U\  }C}M |G|M|C          \  }O}|Os?t          d|C	                    dr           d|            1                                  d S Vt                      dJz  }PT                    |B|P|JӦ          r=tw          |J          d;z
  }Q|Qsdnd|Q d|Qd;k    rdnd }Rt          d|B d|R d؝           nt          d|B dڝ           1                                 d S s%t          dۦ           1                                 d S  jG        d[i }E jH        rt          dtw          |E           d            d           |Ed d         D ]>}Ft          d|F	                    dr           d|F	                    dSd                      ?tw          |E          dk    r#t          dtw          |E          dz
   d           1                                 d S d}A|ED ]M}F	  |H|Fdr         |I          \  }C}Mn*# t>          $ r}t          d| dʝ           Y d }~<d }~ww xY w|Cr|Mr|Ad;z  }ANt          d|A d݉            n|dk    r=                     j<                  }B|Bst          d j<         d           d S  jP        s$t          d|B d          st          d           d S t                      dJz  }PT                    |B|P          rt          d|B d           nlt          d j<         d           nR|dv rddl)m*})m+mV}S tO           fddD                       }T|dk    r% jW         jX         jY         jZ        	|Tsd _W        	  |)           n*# tX          $ r}t          d|            Y d }~d S d }~ww xY w|dk    r<tO          d [                                D                       st          d           d S |dk    rt           dd          rd ndd<   ndd<    jG        d[i }E|dk    rdnd}U|Est          d            d           d S |Ed         	                    dm          }V|Ed         	                    dm          }Wd |S|V           d |S|W           }X jH        s jP        sh jH        r|En	|Ed d         }Yt          tw          |E           d            d|X d           |YD ]}#|#	                    do          pdd dt         }&|#	                    d          pd\                    d          d         d d         }Zt          d|#dr          d |S|#	                    dm                    dda|#dS         dda|Zdda|#d         dd |&            tw          |E          tw          |Y          k    r1t          dtw          |E          tw          |Y          z
   d            jH        rt          d|dk    rdnd d؝           d S  jP        s8t          |U dtw          |E           d|X d          st          d           d S |dk    r9t                      dJz  }P j]        d[d|Pi}1t          d|1 d           	n j^        d[i }1t          d	|1 d
           	n|dk    r=                     j<                  }B|Bst          d j<         d           d S da_                     j`                  }&	 a                    |B|&          rt          d|B d|&            nt          d j<         d           	n# tX          $ r}t          d|            Y d }~nd }~ww xY w|dk    r7ddlbmc}[ ddldme}\ t          d;tC          t           dd          pd                    }]t-          t           dd                    }^dt          dt,          fd}_g                    |]          }E|Est          d           d S t          tw          |E           d|^rdnd d           d}`|ED ]=}F|Fdr          |[|Fd                   pd}ah                              pd}b |\|a|b          }c|cr|c|Fdo         k    rQ |_|c          s!t          d d|Fdo         d|c           }t          d d|Fdo         d|c           |`d;z  }`|^s	 a                    |c           # tX          $ ru i                    |c          }d	 a                    |d           t          d |dd!           n/# tX          $ r"}t          d"|            |`d;z  }`Y d }~nd }~ww xY wY ;w xY w|`st          d#           n|^rt          d$|` d           n|d%k    rt           dd&          pd&}]t           dSd           }|rd ndTg}e#                    ||e|]W          }1                                 |st          d[           d S t          |          }f|fst          d           d S t          d'|f            dd(lkml}g  |gd)|fg           d S |d*k    rFjm        }|                                r#t2          j        n                    |          d+z  nd,}ht          d-           	 o                                }n?# t          $ r2}t          d.|            1                                 Y d }~d S d }~ww xY w|                                r#t2          j        n                    |          d+z  nd,}ip                                }j|j|jd+z  }i|h|iz
  }kt          d/| d0           t          d1|hd2d3|id2d4t          |k           d5           n|d6k    rjm        }r                                s&t          d7           1                                 d S |                                rt2          j        n                    |          nd}l|ld+z  }ht           d8d           }m	 dd ls}n|nt                    |ju                  jv        }on# t          $ r d }oY nw xY w|mr|lntC          |ld9z            }pt          d:|            t          d;|hd2d<           |oht          d=|od+z  d>d?|pd+z  d>d@|mrdAnd d5           |o|pk     r4t                       t          dB           1                                 d S |hd&k    rt          dC           t           dDd          sr	 t          dE          %                                &                                }qn# t          $ r d}qY nw xY w|qdFvr%t          d           1                                 d S dGd izzfdH}rt          dI           	 y                    |r|mJ          }snO# t          $ rB}t          dK|            t          dL           1                                 Y d }~d S d }~ww xY w|s	                    dM          s?t          dN|s	                    dOdP                      1                                 d S |                                r#t2          j        n                    |          d+z  nd,}ip                                }j|j|jd+z  }i|h|iz
  }kt          dQ           t          dR|hd2d3|id2d4t          |k           d5           |s	                    dS          du rt          dT           n|dUk    rމz                                }t{                                }ut          dV|t            t          dW|u            dXD ]6}vz                    |v          }w|wdk    rt          d|v dY|w dZ           7jm        }|                                r:t2          j        n                    |          d+z  }xt          d1|xd2d<           n||                                 1                                 d S (\  Nr   repair)DEFAULT_DB_PATH_db_opens_cleanlyrepair_state_db_schemazNo session database at z (nothing to repair).u   ✓ u$    opens cleanly — no repair needed.u   ✗ z does not open cleanly: 
check_onlyFu*   Repairing (a backup copy is made first)…	no_backup)backuprepairedbackup_pathz
  backup: z  strategy: strategy)	SessionDBzSELECT COUNT(*) FROM sessionsu   ✓ Repaired — z sessions recovered.u   ✓ Repaired.u   ✗ Repair failed: errorz  A backup is preserved at: z3  Keep state.db and the backup; do not delete them. u=     Next step — offline recovery (never modifies the source):z%    hermes sessions recover --source z \z        --inspect-onlyz:  If that reports the data is recoverable, rebuild it intoz4  a NEW database (the active one is left untouched):z#        --output recovered-state.dbrecover)SessionRecoveryErrorinspect_session_databaserecover_session_databasewrite_recovery_reportoutputinspect_onlyallow_partialreportz3Error: --output cannot be used with --inspect-only.   z:Error: --allow-partial cannot be used with --inspect-only.z:Error: --output is required unless --inspect-only is used.z.recovery.jsonz.Error: refusing to overwrite existing report: work_dir)r;   tablec                    |                      d          }t          |                      d          pd          }|                      d          }|d         k    r1d         t                       t          d| ddd	           |d<   |d
t          |          dnd}t          d| d|d| dd	           d S )Nr<   copied_rowsr   source_rows  : r0   Tendflush/,z  )getintprint)infor<   copiedtotalsuffixlast_progresss        r   _recovery_progressz(cmd_sessions.<locals>._recovery_progress   s     HHW--E -!8!8!=A>>F HH]33Eg 666(1=!GGGn5nnn"DAAAA16g.383D/U////"F<<<&<<F<<"DQQQQQQr
   u8   Recovering canonical session data into a new database…
chunk_sizei  )r;   rP   progress_cbr8   z Error: session recovery failed: z9The supplied source database was not replaced or deleted.   z(Error: could not write recovery report: zRecovery report: T)indent	sort_keysrecoverablecompleteu$   ✓ Recovered database verified at: z.  The active session database was not changed.z9  Review the JSON report before installing this database.verifiedverificationtable_countsu)   ✓ Partial recovery output verified at: z  Recovered r   rF   z sessions and messagesz
 messages.zq  This output is incomplete. Review every skipped range and orphan count in the JSON report before installing it.u:   ✗ Recovery output did not pass every verification check.zG  Do not install it. Review the JSON report for partial data or errors.z(Error: Could not open session database: sourcetoollist)workspace_key)r[   exclude_sourceslimit	workspacec                      |           pd                                 }t          |          o9|v p5t          j                            |                    d                    k    S )Nr0   /\)r   boolospathbasenamerstrip)skey_needle_ws_keys     r   _in_workspacez#cmd_sessions.<locals>._in_workspace   sa    wqzz'R..00Cyy sNTg1A1A#**UBSBS1T1T&Tr
   c                 *    g | ]} |          |S r   r   ).0ri   rm   s     r   
<listcomp>z cmd_sessions.<locals>.<listcomp>  s(    @@@a}}Q/?/?@@@@r
   zNo sessions found.c                      |           }|r4t           j                            |                    d                    p|ndS )Nrc      —)re   rf   rg   rh   )ri   rj   rl   s     r   	_ws_labelzcmd_sessions.<locals>._ws_label  s?    '!**CCFQBG$$SZZ%6%677>3EQr
   c              3   .   K   | ]} |          V  d S r   r   )ro   ri   rl   s     r   	<genexpr>zcmd_sessions.<locals>.<genexpr>  s+      (F(F(F(F(F(F(F(Fr
   c              3   @   K   | ]}|                     d           V  dS )titleN)rG   ro   ri   s     r   ru   zcmd_sessions.<locals>.<genexpr>  s,      ::Aw::::::r
   Titlez<28 	Workspacez<18zLast Activez<13IDuJ  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────Previewz<38Srcz<6u,  ────────────────────────────────────────────────────────────────────────────────────────────────────last_active   rw   rr      idpreview$   z<32z<40z<50u  ───────────────────────────────────────────────────────────────────────────────────────────────&   0      export)build_prune_filtersdescribe_filters)
older_than
newer_thanbeforeafterr[   rw   
end_reasoncwdmin_messagesmax_messagesmodelprovideruserchat_id	chat_typebranch
min_tokens
max_tokensmin_costmax_costmin_tool_callsmax_tool_callsc              3   >   K   | ]}t          |d           d uV  d S r   getattrro   aargss     r   ru   zcmd_sessions.<locals>.<genexpr>G  sE       
 
34GD!T""$.
 
 
 
 
 
r
   zError: archivedc                 <    j         r| | S ddlm}  ||           S )Nr   )redact_session_data)redacthermes_cli.session_export_mdr   )datar   r   s     r   _redactzcmd_sessions.<locals>._redactT  s9    ; $,HHHHHH&&t,,,r
   c            
         j         r[                    j                   } | r                     |                     nd}|st          dj          d           dS |gS r j        di }j        rt          dt          |           d            d           |dd         D ]>}t          d|                    d	           d|                    d
d                      ?t          |          dk    r#t          dt          |          dz
   d           dS d fd|D             D             S j        rt          d           dS fd                    d          D             S )zResolve --session-id / filters / bare export into a list
            of redacted session dicts, or None after printing an error.N	Session '' not found.Would export  session(s) ().d   r@   r   r[   r0     ...  morec                     g | ]}||S r   r   rx   s     r   rp   z;cmd_sessions.<locals>._collect_sessions.<locals>.<listcomp>q  s0          r
   c              3   `   K   | ](}                      |d                              V  )dS r   Nexport_session)ro   rowr   dbs     r   ru   z:cmd_sessions.<locals>._collect_sessions.<locals>.<genexpr>s  sP        BE 1 1#d) < <==     r
   '--dry-run requires at least one filter.c                 &    g | ]} |          S r   r   )ro   ri   r   s     r   rp   z;cmd_sessions.<locals>._collect_sessions.<locals>.<listcomp>{  s!    CCC1GGAJJCCCr
   r[   r   )	
session_idresolve_session_idr   rI   list_prune_candidatesdry_runlenrG   
export_all)	resolvedr   
candidatesr   r   r   r   r   filterss	       r   _collect_sessionsz'cmd_sessions.<locals>._collect_sessions[  s     00AA?GQwwr00::;;;T  CdoCCCDDD4v 5R5@@@@
< 	 :J : :,,W55: : :    *$3$/ M MK3774==KKCGGHb4I4IKKLLLL:,,Cs:'<CCCDDD4     IS      | ?@@@tCCCCT(B(BCCCCr
   only)jsonlmdz2--only user-prompts supports --format jsonl or md.)export_record_countrender_sessions_exportr   markdownr   )fmtr   -wzutf-8)encoding)r   ri   z	Exported z to htmlz)HTML export requires an output file path.)generate_html_export"generate_multi_session_html_exportz sessionz (HTML)trace)r`   order_by_last_activez.No session found to export. Pass --session-id.r   r   )TraceRedactionErrorbuild_trace_jsonlupload_session_trace	no_redactuploadzY--upload exports one session: pass --session-id (or drop filters to use the most recent).public)r   r   privatec            
         r                               gS  j        di } j        rt          dt	          |            d            d           | d d         D ]>}t          d|                    d           d|                    dd                      ?t	          |           dk    r#t          d	t	          |           dz
   d
           d S d | D             S )Nr   r   r   r   r@   r   r[   r0   r   r   c                     g | ]
}|d          S )r   r   )ro   r   s     r   rp   z4cmd_sessions.<locals>._trace_ids.<locals>.<listcomp>  s    888cD	888r
   r   )r   r   r   rI   r   rG   )r   r   r   r   r   r   r   s     r   
_trace_idsz cmd_sessions.<locals>._trace_ids  s/    ?11*==>>5R5@@@@
< 	 :J : :,,W55: : :    *$3$/ M MK3774==KKCGGHb4I4IKKLLLL:,,Cs:'<CCCDDD488Z8888r
   c                                          |           pi }                    |           }|sd S  || |                    d          pdd          S )Nr   r0   )r   r   r   r   )get_sessionget_messages_as_conversationrG   )sidmetarZ   r   r   redact_traces      r   _render_tracez#cmd_sessions.<locals>._render_trace  ss    ~~c**0b::3??  4(("((7++1r'   r
   z%No transcript to export for session 'z'.zExported 1 session trace to zsession-exports)parentsexist_okz.trace.jsonlz session trace(s) to z>Redaction failed; refusing to export unredacted trace content.z8JSONL export requires an output path (use - for stdout).)ensure_ascii
zExported 1 session to r   r   r   r   r@   r   r   c                     g | ]}||S r   r   rx   s     r   rp   z cmd_sessions.<locals>.<listcomp>N  s0                 r
   c              3   N   K   | ]}                     |d                    V   dS r   r   )ro   r   r   s     r   ru   zcmd_sessions.<locals>.<genexpr>P  sF       " "=@B--c$i88" " " " " "r
   r   r   z sessions to )append_manifest_entryverify_export_filewrite_session_markdownzSMarkdown/QMD export writes files; stdout (-) is only supported with --format jsonl.)include_lineager   r   c                    |r                     |           n                    |           }|sdS  |          } 	|j        j                  } ||j                   ||fS )N)NN)r   force)r   )export_session_lineager   formatr   )
r   r   r   rf   r   r   r   r   
output_dirr   s
       r   _export_onez!cmd_sessions.<locals>._export_onev  s     #3))*555&&z22 
  "!z74==D))Kj	  D "!*dDdkJJJJ:r
   z'--delete-after-verified requires --yes.z<--delete-after-verified is only supported with --session-id.lineagesinglelogicalzExport already exists: z. Pass --force to overwrite.z1' disappeared during export; nothing was deleted.c              3   d   K   | ]+\  }}t          |                    d           pg           V  ,dS )rZ   N)r   rG   )ro   r   _paths      r   ru   zcmd_sessions.<locals>.<genexpr>  sS          D% DHHZ((.B//           r
   zExported 1 session (z messagez) to z sessions (z2Export verification failed; not deleting session 'z': )sessions_direxpected_delete_idsz and z delegate sessionzDeleted exported session ''.zExported, but session 'z3' was not deleted because its delegate set changed.zzRefusing bulk export without a filter. Pass --session-id or at least one filter (e.g. --older-than 90, --source telegram).zSkipping existing export: z session(s) to deletezDelete session 'z' and all its messages? [y/N] z
Cancelled.)r   zDeleted session ')prunearchive)r   r   format_epochc              3   >   K   | ]}t          |d           d uV  d S r   r   r   s     r   ru   zcmd_sessions.<locals>.<genexpr>*  sH       	 
 	 
 D!T""$.	 
 	 
 	 
 	 
 	 
 	 
r
   )r[   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  90r  c              3   ,   K   | ]\  }}|d k    |V  dS )older_than_daysNr   )ro   kvs      r   ru   zcmd_sessions.<locals>.<genexpr>D  s:       +
 +
!QQ2C-C-CA-C-C-C-C+
 +
r
   zvRefusing to archive every ended session: pass at least one filter (e.g. --newer-than 5h, --source cli, --title codex).include_archivedDeleteArchivezNo sessions match (zoldest activity z, newest activity    z session(s) match (z; z):r   rE      z<17z<10z<24message_countz>4z msgs  u
     … and u   Dry run — nothing deletedz these z	)? [y/N] r   zPruned z session(s).z	Archived zV session(s). They're hidden from listings but fully recoverable (nothing was deleted).renamez' renamed to: zretitle-skills)describe_skill_invocation)generate_titler`      apply	candidater   c                 T    t          |           o| d                                         S )u  Reject a candidate that isn't a title at all.

            An auxiliary model occasionally answers the prompt instead of
            titling it and echoes the assistant's output ('$ df -h /'). The
            live path has no alternative and takes what it gets, but this is
            a REPAIR — replacing a serviceable title with command output
            would make things worse, so keep the old one.
            r   )rd   isalnum)r  s    r   _is_titlelikez#cmd_sessions.<locals>._is_titlelike  s%     	??=y|';';'='==r
   )r`   z1No sessions were titled from a /skill invocation.z  session(s) opened with a /skillu$    (dry run — pass --apply to write):contentz

    kept u	    — got z
    u	   
    → z    (renamed to u    — title was taken)z    skipped: z2  every title already reflects the user's request.u   ✓ Re-titled browsei  zResuming session: )relaunchz--resumeoptimizei   g        u0   Optimizing session store (FTS merge + VACUUM)…zError: optimization failed: z
Optimized z FTS index(es).zDatabase size: z.1fz MB -> z MB ()zoptimize-storageu@   Search index is already on the compact layout — nothing to do.	no_vacuumg333333?zSearch-index optimization for z  Current database size: z MBz  Free disk: z.0fz MB (need ~z MB to completez incl. VACUUMu   ⚠ Not enough free disk to complete safely. Free up space, or run with --no-vacuum (rebuilds the index but doesn't reclaim space until a later VACUUM).z  This may take a while on a large database. It runs in the foreground with progress below; safe to Ctrl-C and re-run (it resumes).r   zProceed? [y/N] )r   r   phasec                 z   |                      d          }|                      dd          }|dk    rHt          d|dd|                      dd          d	d
|                      dd          d	ddd           n;|d         k    r/dddd                     ||          }t          d| dd           |d<   d S )Nr$  percentr   backfillz  Rebuilding index: 3dz% (indexedrF   rE   rL   r"  r0   TrB   zReclaiming old indexzCompacting database (VACUUM)Done)teardownvacuumdonez
  u   …)rD   )rG   rI   )rJ   r$  pctlabel_lasts       r   	_progresszcmd_sessions.<locals>._progressC  s   HHW%%E((9a((C
"" Ms9 M M((9Q//LM M48HHWQ4G4GLM M MD* * * * * %.((%;#A!') )),UE):):  'U'''t4444"E'NNNr
   u"   Optimizing search-index storage…)rQ   r,  z
Error: optimization failed: z#No data was lost. Re-run to resume.okz
Could not optimize: reasonunknownu   
✓ Search index optimized.z  Database size: vacuumedua     (VACUUM was skipped or failed — run `hermes sessions optimize` later to reclaim freed space.)statszTotal sessions: zTotal messages: )clitelegramdiscordwhatsappslackrA   z	 sessionsr   )}jsonsessions_actionhermes_stater%   r&   r'   existsrI   r   rG   r.   _connexecutefetchone	Exceptionsqlite3hermes_cli.session_recoveryr2   r3   r4   r5   r[   rd   	with_namenamere   rf   lexists
expanduserOSErrorDatabaseErrorFileExistsErrordumpsrH   r^   list_sessions_richr`   r   r   anyr   hermes_cli.session_filtersr   r   
ValueErrorr   hermes_cli.session_exportr   r   closer   r6   sysstdoutwriteopenhermes_cli.session_export_htmlr   r   r   r   r   agent.trace_uploadr   r   r   r   r   mkdir
write_textr   r   r   r   r   r   r   r   strdelete_after_verifiedr   get_session_delete_targetsappendsumdelete_sessionr"   r  r   r   r   r   itemssplitprune_sessionsarchive_sessionsjoinrw   set_session_titleagent.skill_commandsr  agent.title_generatorr  maxlist_skill_scaffolded_sessionsget_first_assistant_textget_next_title_in_lineager   hermes_cli.relaunchr   db_pathgetsizer,  logical_size_bytesr   fts_optimize_availableshutil
disk_usageparentfreer   r    optimize_fts_storagesession_countr  
print_help)r   sessions_parser_jsonactionr%   r&   r'   ro  r3  r9   r.   nsource_hint_sqlite3r2   r3   r4   r5   r[   r6   r7   r8   report_pathrO   excwritten_reportcountse_source_excluder   
_ws_filterrs   has_ws
has_titlesri   r   wsrw   r   r   r   _filter_arg_names_any_filtersr   r   r   renderedfcountnounrM   r   r   r  rowsr   r   r   statusr   idsr   r   out_direxportedresolved_session_idr   liner   r   r   r   lineage_is_logicaldelete_target_idsexported_items	target_idexported_pathr  r2  r   delegate_countdelegate_suffixr  _non_time_filtersverb_oldest_newest_spanshownr   r  r  r`   apply_changesr  changedtypedfirst_reply	new_titlededuped_browse_excludeselected_idr   	before_mbafter_mblogical_aftersavedbefore_bytes	do_vacuum_shutil
free_bytes
need_bytesrespr1  resultrL   msgssrccsize_mbrm   r0  rk   r   rl   r   r   r   r   r   rN   r   r   r   r   s   `                                                                                                                        @@@@@@@@@@@@@@@r   cmd_sessionsr  :   sB5   !F 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 "~~ 	JGJJJKKKF""7++>FFFFGGGF>W>>f>>???4u-- 	F:;;;''k5 A AA
 
 
 ::j!! 	9zz-(( <:6-#8::;;;9J!7!799:::'222222IKK%--3 (**Q  A!AAABBBB ' ' 'o&&&&&' =

7(;(;==>>>zz-(( NLVM5JLLMMMGHHH
 "IIIQRRR **]33>wKJ+JJJKKK*+++NOOOHIIIJ+JJJKKK7888""""	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 x..GD.%@@AAWT?EBBCCdHd33 	F.GHHH1 	M 	NOOO1 	NOOO1 	K 3 **6;9I+IJJK# 6 6 8 899 $ P;PPQQQ1#	 11$T:t<<  
 ")$
R 
R 
R 
R 
R PQQQ11$T:t<<&t\4@@ 2"/   !)5GGG$gx/EF 	 	 	:S::;;;MNNN11111	
 "!6!6{F!K!K#W-   FFFGGGqqqqq 6n667777%++fQ$+??@@@ 	9

=11811q8::j!! 	AAABBBBCCCMNNN1 	VZZ
33 	ZZ3377KKFFfFFGGGBvzz*--233EB Bvzz*--233AB B B  
 BCCCL   1JKKKWXXXq******Y[[   <<<===
 dHd++G,ttVHH999999((;
 ) 
 
 dK66<"CCEE
 		A &&((G      A@@@8@@@H 	&'''F
	R 	R 	R 	R 	R j!!FS(F(F(F(FX(F(F(F%F%F:::::::
 	 #SSS{SSSSSSTSSTTTk""""``````=```u```Z^``aaak""" b b,QUU=-A-ABBYq\\#2#& bUU7^^4ucrc:EUMMMMMM+MMMAdGMMNNNNeeIr223B37GW```2```K```ak```WXY]W^``aaaaF 	WMMM9MMM=MMMtMMNNN+YJJJ]JJJJJJDJJKKK* 	Q 	QA(})=)=>>K /i$$SbS))UU9b))#2#. 
  Qw05#2#6gJJJWJJJ;JJJSJJKKKKgOOO{OOO8OOO#OOPPPP	Q 
8			
 	
 	
 	
 	
 	
 	
 	


  
 
 
 
8I
 
 
 
 
  	'--d33   mmm$$$ #'GJ	- 	- 	- 	- 	- 	D  	D  	D  	D  	D  	D  	D  	D  	DJ 4&& 	{/11JKKK       
 )(**H


--"&+"5"5JJ7Y  H
 ; $+"4"4
  ***


dk3999 "Q!!!" " " " " " " " " " " " " " "--hTYGGGKE4 A::RR3FEeEEdEFEEEEFFFHHJJJF ;&  ; $+"4"4ABBB       
 )(**H


8}}!!..x{;;<<XFFdk3999 !Q   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !x==A--RR3FUc(mmUUVUUUUUVVVHHJJJF
 ;'!!tVT** JKKK


J g ,,14,PP26@T!W[[...D
! JKKKHHJJJF ""7"7
"C"C :*:::;;;


           't[%@@@LtXu-- ! uvvvHHJJJF00<<


--' 'h > >>	   f9 9 9 9 9 9 9 9 9  *,,C{


      Xs88q==)M#a&11E  Pc!fPPPQQQ


; L$+*<*<
((////!$+sWEEE +GGENNN+ + + + + + + + + + + + + + +JT[JJKKKK  ;C+/;#+=+= T[))44666,..1BB 
 MM$M>>> H" & & -c 2 2$ %$ c#7#7#77CC!G D    !ANhNNWNNOOO& X X XVWWWWWXHHJJJF;'!!; PQQQ 6Q&(&;&;DO&L&L#* CdoCCCDDDFwr001DEEFF CdoCCCDDDF{{4e{<<tC;#%%J$$T****dk3AAA &Q& & & & & & & & & & & & & & &@4;@@AAAA :!9!9!D!DG!D!DJ| 	>C
OO > > 0 0 9 9> > >   $.dsd#3 Q QC!"Oswwt}}"O"O"8M8M"O"OPPPPz??S00!"G3z??S+@"G"G"GHHH   " " " "DN" " "     HH | GHHH!}}D}99H;#%%%  
((!KK

KGG$N   
 dk3AAA Q!)  AGG %GGAJJU K Kd R                 
 Oc(mmOO$+OOPPPF	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 ;#ghhhHHJJJF7;{mT$+&&11333HYHY\mHm
DI 	 	 	C 	T 	 	 	 	 	 	 	 	 	 	 	$ % 	dh 	;<<<HHJJJF% 	do 	PQQQHHJJJF$T9h??9L? V	"$"7"7"H"H& ?$/???@@@


!4 5) $&$A$A'% %!  N. = =	*5+!%)<< 3 2	+ + +'D-- '   5! 5 5 5   HHJJJFFFFFF  = /I / / /   HHJJJFF%%t]&;<<<<    #1       M )A--RR3F>""a''1= 1 1& 1 1(+A.1 1   
 IN 3 3 I I%I I/5I I<FI I   ) +9  'D-!3!3M4!H!HJB D(,D D;AD D   


  /00:=$$'!-(9 %   
 &)):%;%;a%?N  .@@^ @ @!/1!4!422#@ @ $ .5H . .*. . .   
 H2E H H H   HHJJJF 	Q   HHJJJF-R-8888
< 
	2J 2 2$$W--2 2 2   "$3$' E EC3774==CCCGGHb,A,ACCDDDD:$$;s:4;;;<<<HHJJJF 
	 
	C&1kI$6' ' '#mm #   R1RRRSSS   A?(??:??@@@@	8		 33DODD" 	;do;;;<<<Fx 	"V#6VVV   l###&((:50|LL 	==&9===>>>>;do;;;<<<<	'	'	'	
 	
 	
 	
 	
 	
 	
 	
 	
 	
   	 
 	 
 	 
 	 
	 
 	 
 	 
 	
 	
 g''#
"% # #DO	))$//GG 	 	 	-A--   FFFFF	 Ys +
 +
!--//+
 +
 +
 (
 (
 N   F W&8%@@Ke J #(GJ-R-8888
!W,,xx) 	E(8(8(A(AEEEFFFF
 Q-##M22R.$$]337||G44 7 7+|G447 7 	
 < 	tx 	"&,CJJJssOEz?? ; ;$$W--; ;16; ; ;     w-2ss3w.355c::2>ssC=4 = =LL}1E1E$F$FM = ={5= =).5= =)<= =5:= =   
 :U++F3z??SZZ#?FFFGGG| ^&G:K:KYYQ[^^^___x 	"NNJNNeNNN   l###W*,,z9L%B%KK<K7KKE/E///0000'B'22'22E?E ? ? ?   
 
8		 33DODD" 	;do;;;<<<F$$	!##$7?? AL"5LLULLMMMM?$/???@@@ 	! 	! 	!-A--        	! 
#	#	#BBBBBB888888As74#66=#>>??WT7E::;;		>S 		>T 		> 		> 		> 		> 66U6CC
 	EFFFF: R R"Nrr(NR R R	
 	
 	
  	! 	!CTJ--c)n==CE55jAAGRK&uk::I 	S\ 9 9 =++ X:XX#g,XX9XXYYYPzPPWPP9PPQQQqLG  !$$Z;;;; 
! 
! 
! 66yAA!((W===MWMMMNNNN! ! ! !-!--...qLGGGGGG!
!  	:FGGGG 	:87888999	8		gs++2sx.."(6$$vh((?% ) 
 
 	


 	&'''F,X66 	,F 	0;00111000000*k*+++	:		* ~~BGOOG$$44 	
 	@AAA	 		AA 	 	 	444555HHJJJFFFFF	 ~~BGOOG$$44 	 --//$$4HH$-1---...,iF , ,HF , ,!%((, , ,	
 	
 	
 	

 
%	%	%*((** 	TUUUHHJJJF3:>>3C3CJrww/// K0	
  k5999		$$$$ ++GN;;@JJ 	 	 	JJJ	%.K\\Cs8J4K4K
8w88999<)<<<<===! =*	":D = =&)4I= =(19__r= = = > > > J&& I J J J 


s?? ) * * * tUE** 	.//5577==??   <''l###


$	# 	# 	# 	# 	# 	2333	,,%i -  FF  	 	 	61667777888HHJJJFFFFF		
 zz$ 	L6::h	+J+JLLMMMHHJJJF8?8H8HQBGOOG$$44c 	 --//$$4HH$.///,	H , ,hH , ,!%((, , ,	
 	
 	
 ::j!!U** N O O O 
7		  ""!!((()))'''(((F 	0 	0C   ,,A1uu.3..!...///*>> 	6goog..+>G4G4444555 	""$$$HHJJJJJsQ  6AF F'&F'A<Q R!Q>>R	R S'R??SY" "
Z	,ZZ	h 
i&h>>i-mmmq00q47q4AA@. 2A
A@. <}A@. }""A@. %}"&CA@. @.AAAAAEAE9E9AE=F AE=L<AMMAMM AMTAT+T+
AU(T5'AU#U#AU(`&A`=`=
Aa$aAaaAa$fAf( f(
Agf2Ag
g
Agt2AAu9 u9
Av vAvvAv |A|3|3A~2}+A}?}>A~2}?
A~+~	A~&~!A~2~&A~+~+A~2~1A~2C<BD D
BED'BEEBEJ#BJ, J,BJ;J:BJ;N4BO OBOOBOP BP9 P9
BRQ7BR R BRr   )__doc__re   rT  pathlibr   r	   r   r   r   r   r\  rd   r"   r  r   r
   r   <module>r     s    * 
			 



        " " "# # #1 1 1, , ,C D    M M M M M Mr
   